我有一个应用程序,我在其中创建一个进程并调用dumpsys telephony.registry
命令以获取有关移动网络状态的信息。
String[] cmds={"dumpsys telephony.registry"};
Process p = Runtime.getRuntime().exec(cmds [0]+"\n");
然后我解析命令的结果。对于"ls"
或其他命令,它可以正常工作。对于dupmsys,我得到Permission Denial: can't dump telephony.registry from pid-953, uid=10090
。我得到dumpsys power
或其他dumpsys命令的相同错误结果。
我在android Manifest中设置了DUMP权限android.permission.DUMP
,如建议的here
我认为我正在这样做,因为Android提供此功能here
我还完成了here描述的步骤,强制eclipse允许我在清单中提供我的应用程序DUMP权限。
当我执行dumpsys命令时,我总是得到相同的结果
Permission Denial: can't dump telephony.registry from pid-953, uid=10090
我做错了吗?为什么Android操作系统仍然拒绝我访问转储服务?
PS我已设置min API 8,我正在设备运行(ICS)上测试应用程序 API 15
答案 0 :(得分:4)
通过 adb shell ,可以通过另一种(hacky)方式访问dumpsys
而无需根据您的设备进行操作。
这将需要允许USB调试,并找到adb服务的端口。
在您的设备上启用USB调试。此选项位于Settings
- >下。 Developer Options
。
将您的设备连接到PC,然后从PC的shell /命令行运行以下命令:
adb tcpip 12345
。然后,从您的设备shell中,从您的应用程序发出命令adb connect localhost:12345
。您现在可以断开设备与USB的连接。
或者,您可以使用adb connect localhost:<portnum>
逐个扫描设备上的端口,无需USB连接,并找到adb服务正在侦听的端口。
如果出现提示,请从弹出确认对话框中授权USB调试。选中“始终”复选框,不再需要此步骤。
现在,当您有权访问adb服务时,请使用应用程序代码中的adb shell dumpsys ...
来获取所需的任何服务转储。
注意:您无需DUMP
权限即可使用。
答案 1 :(得分:2)
为什么Android操作系统仍然拒绝我访问转储服务?
由于该权限在Android 2.3+上被标记为android:protectionLevel="signature|system|development"
(或signatureOrSystem
使用旧语法),因此无法由普通的Android SDK应用程序保留。
答案 2 :(得分:1)
Android开发团队决定停止向第三方应用授予这些权限。现在只有系统应用才能获得它们。
答案 3 :(得分:0)
它报告您通常无法获得的核心Android服务的私有值。 Official document说“不供第三方应用程序使用”。
答案 4 :(得分:-1)
在您的清单上添加权限&#34; android.permission.DUMP&#34;。我还没有尝试过,但它在adb shell上显示它缺少该权限