1-先介绍写这篇博客的时候使用的系统环境
QT版本:QT5.15.2
安卓系统:Android 11 (博主使用的是RK3568 官网下载的android 11 系统)
NDK:21.3.6528147
CMAKE:3.21.1
SDK: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");
}
}