如何从Qt获取Android的<shared-storage>路径?

3
我需要在Google Play控制台上传一个带有我的Qt开发的应用程序的单独扩展文件,它是一个简单的rcc文件。我已经在上传后获得了文件名(在Google控制台页面上显示)。但是,我似乎找不到任何关于如何获取Android文档页中提到的共享存储路径的信息(http://developer.android.com/google/play/expansion-files.html#StorageLocation)。
我遇到了这个问题(How to add android expansion files using Qt),该用户似乎已经解决了这个问题,但并没有提供有关如何获取共享存储路径的详细信息。
3个回答

7
我已经解决了:
我使用Qt rcc工具将包含大文件的qrc转换为二进制,然后使用以下代码调用Qt Android Activity中的适当方法并检索扩展文件的正确路径:
QAndroidJniObject mediaDir = QAndroidJniObject::callStaticObjectMethod("android/os/Environment", "getExternalStorageDirectory", "()Ljava/io/File;");
QAndroidJniObject mediaPath = mediaDir.callObjectMethod( "getAbsolutePath", "()Ljava/lang/String;" );
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
QAndroidJniObject package = activity.callObjectMethod("getPackageName", "()Ljava/lang/String;");

QString dataAbsPath = mediaPath.toString()+"/Android/obb/"+package.toString()+"/yourExpansionFileName.obb";

QAndroidJniEnvironment env; // Don't know what this is for ? 
if (env->ExceptionCheck()) { env->ExceptionClear(); } // Or this...?

bool loadResource = QResource::registerResource(dataAbsPath);

不要忘记在应用程序中添加#include <QAndroidJniEnvironment> (以及在pro文件中添加QT += androidextras),最后将该权限添加到清单中(因为扩展文件位于外部存储器中):
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在加载之前,我没有检查文件是否存在(我测试过的每个设备都可以直接使用),但是Android文档中提到你可能需要手动下载它。此外,上传扩展文件也有一些注意事项,你只能通过第二个APK提交(在Google Play中)添加它们。


1
env对象提供了检查通过JNI调用Java方法时是否发生异常的可能性。您可以检查是否发生了任何异常,然后清除/处理它们。如果您继续而不这样做,您的程序可能会变得不稳定并崩溃(我自己没有遇到过这种情况)。 - uniquenamehere

1
这段代码可能会对你有帮助。
QStringList systemEnvironment = QProcess::systemEnvironment();

寻找

  1. EXTERNAL_STORAGE=/storage/emulated/legacy(内部存储)
  2. EXTERNAL_ADD_STORAGE=/storage/external_SD(外置SD卡1)
  3. SECONDARY_STORAGE=/storage/external_SD(外置SD卡2)
  4. ...

0
这段代码对我很有效:
QString s = QStandardPaths::writableLocation(QStandardPaths::movieLoaction);
QDir MyDir;
s = s + "/MyFolder"
MyDir.mkdir(s);

在您的Android设备上,您必须检查应用程序的存储权限。如果没有添加此权限,请先添加然后再运行该应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接