Android 怎么获取 INJECT_EVENTS(小米手机)

本文介绍了一个基于UiAutomator2实现的自动登录示例遇到的点击无权限问题及解决方案。作者通过调整手机的USB调试设置成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于UiAutomator2写了一段自动登录的实列,用真机测试的时候,自动化输入是ok的,但在执行click()点击事件的时候,总是提示无权限,提示异常如下:

Injecting to another application requires INJECT_EVENTS permission


在网上能搜索到的解决方案都试过了,都没有解决无权限的问题,在绝望的时候开始怀疑系统了,我的手机是小米5 MI8的系统,最后自己琢磨终于解决了问题。

解决方案:打开USB调试(安全设置) 再调试,终于解决了点击无权限的问题。


设置 --》 更多设置 --》 开发者选项 --》USB调试(安全设置)


PS:我用的是小米手机,可能只是小米手机会出现这个问题,其他机型我没有试过。

uiautomator2.exceptions.RPCUnknownError: ('Unknown RPC error: -32001 java.lang.SecurityException', (1117.5, 248.5), 'java.lang.SecurityException: Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.\n\tat android.os.Parcel.createExceptionOrNull(Parcel.java:3256)\n\tat android.os.Parcel.createException(Parcel.java:3240)\n\tat android.os.Parcel.readException(Parcel.java:3223)\n\tat android.os.Parcel.readException(Parcel.java:3165)\n\tat android.hardware.input.IInputManager$Stub$Proxy.injectInputEventToTarget(IInputManager.java:1542)\n\tat android.hardware.input.InputManagerGlobal.injectInputEvent(InputManagerGlobal.java:1388)\n\tat android.hardware.input.InputManagerGlobal.injectInputEvent(InputManagerGlobal.java:1398)\n\tat android.app.UiAutomationConnection.injectInputEvent(UiAutomationConnection.java:166)\n\tat android.app.UiAutomation.injectInputEvent(UiAutomation.java:991)\n\tat android.app.UiAutomation.injectInputEvent(UiAutomation.java:964)\n\tat com.wetest.uia2.stub.TouchController.injectEventSync(TouchController.java:38)\n\tat com.wetest.uia2.stub.TouchController.touchDown(TouchController.java:47)\n\tat com.wetest.uia2.stub.AutomatorServiceImpl.click(AutomatorServiceImpl.java:191)\n\tat java.lang.reflect.Method.invoke(Native Method)\n\tat com.googlecode.jsonrpc4j.JsonRpcBasicServer.invoke(JsonRpcBasicServer.java:467)\n\tat com.googlecode.jsonrpc4j.JsonRpcBasicServer.handleObject(JsonRpcBasicServer.java:352)\n\tat com.googlecode.jsonrpc4j.JsonRpcBasicServer.handleJsonNodeRequest(JsonRpcBasicServer.java:283)\n\tat com.googlecode.jsonrpc4j.JsonRpcBasicServer.handleRequest(JsonRpcBasicServer.java:251)\n\tat com.wetest.uia2.stub.AutomatorHttpServer.serve(AutomatorHttpServer.java:101)\n\tat fi.iki.elonen.NanoHTTPD.serve(NanoHTTPD.java:2244)\n\tat fi.iki.elonen.NanoHTTPD$HTTPSession.execute(NanoHTTPD.java:945)\n\tat fi.iki.elonen.NanoHTTPD$ClientHandler.run(NanoHTTPD.java:192)\n\tat java.lang.Thread.run(Thread.java:1012)\nCaused by: android.os.RemoteException: Remote stack trace:\n\tat com.android.server.input.InputManagerService.injectInputEventToTarget(InputManagerService.java:929)\n\tat android.hardware.input.IInputManager$Stub.onTransact(IInputManager.java:727)\n\tat android.os.Binder.execTransactInternal(Binder.java:1507)\n\tat android.os.Binder.execTransact(Binder.java:1451)\n\n')
最新发布
06-25
<think>我们正在解决uiautomator2在执行点击操作时出现的SecurityException,具体错误信息是"InjectinginputeventsrequiresINJECT_EVENTSpermission"。根据引用内容,这个问题通常是由于缺少权限导致的,特别是Android设备上的一个设置选项没有打开。根据引用[3]中的解决方案,对于小米或红米手机Android7.1.1),需要在开发者选项中打开【允许通过USB调试修改权限或模拟点击】。其他品牌的手机可能有类似的选项,但名称可能略有不同。因此,解决步骤应该是:1.打开手机的开发者选项(如果未开启,需先多次点击“设置”中的“版本号”以激活开发者选项)。2.在开发者选项中找到类似“允许通过USB调试修改权限或模拟点击”的选项(不同厂商可能叫法不同,如“模拟点击”、“注入事件”等)。3.开启该选项。注意:引用[3]提到该选项可能需要连续开启3次(每次开启后等待5秒,共15秒),所以需要耐心操作。如果问题仍然存在,可以尝试以下其他方法:-重新连接USB调试。-重启手机和电脑。-确保uiautomator2和相关依赖库是最新版本。由于不同手机厂商的设置路径可能不同,这里提供一些常见品牌的设置位置参考:-小米/红米:开发者选项->【允许通过USB调试修改权限或模拟点击】-华为:开发者选项->【“仅充电”模式下允许ADB调试】下方可能有类似选项,或查找“模拟点击”-OPPO/Vivo:开发者选项->【USB调试(安全设置)】或类似选项如果以上方法不能解决问题,可能需要检查应用的权限设置,或者在代码中请求相关权限(但通常模拟点击需要系统级权限,只能通过上述设置开启)。最后,建议在打开设置后重新运行测试,看是否解决异常。§§相关问题§§1.如何打开Android手机的开发者选项?2.不同品牌手机中模拟点击权限的设置位置在哪里?3.除了开启模拟点击权限,还有哪些方法可以避免uiautomator2的INJECT_EVENTS权限错误?4.如何通过代码检测设备是否已经授予INJECT_EVENTS权限?</think>### 解决uiautomator2点击操作的安全异常问题 当uiautomator2执行点击操作时出现`SecurityException: Injecting input events requires INJECT_EVENTS permission`错误,这是由于Android系统权限限制导致的。以下是详细解决方案: #### 核心解决方法 1. **开启设备模拟点击权限**(关键步骤) 在手机**开发者选项**中启用`允许通过USB调试修改权限或模拟点击`: ```markdown 设置 → 系统 → 关于手机 → 连续点击"版本号"7次激活开发者选项 → 返回系统设置 → 开发者选项 → 开启【允许通过USB调试修改权限或模拟点击】 ``` *不同品牌路径参考:* - 小米/红米:`开发者选项 → 调试 → 开启模拟点击权限`[^3] - 华为:`开发者选项 → 输入 → 开启"模拟点击"` - 三星:`开发者选项 → 输入 → 允许指针位置` 2. **USB调试安全设置** 在开发者选项中同时开启: ```markdown ✅ USB调试 ✅ USB调试(安全设置) // 部分品牌特有选项 ``` #### 其他验证步骤 3. **权限动态申请**(代码层面) 在`AndroidManifest.xml`中添加权限声明: ```xml <uses-permission android:name="android.permission.INJECT_EVENTS" tools:ignore="ProtectedPermissions" /> ``` > 注意:此权限需系统签名,普通应用需通过设备授权实现[^2] 4. **设备连接重置** ```bash adb kill-server # 终止ADB服务 adb start-server # 重启ADB服务 adb devices # 重新检测设备 ``` 5. **框架版本兼容性检查** 升级uiautomator2到最新版: ```bash pip install -U uiautomator2 ``` #### 典型错误场景分析 | 触发条件 | 解决方案 | |-------------------------|-----------------------------| | 小米/红米设备 | 必须开启"模拟点击"开关[^3] | | Android 8.0+ 系统 | 额外开启"USB安装"权限 | | 企业版手机 | 需管理员解除设备策略限制 | > **重要提示**:部分手机(如小米)需**连续开启3次**模拟点击权限,每次间隔5秒,系统才会真正激活该功能[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值