1-先介绍写这篇博客的时候使用的系统环境
QT版本:QT5.15.2安卓系统:Android 11 (博主使用的是RK3568 官网下载的android 11 系统)NDK:21.3.6528147CMAKE:3.21.1SDK:28 (很重要)
2-在此环境下,通过QTcreator进行调试安卓机器(平板也可以调试),下面介绍Demo
直接通过QtCreator创建的demo是允许获得所有文件权限的,什么都不用改,可在android 系统设置上赋予权限,如果想要直接获取权限通过打开软件提示的方式,可通过下面代码实现:
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;
}
当非我使用系统环境时
SDK >28,在此情况下编译的APK是无法获取到所有文件权限的,只能获取媒体文件权限,通过修改AndroidManifest.xml 也没有任何用处,当然如果都跟我的环境不一样可以尝试下面方式获取权限
修改XML文件:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
3-USB权限相关权限介绍
在获取到所有文件权限的时候,已经可以向USB内读写文件,此时USB挂载在/stroage 路径下,但是该路径需要root权限,才可以进行扫描,读取USB在系统内的名字,可通过QDIR进行读取,如果没有root权限,可通过下面方式进行获取USB路径,但是不一定能够成功,以下只是介绍,最好还是将/storage 赋予权限,或者直接将系统root掉
1.libusb,可去githup查看示例,下面是链接
https://github.com/libusb/libusb/tree/master
2.qt调用java的方式,上述方式也需要此条件,但不是下面代码
QAndroidJniObject context =QtAndroid::androidActivity();if (context.isValid()) {QAndroidJniObject usbManager = context.callObjectMethod("getSystemService","(Ljava/lang/String;)Ljava/lang/Object;",QAndroidJniObject::getStaticObjectField("android/content/Context","USB_SERVICE","Ljava/lang/String;").object<jstring>());QAndroidJniObject deviceList = usbManager.callObjectMethod("getDeviceList","()Ljava/util/HashMap;");QAndroidJniEnvironment env;jobject jMap = deviceList.object();jclass mapClass = env->GetObjectClass(jMap);jmethodID entrySet = env->GetMethodID(mapClass, "entrySet", "()Ljava/util/Set;");jobject jEntrySet = env->CallObjectMethod(jMap, entrySet);jclass setClass = env->FindClass("java/util/Set");jmethodID iterator = env->GetMethodID(setClass, "iterator", "()Ljava/util/Iterator;");jobject jIterator = env->CallObjectMethod(jEntrySet, iterator);jclass iteratorClass = env->FindClass("java/util/Iterator");jmethodID hasNext = env->GetMethodID(iteratorClass, "hasNext", "()Z");jmethodID next = env->GetMethodID(iteratorClass, "next", "()Ljava/lang/Object;");jclass entryClass = env->FindClass("java/util/Map$Entry");jmethodID getKey = env->GetMethodID(entryClass, "getKey", "()Ljava/lang/Object;");jmethodID getValue = env->GetMethodID(entryClass, "getValue", "()Ljava/lang/Object;");while (env->CallBooleanMethod(jIterator, hasNext)) {jobject jEntry = env->CallObjectMethod(jIterator, next);jstring jDeviceName = static_cast<jstring>(env->CallObjectMethod(jEntry, getKey));jobject jDevice = env->CallObjectMethod(jEntry, getValue);QAndroidJniObject device(jDevice);jint vendorId = device.callMethod<jint>("getVendorId", "()I");jint productId = device.callMethod<jint>("getProductId", "()I");QAndroidJniObject manufacturer = device.callObjectMethod("getDeviceName", "()Ljava/lang/String;");QAndroidJniObject productname = device.callObjectMethod("getProductName", "()Ljava/lang/String;");jstring permissionString = env->NewStringUTF("org.qtproject.socomate.USB_PERMISSION");}}