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

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");
     }
     }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值