一、概述
在《Qt for Android 程序实现对手机文件的导入打开和导出保存》一文中,用新建AndroidFileDialog类对于打开华为mate手机文件,但由于无法显示出“文件管理”,所以无法实现文件的导入打开,本文在参考了博客《Qt Android 调用系统文件管理》,后决定按照文中提供的方法通过Qt中嵌入Android的系统Java文件ExtendsQtNative.java和ExtendsQtWithJava.java,再通过Qt调用Java接口函数QAndroidJniObject::callStaticMethod()来调用ExtendsQtWithJava.java和相应的文件管理器Activity(fileManagerActivity),从而打开文件管理,再打开文件的思路来就解决此问题。
二、解决步骤
1、下载博客中的程序文件
https://github.com/dragonfly1208/QtAndroidProjects/tree/AndroidFileManager
2、加载Java文件ExtendsQtNative.java和ExtendsQtWithJava.java
在程序工程文件夹下android中\src\an\qt\extendsQtWithJava复制ExtendsQtNative.java和ExtendsQtWithJava.java文件,并在程序中加载进来。
3、添加 android-support-v4.jar 包
在程序工程文件夹下android中\libs下,复制android-support-v4.jar和android-support-v4.jar.properties两个文件
4、修改AndroidManifest.xml的XML源码中的activity 的android::name
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="an.qt.extendsQtWithJava.ExtendsQtWithJava" android:label="test" android:screenOrientation="unspecified" android:launchMode="singleTop">
将AndroidManifest.xml中原先的 android:name="org.qtproject.qt5.android.bindings.QtActivity"修改。为: android:name="an.qt.extendsQtWithJava.ExtendsQtWithJava",对应于Java文件ExtendsQtWithJava.java的路径。
5、加载filedialogextern.cpp、simpleCustomEvent.cpp、filedialogextern.h和simpleCustomEvent.h文件
复制上述文件到程序工程文件夹下,并且加载到程序中。
6、修改filedialogextern.h和filedialogextern.cpp
由于要获取实现文件路径和文件名,并通过connect将信号中的文件路径和文件名传递到打开文件处理函数中,所以在filedialogextern.h中需要对signals:void accepted()修改为:
signals:
void accepted(QString paths);
在filedialogextern.cpp中修改相应的acceped()函数为accepted(paths.at(0))。
7、在main.c中调用registerNativeMethods()函数
具体是在main.c中分别添加如下两句:
#include "simpleCustomEvent.h"
registerNativeMethods();
如果没有添加,程序运行时,当打开文件程序会崩溃,显示如下错误提示:
LOGCAT: E AndroidRuntime: java.lang.UnsatisfiedLinkError: No implementation found for void an. qt.extendsQtWithJava.ExtendsQtNative.onFileManager(int,java.lang.String[])...
8、文件导入打开按钮槽函数
void NewholeWidget::importBtn_clicked()
{
if(!newholeTedit->toPlainText().isEmpty()) newholeTedit->clear(); //文本框中非空,则清空
FileDialogExtern *myFileDialogExtern=new FileDialogExtern();
myFileDialogExtern->open();
connect(myFileDialogExtern, SIGNAL(accepted(QString)), this,
SLOT(openFileNameReady(QString)));
}
9、文件打开处理函数openFileNameReady()
void NewholeWidget::openFileNameReady(QString filepaths)
{
QString fileName;
int index1=filepaths.lastIndexOf('/');
fileName=filepaths.mid(index1+1); //提取路径中的文件名
newholeTedit->clear(); //清空文本框
bool fileopenflag=false;
if (!fileName.isNull())
{
QFile file(filepaths);
fileopenflag=file.open(QIODevice::ReadOnly|QIODevice::Text);
if(fileopenflag==true)
{
textfiledata=file.readAll(); //读取所有文件内的数据
newholeTedit->insertPlainText(textfiledata); //在文本框内显示
}
}
}
三、运行效果
在华为手机mate30上出现文件管理,点击文件管理,找到相应的txt文件,可以打开,此程序运行在红米Note7手机上也可打开相应的txt文件。