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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的类和继承构造

一些小技巧 类和对象 什么是类&#xff0c;对象&#xff0c;方法&#xff1f; 在下面的 Java 代码中&#xff0c;定义了一个名为 Person 的类&#xff0c;并提供了构造方法来初始化对象的属性。类中定义了 eat、sleep 和 work 三个方法&#xff0c;用于表示人的行为。在 main 方…

安装和使用 nn-Meter

安装和使用 nn-Meter nn-Meter: Towards Accurate Latency Prediction of Deep-Learning Model Inference on Diverse Edge Devices nn-Meter&#xff1a;精准预测深度学习模型在边缘设备上的推理延迟 Li Lyna Zhang, Shihao Han, Jianyu Wei, Ningxin Zheng, Ting Cao, Yuqin…

k8s上对Pod的管理部分详解

目录 一.Pod结构介绍 1.user container 2.pause 二.Pod工作形式介绍 1.自主式pod 2.控制器管理下的pod 三.对Pod的操作介绍 1.run/apply -f/create -f运行pod 2.get查看pod信息 3.exec操作运行中的pod &#xff08;1&#xff09;进入运行中的pod &#xff08;2&…

React的refs和表单组件总结

React的refs和表单组件 react中refs的使用字符串形式的ref react核心就在于虚拟DOM&#xff0c;也就是React中不总是直接操页面的真实DOM元素&#xff0c;并且结合Diffing算法&#xff0c;可以做到最小化页面重绘&#xff0c;但有些时候不可避免我们需要一种方法可以操作我们定…

深入OpenCV Android应用开发

前言 OpenCV是Open Source Computer Vision library(开源的计算机视觉库)的缩写。它是使用最广泛的计算机视觉库。Opencv是计算机视觉领域常用的操作函数的集合&#xff0c;其自身由C/C编写而成&#xff0c;同时也提供了对Python、Java以及任意JVM语言的封装。考虑到大部分And…

【Springboot】基于注解式开发Springboot-Vue3整合Mybatis-plus实现分页查询(二)——前端el-pagination实现

系列文章 【Springboot】基于注解式开发Springboot-Vue3整合Mybatis-plus实现分页查询—后端实现 文章目录 系列文章系统版本实现功能实现思路后端传入的数据格式前端el-table封装axois接口引入Element-plus的el-pagination分页组件Axois 获取后台数据 系统版本 后端&#xf…

内存映射:PS和PL DDR3的一些区别

之前写的一些资料&#xff1a; PS与PL互联与SCU以及PG082-CSDN博客 参考别人的资料&#xff1a; PL读写PS端DDR的设计_pl读写ps端ddr数据-CSDN博客 xilinx sdk、vitis查看地址_vitis如何查看microblazed地址_yang_wei_bk的博客-CSDN博客 可见&#xff0c;PS端的DDR3需要从…

【友提】2023年“思维100”编程比赛开始报名,名额有限报名抓紧

根据官方昨天发布的通知&#xff0c;2023年上海市“科学小公民”实践展示活动之“思维100”STEM应用能力编程活动&#xff08;秋季&#xff09;开始报名了&#xff0c;为便于大家了解&#xff0c;六分成长为大家整理关键信息如下。为便于叙述&#xff0c;该活动简称为思维100编…

shell之route命令介绍

shell之route命令介绍 route命令用于显示和操作IP路由表&#xff0c;它可以查看、添加、删除和修改路由表中的路由项。 以下是route命令的常见选项和用法&#xff1a; 显示路由表&#xff1a;route -n 该命令将显示当前的路由表&#xff0c;包括目标网络、网关、接口等信息。 …

[autojs]逍遥模拟器和vscode对接

第一步&#xff1a;启动autojs服务 第二步&#xff1a;去cmd查看ip地址&#xff0c;输入ipconfig 第三步&#xff1a;打开逍遥模拟器中的sutojs-左上角- 连接电脑&#xff0c;然后输入WLAN或者其他ip也行&#xff0c;根据自己电脑实际情况确认 此时vscode显示连接成功。我们写…

Linux文件缓冲区

文章目录 1. 缓冲区现象2. 用户级和系统级缓冲区3. 缓冲区刷新4. 为什么要有缓冲区5. 文件打印的全缓冲6. 模拟实现C语言文件标准库 本章gitee代码仓库&#xff1a;重定向、模拟C语言文件标准库 1. 缓冲区现象 我们这里分别调用了4个差不多的函数&#xff0c;但是结果是有一定差…

深度解析找不到msvcp120.dll相关问题以及解决方法

​在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;如何解决msvcp120.dll丢失的问题呢&#xff1f;本文将为大家介绍…

leetcode刷题日记:111. Minimum Depth of Binary Tree(二叉树的最小深度)

给我们一个二叉树&#xff0c;我们应该如何来求二叉树的最小深度呢&#xff1f; 二叉树的最小深度指的是叶子结点到所处的位置最小的&#xff0c;这就是二叉树的最小深度&#xff0c;也就是说我们要找的是离根结点最近的叶子结点。如果我们从根结点向下出发寻找叶子节点&#x…

overflow: auto滚动条跳到指定位置

点击对应模块跳转页面&#xff0c;滚动到对应模块&#xff0c;露出到可视范围 代码&#xff1a; scrollToCurrentCard() {// treeWrapper是包裹多个el-tree组件的父级元素&#xff0c;也是设置overflow:auto的元素let treeWrapper document.getElementsByClassName(treeWrapp…

STM32笔记—定时器

目录 一、TIM简介 二、基本定时器&#xff08;TIM6和TIM7&#xff09; 1. TIM6和TIM7简介 2. TIM6和TIM7的主要特性 3. TIM6和TIM7的功能 3.1 时基单元 3.2 计数模式 3.3 时钟源 三、通用定时器 1. TIMx(2、3、4、5)简介 2. TIMx主要功能 3. 时钟选择 4. 影子寄存…

【算法练习Day46】判断子序列不同的子序列

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 判断子序列不同的子序列总结…

Flutter笔记:状态提升、控制器模式、GetX控制器和服务

Flutter笔记 状态提升、控制器模式、GetX控制器和服务 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1…

450. 删除二叉搜索树中的节点

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#x…

ubuntu cp210x(USB转串口)驱动安装教程

ubuntu cp210x&#xff08;USB转串口&#xff09;驱动安装 前言1. 驱动下载2. 驱动编译和安装3. 可能遇到的问题及解决办法3.1 第一种解决方案&#xff1a;检查当前是否已有CP210x.ko驱动3.2 第二种解决方案&#xff1a;修改驱动文件&#xff0c;编译 前言 CP2108 是一款高度集…

【Phoenix】目录结构

当我们通过 mix phx.new 命令生成一个新的Phoenix应用时&#xff0c;它会创建以下目录结构&#xff1a; ├── _build ├── assets ├── config ├── deps ├── lib │├── hello │├── hello.ex │├── hello_web │└── hello_web.ex ├── priv └── …