解决绕过android下apk使用usb设备权限查询相应问题,自动获取usb权限

2022-08-27 AndroidR 插入USB设备自动授权不弹出权限对话框 USB请求权限流程 USB请求权限流程1. 新建activity,获取UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE)2. 获取所以的USB设备HashMap map = usbManager.getDeviceList()3. 过滤别的USB设备,拿到自己USB的USBDevice类,然后请求US...Android系统插入USB设备时,系统会弹出询问权限的对话框,现在需要不弹对话框而直接授权。... 阅读详情

转载请注明:http://blog.youkuaiyun.com/hubbybob1/article/details/50263925

很多android的应用在使用usb设备时,尤其是usb摄像头,前段时间编写了一个有关usb设备的apk,但是在使用时总是会跳出系统对话框,用户体验很差,如下图所示,所以一直想要解决这个问题,在网上说了很多办法,但是我的能力有限都没有走通,在同事的帮助下终于解决的这个问题,非常感谢他们无私的帮助,在此记录下来。这里写图片描述

希望android设备中,自动获得操作usb设备的权限。不希望弹出对话框让用户点击,才允许有操作权限。即,不需要用户操心usb操作权限的事情。

一,首先解决这个问题,需要学习这方面的知识,小编是个小白,所以只能在网上学习这方面的知识,那么来提供几个网站的学习 android usb主机模式:

如果英文看的不太懂,可以去看这个翻译过的文章,还是很不错的:
http://blog.youkuaiyun.com/wizardmly/article/details/8350137
当然下面这位仁兄也给出了很好的学习的网站,但是他最后的答案是无法绕开这个对话框,最后也不了了之了:http://www.crifan.com/android_try_to_auto_grant_usb_device_operation_permission/
http://www.crifan.com/android_as_usb_host_detect_usb_device_insert_attached/

大概了解之后我们就能发现弹出这个对话框的关键语句就是代码中的

myself.mUsbManager.requestPermission(device, mPermissionIntent); // Wait for permission with a timeout.
myself.deviceToFdMap.get(mapKey).wait(Constants.usbDevicePermissionTimeout);

这句话中的.requestPermission是必须要有的,就是询问usb权限的作用。
那怎么解决这问题呢,起初我定了两个方案:
方案一:在代码中绕给这个对话框,使其默认允许权限。
方案二:在android源码中去掉这个对话框。
下面振幅这两种方法来阐述:

二,在apk中解决这个问题
首先这个方案我没有走通,在此只能提供一个解决的方案思路也是参考了被人的博客来做的:
http://stackoverflow.com/questions/13726583/bypass-android-usb-host-permission-confirmation-dialog
这是国外的网站,写的很不错,但是里面谈到由于android版本的不同,可能代码不同,其解决方案可以是针对android版本4.0.3和4.2.2的。有兴趣的可以研究一下,方法是个好方法,操作起来也不麻烦的,但是由于我是小白,没办法,不会修改
那么还有一个翻译过的博客:http://blog.youkuaiyun.com/mlj1668956679/article/details/14122787
也不知道作者有没有走通,反正我按他的方法调试了,无法解决,主要原因是我没有搞懂,他在广播接收器里面的有段代码:

 new OpenTask().execute(device);  
                        }  
                    } else {  
                        if (device != null) {  
                            logMsg("Permission no EXTRA_PERMISSION_GRANTED for device "  
                                    + device.getDeviceName());  
                        }  

                    }  
                }  
            } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {  
                synchronized (this) {  
                    // Close reader  
                    /* logMsg("Closing reader..."); */  
                    new CloseTask().execute();  
                }  
            }  
        }  
    };  

new OpenTask().execute(device);这句话是干什么的,没有看懂。
因此在apk中无法解决,那只好到系统里面看看了.

三,android中解决问题
这个方法已经实现了,其实很简单,那么一步一步的来看吧
A,首先为了查看到这个对话框,我们可以使用eclipse下的一个工具来查看那就是/sdk/tools/hierarchyviewer,,HierarchyViewer能够可视化的角度直观地获得UI布局设计结构和各种属性的信息,帮助 我们优化布局设计,就是我们在操作adroid系统时能在这里面看到信息如线图所示:
这里写图片描述
可以看到当上面的对话框弹出时,这个工具里面都会多出这句话:

com.android.systemui/com.android.systemui.usb.UsbPermissionActivity

这就是应用的位置,当然我们也可以是用grep命令来查找这个对话框的.xml文件,进入android源码然后输入命令:

grep '默认情况下用于' ./ -Rn

其实我们可以直接在frameworks目录下查找,这样会节省好多时间,查找的结果是:
这里写图片描述
那么这个对话框的路径在

/android/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml

其相关的内容如下:

<string name="always_use_device" msgid="1450287437017315906">"默认情况下用于该 USB 设备"</string>

<string name="usb_device_permission_prompt" msgid="834698001271562057">"允许应用“<xliff:g id="APPLICATION">%1$s</xliff:g>”访问该 USB 设备吗?"

B,然后我们根据eclipse工具hierarchyviewer找到的应用路径找到.java文件来修改,其位置在:

/android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java

这就是那个讨厌的对话框对应的java程序,那么来看看这个程序如下:

public class UsbPermissionActivity extends AlertActivity
        implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener {

    private static final String TAG = "UsbPermissionActivity";

    private CheckBox mAlwaysUse;
    private TextView mClearDefaultHint;
    private UsbDevice mDevice;
    private UsbAccessory mAccessory;
    private PendingIntent mPendingIntent;
    private String mPackageName;
    private int mUid;
    private boolean mPermissionGranted;
    private UsbDisconnectedReceiver mDisconnectedReceiver;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

       Intent intent = getIntent();
        mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
        mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT);
        mUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
        mPackageName = intent.getStringExtra("package");

        PackageManager packageManager = getPackageManager();
        ApplicationInfo aInfo;
        try {
            aInfo = packageManager.getApplicationInfo(mPackageName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "unable to look up package name", e);
            finish();
            return;
        }
        String appName = aInfo.loadLabel(packageManager).toString();

这段代码是获取应用的包名,我们可以通过包名对比来决定是否弹出对话框。

final AlertController.AlertParams ap = mAlertParams;
        ap.mIcon = aInfo.loadIcon(packageManager);
        ap.mTitle = appName;
        if (mDevice == null) {
            ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName);
            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
        } else {
            ap.mMessage = getString(R.string.usb_device_permission_prompt, appName);
            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);
        }
        ap.mPositiveButtonText = getString(android.R.string.ok);
        ap.mNegativeButtonText = getString(android.R.string.cancel);
        ap.mPositiveButtonListener = this;
        ap.mNegativeButtonListener = this;

        // add "always use" checkbox
        LayoutInflater inflater = (LayoutInflater)getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null);
        mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse);
        if (mDevice == null) {
            mAlwaysUse.setText(R.string.always_use_accessory);
        } else {
            mAlwaysUse.setText(R.string.always_use_device);
        }
        mAlwaysUse.setOnCheckedChangeListener(this);
        mClearDefaultHint = (TextView)ap.mView.findViewById(
                                                    com.android.internal.R.id.clearDefaultHint);
        mClearDefaultHint.setVisibility(View.GONE);

在上面的代码就是对话框了,接下来就是要修该的东西了

setupAlert();

对就是这句话,代码堆里寻他千百处,他就在灯火栏栅处,这句话就是弹出对话的意思,那么怎么修改呢,如下:

if(!mPackageName.equals("com.vaultmicro.camerafi"))//双引号内为你要给权限的包名
     setupAlert();
else 
     {
        mPermissionGranted = true;
        finish();
     }

这里函数finish();很重要,如果不加上的话会出现下面的内容
这里写图片描述
就是“系统用户界面”,虽然你的apk已经获得权限,但是出这个对话框还是很烦人的。
上面的代码是指定你的apk获取权限,当然你也可以使所有的类似usb权限的apk都获得同样的权限,那么就可以如下编写:

 //setupAlert();//不使用窗口
 mPermissionGranted = true;
 finish();

这样所有的软件都获取了uab权限,是不是很简单啊。
这种处理方法来自这个文件的按钮点击回应函数

public void onClick(DialogInterface dialog, int which) {
        if (which == AlertDialog.BUTTON_POSITIVE) {
            mPermissionGranted = true;
        }
        finish();
    }

那么到这里usb权限窗口问题就解决了,自己去编译源码和android源码吧,第一次编译需要很长时间,再次感谢帮助过我的同事和朋友。

Android USB通信 1.说在前面的话 这次做了一个项目,要求android端与外接设备进行通信,用到的是otg线连接开发板。然而网上有关USB host通信的资料很少,这里我就把自己的想法以及遇到的坑说一下吧()。 2.Android Studio 配置 2.1Manifest配置 阅读详情

相关推荐

使用ADB卸载Android内置应用

OS:ColorOS13 手机:OPPO Reno6 写在前面:防自己忘记写的笔记,但愿以后都不用再调试了。 OPPO是真的狗啊:没有恢复出厂设置选项,OS不能回滚到出厂的旧版本;如果自己安装apk,必须要登录“My OPPO”,这也是安卓机干的事?算了,不骂了,谷歌自己也不怎么讲武德。 手机打开USB调试: 1、打开手机【设置】——【关于手机】——找到【版本号】,连续点击版本号7次; 2、返回上一步,就会多了一个【开发人员选项】的菜单; 3、打开【开发人员选项】,即可找到USB调试,勾..

weixin_41991813的博客 1万+

android弹出选择usb,android 解决:默认情况下用于该USB设备 自动获取USB操作权限...

很多android 的应用在使用USB设备时,总会遇到一个很烦人的问题。即每次都会弹出对话框:每次插入USB设备,都会弹出。每次选上默认情况下使用该USB设备。但总还是会弹出。用户体验很差。似乎唯一的解决方法就是直接获取Root权限,把App放入系统内置应用中,显然很多情况下是无法实现的。机缘巧合需要写一个车载USB-GPS的解析器。其中用到USB-GPS。即每次必然弹出对话框,不胜其烦。查了目前...

weixin_33167456的博客 4072

android 12.0去掉usb授权提示框 默认给予权限

在12.0的系统rom产品开发中,在进行iot开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便,这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限

安卓兼职framework和app工程师的博客 5373

NOLO使用记录——连接ActionOne眼镜(USB提示)

发布放在眼镜里后,如果没有启用USB,会获取不到头盔的信息。 提示信息如下: 【允许应用“XXX”访问该USB设备吗?       □默认情况下用于该USB设备                               取消         确定 】   但是,不是每次给眼镜插上nolo头盔后,都会提示。现在也没找到一个合适的方法,启用USB设备。 先打开程序,然后插上头盔,打开...

李的博客 1052

android 13.0 去掉usb授权提示框 默认给予权限

在13.0的系统rom产品开发中,在进行iot关于插入usb设备的开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便, 这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限,接下来分析下 相关的实现功能流程

安卓兼职framework和app工程师的博客 4155

Android手机ROOT权限获取方法与实战指南

修改或以伪装机型,常用于兼容性测试或刷机调试。这些操作均需Root Explorer具备精确的文本编辑器、编码识别及备份机制,以防误改导致系统崩溃。

weixin_36311421的博客 3763

android usb 开发:如何跳过usb权限询问,解决绕过android下apk使用usb设备权限查询相应问题,自动获取usb权限...

很多android的应用在使用usb设备时,尤其是usb摄像头,前段时间编写了一个有关usb设备的apk,但是在使用时总是会跳出系统对话框,用户体验很差,如下图所示,所以一直想要解决这个问题,在网上说了很多办法,但是我的能力有限都没有走通,在同事的帮助下终于解决的这个问题,非常感谢他们无私的帮助,在此记录下来。 希望android设备中,自动获得操作usb设备的权限。不希望弹出对话框让用户点击,才...

weixin_39969448的博客 2232

UsbPermissionActivity

USB权限控制,可以自动获取USB权限,不必每次都要重新点击权限弹出框。

Android11下APK调用USB serialn每次开机弹窗问题

前言]最近客户做了一个Player,他的APK开机会调用ttyUSB0这个串口,客户想要去掉每次开机弹出权限确认的窗口,为此我在网上收集资料并找到一个较简单的方法提供给大家。根据图片,我们定位到systemui里面,在系统文件中grep查找相关字眼。下面两种方法来将讨厌的对话框去掉,做法是将应用的包名自动获取权限。2.只运行客户的apk,即包名获取usb权限,可能不止一个apk。下面的代码时获取应用的包名,通过包名来决定是否弹出对话框。此方法来自下面代码的按钮点击回应函数。下面就是对话框的代码了。

qq_60264777的博客 471

xsens IMU配置

1.安装驱动 sudo apt-get update sudo apt-get install ros-kinetic-xsens-driver 2.配置IMU 设置输出四元数,加速度、角速度、地磁 cd /opt/ros/kinetic/lib/xsens_driver python mtdevice.py --configure "oq,aa,wr,mf" 3.启动IMU roslaunch xsens_driver xsens_driver.launch 转(https://www.cnblo

qq_41585680的博客 2325

跨境电商ERP开发之Shopee开发者账号申请

引言:由于电子信息技术和经济全球化的进一步发展,电子商务在国际贸易中的影响力和关键作用日渐突显,已变成中国出口贸易的市场趋势。跨境电商未来的发展前景必定是有助于减少经济成本、推动全球贸易便利化,有助于提高国内群众福祉,有助于打造良好的营商环境,从而推动经济长期健康发展。 gitee仓库地址: https://gitee.com/naturalwish/SSERP/tree/master 以下授权教学同ShopeeOpen Platform - Developer Guide 申请流程 ..

naturalwish的专栏 3641

Android 7.0内去掉有关USB 耳机音频输入设备的对话框和Toast方法

Android 7.0 本文章可以参考解决绕过android下apk使用usb设备权限查询相应问题,自动获取usb权限,主要是在Android 7.0系统上,当插入USB 耳机或者音频输入设备的时候,就会报出如下对话框和消息提示,在我们开发的时候很不爽,需要手动去点很麻烦,如下图所示: 提示消息即Toast,当插入USB耳机或者麦时就会弹出“USB音频输入设备接入”,当拔掉时就会弹出“切换之...

hubbybob1专栏 3399

【科研导航】【计算机视觉与图像处理】从顶刊到潜力股:跨学科(电子/电气/信息)SCI期刊投稿全景图

本文全面解析了计算机视觉与图像处理领域的SCI期刊投稿策略,涵盖从顶刊到潜力股的各类期刊特点。重点介绍了IEEE Transactions系列、Elsevier旗舰期刊以及二区优质期刊的审稿偏好和投稿技巧,特别适合电子/电气/信息交叉学科的研究者。文章还提供了三区、四区期刊的实用投稿建议,帮助科研新手快速找到适合的发表平台。

weixin_30897233的博客 83

android usb调试模式 自动验证,andriod 默认项设置

由此计算器(calculator)的启动方法为:# am start -W -n com.android.calculator2/com.android.calculator2.CalculatorMusic的启动方法为:# am start -W -n com.android.music/com.android.music.MusicBrowserActivity这时,屏幕上会有music的播放...

weixin_39732027的博客 592

单细胞转录组数据质控实战:如何用Seurat精准过滤低质量细胞(附完整代码)

本文详细介绍了使用Seurat进行单细胞转录组数据质控的实战方法,包括基因检出数、分子计数和线粒体基因比例等关键指标的解读与可视化技巧。通过动态阈值策略和高级质控技巧(如双细胞检测和红细胞过滤),帮助研究者精准过滤低质量细胞,提升数据分析可靠性。附完整代码示例,适合生物信息学研究人员参考实践。

ii567的博客 825

5060TI显卡深度学习环境搭建:CUDA12.8与CUDNN9.8.0的完美搭配

本文详细介绍了在Win10系统下为5060TI显卡搭建深度学习环境的最佳实践,重点配置CUDA12.8与CUDNN9.8.0的完美组合。通过优化OpenCV编译选项和YOLOv5环境设置,显著提升模型训练和推理效率,帮助开发者充分发挥5060TI显卡的性能潜力。

weixin_29065791的博客 491

如何使用adb shell获取Android应用的编译时间

是一个在 Android 开发中常用的命令,它允许我们通过 adb(Android Debug Bridge)工具连接到 Android 设备并在设备的命令行环境下执行命令。通过adb shell命令,我们可以方便地获取Android应用的编译时间信息,这在一些特定的调试和分析场景下十分有用。是你要查询的应用的包名,编译时间信息通常会显示在文件权限和文件名之间。一个名为 "MyApp" 的 Android 应用,我们想要获取它的编译时间信息。这会连接到设备的命令行环境,并可以在设备上执行命令。

牛肉胡辣汤 1413

UE4逆向实战:如何快速定位UWorld和GName的5种实用技巧(含版本差异分析)

本文详细介绍了UE4逆向工程中快速定位UWorld和GName的5种实用技巧,包括特征码定位法、动态行为分析法、静态符号分析法等,并针对不同版本差异提供了适配方案。特别强调了UWorld作为游戏世界核心容器和GName作为名称管理系统的重要性,帮助开发者高效进行游戏逆向分析。

star的博客 899

Android 手机的高级终端 Termux 安装使用、busybox、安卓 手机 web

手机已经 root安装 tsu,这是一个 su 的 Termux 版本,是一个真正的 root 权限,用来在 Termux上替代su,操作不慎可能对手机有安全风险,因为官方封装了,所以安装也很简单:安装 tsu:pkg install tsu -y切换到 root:tsu退出 root:exittsu切换 root 用户时会弹出 root 授权提示,给予其 root 权限即可。在管理员身份下输入 exit 可回到普通用户身份。

freeking101的博客 10万+

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析7 8

本关任务:编写一个能查询预定的程序。输入餐馆名称,查询用户账号为当前登录用户且餐馆名称为当前输入餐馆名称的结点信息,并输出其预定时间。本关任务:编写一个能查看预定的程序。创建链队列,从文件order.txt中读取数据,依次进入链队列中。遍历链队列,筛选出用户账号为当前登录用户的结点信息,并依次输出相应的餐馆名称和预定时间。烤肉刘老北京炙子烤肉(四道口店) 11月20日晚餐 0。外婆家(清河华润五彩城店) 12月12日午餐 0。甜鸭梨烤鸭店(农大店) 12月5日晚餐 0。鼎坤朋湘菜馆 12月8日晚餐 0。

m0_62222486的博客 1352

【Realtek sdk-3.4.14b】RTL8197FH+RTL8363NB当WAN/LAN IP冲突的时候,再次切换回正常的WAN,出现电脑无法上网也无法ping通设备网关问题分析及解决方案

如上图所示,当WAN和LAN网段冲突的时候,会导致路由设备异常,无法上网,但是修改为不冲突的网段之后,依然无法上网,同时下级PC也无法ping通路由设备,正常的如下图所示如上图所示,正常网络拓扑是可以正常的,但是在上级和路由LAN冲突的时候,再次切换为正常的网络也是异常问题复现步骤1.路由设备WAN口接到一个和本级路由是相同网段的设备2.拔掉WAN口,将WAN口接到一个和本级路由是不同网段的设备3.此时PC无法访问路由器。

wgl307293845的博客 669
上一篇: UCOSII task 任务建立笔记记录
下一篇: GTK+2.0编程范例代码分析-第二章(2)
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值