Почему мое приложение генерирует исключение android.permission.REBOOT SecurityException? - PullRequest
5 голосов
/ 11 августа 2010

Я написал приложение для Android, которое использует android.os.PowerManager.reboot(), и добавил <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 есть проблемы с перезагрузкой?

Ответы [ 6 ]

9 голосов
/ 11 августа 2010

Вы не можете получить это разрешение.Только системные приложения и приложения, подписанные тем же ключом, который использовался для подписи прошивки, смогут получить это разрешение.

Зачем вам нужно перезагружаться?Если вы скажете о необходимости перезагрузки, возможно, кто-то предложит вам лучший способ выполнить то же самое без перезагрузки.

5 голосов
/ 23 января 2011

Это не может быть сделано в стандартных телефонах Android.Но, как я писал в другом подобном вопросе , если телефон рутирован, то у вас вообще нет проблем:

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

Для объяснения перейдите по ссылке выше.*

3 голосов
/ 11 августа 2010

Насколько я знаю, это разрешение может быть разрешено только системным приложениям, "пользовательские приложения" не могут получить это разрешение

2 голосов
/ 18 августа 2011

Для перезагрузки устройства с использованием кода требуется разрешение REBOOT.

Это разрешение доступно для системных приложений.Вы можете сделать свое приложение системным приложением, только если у вас есть сертификат, используемый при создании образа системы.

  1. Пожалуйста, проверьте ссылку ниже на приложения, подписанные сертификатом платформы https://groups.google.com/d/msg/android-developers/wsRr-VhzKZ4/dAUbLPszOQ8J
  2. http://developer.android.com/guide/topics/security/security.html
1 голос
/ 17 мая 2012

Может работать:

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

В противном случае, вы должны добавить android:sharedUserId="android.uid.system" в ваше приложение

0 голосов
/ 04 ноября 2014

Если у вас есть root, вы можете использовать любую из этих команд:

"жесткий корень":

reboot

"мягкая перезагрузка":

setprop ctl.restart surfaceflinger; setprop ctl.restart zygote
...