为什么我的应用程序会抛出`android.permission.REBOOT SecurityException`?

问题描述 投票:0回答:7

我编写了一个使用

android.os.PowerManager.reboot()
的 Android 应用程序,并在我的
<uses-permission android:name="android.permission.REBOOT" />
中添加了
AndroidManifest.xml
。但是,当我运行该应用程序时,它总是抛出以下异常:

java.lang.SecurityException: Neither user 10039 nor current process has android.permission.REBOOT. at android.os.Parcel.readException(Parcel.java:1247)
at android.os.Parcel.readException(Parcel.java:1247)
at android.os.Parcel.readException(Parcel.java:1235)
at android.os.IPowerManager$Stub$Proxy.reboot(IPowerManager.java:427)
at android.os.PowerManager.reboot(PowerManager.java:481)
at Test.testPower(Test.java:374)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
at android.os.Parcel.readException(Parcel.java:1247)
at android.os.Parcel.readException(Parcel.java:1235)
at android.os.IPowerManager$Stub$Proxy.reboot(IPowerManager.java:427)
at android.os.PowerManager.reboot(PowerManager.java:481)
at com.fsl.cts.FSLPlaybackTest.testPower(FSLPlaybackTest.java:374)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)

是我做错了什么,还是 froyo 重启有问题?

android permissions reboot
7个回答
9
投票

您无法获得此许可。只有系统应用程序和使用与固件签名相同的密钥签名的应用程序才能获得该权限。

为什么需要重启?如果您告诉您重新启动的必要性,那么可能有人可以建议您更好的方法来完成相同的事情而无需重新启动。


6
投票

这不能在普通的 Android 手机上完成。但是,正如我在其他类似的问题中发布的那样,如果手机已root,那么你根本没有问题:

try {
    Runtime.getRuntime().exec("su");
    Runtime.getRuntime().exec("reboot"); }
catch (IOException e) { }

有关说明,请点击上面的链接。


3
投票

据我所知此权限只能授予系统应用程序,“用户应用程序”无法获得该权限


2
投票

要使用代码重新启动设备需要 REBOOT 权限。

此权限适用于系统应用程序。仅当您拥有用于构建系统映像的证书时,您才能将您的应用程序设为系统应用程序。

  1. 请检查以下链接,了解使用平台证书签名的应用程序https://groups.google.com/d/msg/android-developers/wsRr-VhzKZ4/dAUbLPszOQ8J
  2. http://developer.android.com/guide/topics/security/security.html

1
投票

它可以工作:

 String cmd = "su -c shutdown";
         try{
         Runtime.getRuntime().exec(cmd);
   }catch(IOException e){
       e.printStackTrace();
   }
         }

否则,您必须将

android:sharedUserId="android.uid.system"
添加到您的申请中


0
投票

如果您有 root 权限,则可以使用以下任何命令:

“硬根”:

reboot

“软重启”:

setprop ctl.restart surfaceflinger; setprop ctl.restart zygote

0
投票

对于 root 设备,您可以使用 LibSuperUser 库或 libsu 库。

例如 LibSuperUser:

Shell.Pool.SU.run("reboot");
© www.soinside.com 2019 - 2024. All rights reserved.