QT——关于安卓系统的使用,文件权限,USB权限相关介绍总结(Android 11 ,QT5)

编程入门 行业动态 更新时间:2024-10-11 17:30:14

QT——关于安卓系统的使用,文件<a href=https://www.elefans.com/category/jswz/34/1771295.html style=权限,USB权限相关介绍总结(Android 11 ,QT5)"/>

QT——关于安卓系统的使用,文件权限,USB权限相关介绍总结(Android 11 ,QT5)

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查看示例,下面是链接


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");}}

更多推荐

QT——关于安卓系统的使用,文件权限,USB权限相关介绍总结(Android 11 ,QT5)

本文发布于:2023-11-15 20:04:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1605509.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:权限   文件   系统   QT   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!