Qt for Android 外置SD卡写入

洗砚 2020-08-07 06:36:06
Qt 开发的Android App动态设置权限本地可以读写,但是外置的SD卡只能读取无法写入, Qt 5.14.2+ SDK 26.1.1+NDK21.2,手机系统7.0+:

#include <QtAndroid>

bool checkPermission() {
QtAndroid::PermissionResult r = QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
if(r == QtAndroid::PermissionResult::Denied) {
QtAndroid::requestPermissionsSync( QStringList() << "android.permission.WRITE_EXTERNAL_STORAGE" );
r = QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
if(r == QtAndroid::PermissionResult::Denied) {
return false;
}
}
return true;
}

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;

QFile file("/storage/3645-16B6/test.txt");
if(file.exists())
{
if(file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug()<<"requestPermissions ---------------";
}else{
qDebug()<<"requestPermissions --------------- 11111111";
}
}


const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);

return app.exec();
}



AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
...全文
10292 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
洗砚 2020-08-17
  • 打赏
  • 举报
回复
用QtAndroid好像不行,使用了这种方法https://blog.csdn.net/weitao1234/article/details/39302171, java: public static void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } } Qt: QAndroidJniObject::callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "verifyStoragePermissions", "(Landroid/app/Activity;)V", QtAndroid::androidActivity().object<jobject>()); java: public static boolean copyFile(String oldPath$Name, String newPath$Name) { try { File oldFile = new File(oldPath$Name); if (!oldFile.exists()) { return false; } else if (!oldFile.isFile()) { return false; } else if (!oldFile.canRead()) { return false; } FileInputStream fileInputStream = new FileInputStream(oldPath$Name); //读入原文件 FileOutputStream fileOutputStream = new FileOutputStream(newPath$Name); byte[] buffer = new byte[1024]; int byteRead; while ((byteRead = fileInputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, byteRead); } fileInputStream.close(); fileOutputStream.flush(); fileOutputStream.close(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } Qt: QString string = "/storage/3645-16B6/Android/data/an.qt.ExtendsQtWithJava/files/Documents"; QString oldfile = "/storage/emulated/0/DCIM/test.txt"; QString newfile = string+ "/test.txt"; QFile file1(oldfile); QFile file3(string + "/test.txt"); QAndroidJniObject::callStaticMethod<jboolean>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "copyFile", "(Ljava/lang/String;Ljava/lang/String;)Z", QAndroidJniObject::fromString(oldfile).object<jstring>(), QAndroidJniObject::fromString(newfile).object<jstring>()); 上边的路径是正确的,但是我之前的路径:"/storage/3645-16B6/test.txt";所以一直提示没有权限之后找到下边这个连接,才发现我的java代码在外置SD卡下创建了一个包含java包名(“an.qt.ExtendsQtWithJava”)的路径,于是试了下,可以了 https://stackoverflow.com/questions/43349110/android-write-on-external-sd-card-java-io-ioexception-permission-denied

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧