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

Posted

技术标签:

【中文标题】如何从 Qt 获取 android <shared-storage> 路径?【英文标题】:How to get the android <shared-storage> path from Qt? 【发布时间】:2015-08-10 00:11:04 【问题描述】:

我不得不在 Google Play 控制台中使用我的应用(使用 Qt 开发)上传单独的扩展文件。这是一个简单的 rcc 文件。上传后我有文件名(它显示在谷歌控制台页面上)。但我似乎无法在 android 文档页面 (http://developer.android.com/google/play/expansion-files.html#StorageLocation) 上找到有关如何获取共享存储路径(如前所述)的任何信息。

我确实遇到了这个问题 (How to add android expansion files using Qt),用户似乎已经解决了这个问题,但没有提供有关如何获取共享存储路径的任何详细信息。

【问题讨论】:

【参考方案1】:

我已经解决了:

我使用 qt rcc tool 将包含大文件的 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 &lt;QAndroidJniEnvironment&gt;(在pro文件中添加QT += androidextras),最后将此权限添加到清单中(因为扩展文件位于外部存储中):

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在加载之前我没有检查文件是否存在(我测试的每台设备都可以正常工作),但 android 文档说您可能需要手动下载它。上传扩展文件也有一些问题,您只能在第二次提交 apk 时添加它们(在 Google play 中)。

【讨论】:

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

此代码可能会对您有所帮助。

QStringList systemEnvironment = QProcess::systemEnvironment();

寻找

    EXTERNAL_STORAGE=/storage/emulated/legacy EXTERNAL_ADD_STORAGE=/storage/external_SD SECONDARY_STORAGE=/storage/external_SD ...

【讨论】:

【参考方案3】:

这段代码对我有用:

QString s = QStandardPaths::writableLocation(QStandardPaths::movieLoaction);
QDir MyDir;
s = s + "/MyFolder"
MyDir.mkdir(s);

在您的 Android 设备中,您必须检查应用程序的存储权限。如果不添加此权限,则运行应用程序。

【讨论】:

以上是关于如何从 Qt 获取 android <shared-storage> 路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Qt/C++ 小部件(不是 QML)从 Android 相机获取图像

Android 如何获取 SHA1 值

如何从 Java 的 keytool 获取 MD5 指纹,而不仅仅是 SHA-1?

android studio如何获取SHA1(Win+Mac)

Qt 和 Android - 从图库中的图像获取路径

如何在 Vs 代码中获取 android 应用程序的 sha1