2010-08-11 7 views
5

Escribí una aplicación de Android que usa android.os.PowerManager.reboot(), y agregué <uses-permission android:name="android.permission.REBOOT" /> en mi AndroidManifest.xml. Sin embargo, cuando ejecuto la aplicación, siempre se lanza la siguiente excepción:¿Por qué mi aplicación lanza una `android.permission.REBOOT SecurityException`?

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) 

Es la cosa que estoy haciendo mal, o no Froyo tener algún problema con el reinicio?

+1

lo que es exactamente lo que ha añadido en el manifiesto ¿archivo? puedes publicarlo? – RoflcoptrException

Respuesta

3

Por lo que yo sé este permiso sólo puede ser rallado para aplicaciones del sistema, las aplicaciones de usuario "" no puede conseguir ese permiso

9

No se puede obtener este permiso. Solo las aplicaciones del sistema y las aplicaciones firmadas con la misma clave que se usó para firmar el firmware podrán obtener ese permiso.

¿Por qué necesita reiniciar? Si dice que es necesario reiniciar, puede que alguien le sugiera una forma mejor de lograr lo mismo sin reiniciar.

5

No se puede hacer en teléfonos Android. Pero, como he publicado en otros similares question, si el teléfono tiene sus raíces, entonces tiene ningún problema en absoluto:

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

Para una explicación, sigue el enlace anterior.

+0

Esto no funciona –

1

Para reiniciar el dispositivo utilizando el código necesita el permiso REINICIAR.

Este permiso está disponible para las aplicaciones del sistema. Puede hacer que su aplicación sea una aplicación del sistema solo si tiene el certificado utilizado para crear la imagen del sistema.

  1. Por favor, compruebe el siguiente enlace de aplicaciones que se firmó con el certificado plataforma https://groups.google.com/d/msg/android-developers/wsRr-VhzKZ4/dAUbLPszOQ8J
  2. http://developer.android.com/guide/topics/security/security.html
1

Puede funcionar:

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

De lo contrario, debe agregar android:sharedUserId="android.uid.system" en su aplicación

0

Si tiene raíz, se puede utilizar cualquiera de estos comandos:

"raíz duro":

reboot 

"reinicio suave":

setprop ctl.restart surfaceflinger; setprop ctl.restart zygote 
Cuestiones relacionadas