2015-10-07 4 views
6

В моем приложении для Android я хочу перезагрузить мое Android-устройство при нажатии кнопки. Но его не работает.
Я сделал это до сих пор.Перезагрузите Android-устройство программно

ImageButton restartmob = (ImageButton) this.findViewById(R.id.restartmob); 
    restartmob.setOnClickListener(new ImageButton.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Process proc = null;    
      try { 
       //proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" }); 
       proc = Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"}); 
       proc.waitFor(); 
      } catch (Exception ex) { 
       Log.i(TAG, "Could not reboot", ex); 
      } 
     } 
    }); 

Также я вложил в файл манифеста следующее разрешение.

<permission android:name="android.permission.REBOOT"/> 

Когда я нажал кнопку изображения для перезагрузки, я получил следующее исключение.

java.io.IOException: Error running exec(). Command: [/system/bin/su, -c, reboot now] 
Working Directory: null Environment: null 
at java.lang.ProcessManager.exec(ProcessManager.java:211) 
at java.lang.Runtime.exec(Runtime.java:173) 
at java.lang.Runtime.exec(Runtime.java:128) 
at com.android.onlinepayment.activity.SystemSubMenuActivity$1.onClick(SystemSubMenuActivity.java:49) 
at android.view.View.performClick(View.java:5184) 
at android.view.View$PerformClick.run(View.java:20910) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5942)  
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183) 
Caused by: java.io.IOException: No such file or directory 
at java.lang.ProcessManager.exec(Native Method) 
at java.lang.ProcessManager.exec(ProcessManager.java:209) 
... 13 more 

Что случилось с моим кодом? Пожалуйста помоги мне с этим.
Для информации, я тестирую на android Lollipop (если это имеет значение).
Спасибо заранее.

+1

Посмотрите этот ответ: http://stackoverflow.com/questions/4966486/reboot-the-phone-on-a-button-click – wblaschko

ответ

3

Попробуйте это ...

try { 
     Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" }); 
     proc.waitFor(); 
     } catch (Exception ex) { 
       Log.i(TAG, "Could not reboot", ex); 
     } 

Добавить разрешения Перегрузить

+0

Я тоже это пробовал. Но дает такое же исключение. – Suniel

+0

работает в Android 2.2 ... –

+0

Это зависит от версии Android? На самом деле я тестирую в android 5.0.1 – Suniel

7

разрешения вам требуется, это не связан с вашим методом перезагрузки, так как ваш метод требует корневого телефона (с su). Чтобы перезагрузить телефон, требуется разрешение так же, как вы, но звоните PowerManager#reboot.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
pm.reboot(null); 
+1

Я получил это исключение: java.lang.SecurityException: Ни у пользователя 10695, ни у текущего процесса нет android.permission.REBOOT. – Suniel

+0

убедитесь, что у вас есть разрешение в файле манифеста. – MByD

+0

У меня есть разрешение в файле манифеста. – Suniel

1

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

Programmatically switching off Android phone

Вам нужен системный ключ, чтобы подписать приложение. См. Это сообщение для подробностей;

How to compile Android Application with system permissions

2

После долгой борьбы я нашел рабочий раствор.

Если система используется последовательный порт, а затем выполнить следующую команду,

Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"}); 

если использовать нормальный порт, то excure ниже команды

Runtime.getRuntime().exec(new String[]{"/system/xbin/su","-c","reboot now"}); 

разница только /bin и /xbin

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

+0

Я не вижу никакой разницы .... – nrofis

+1

вы можете проверить еще раз, я исправил опечатку –

5

на API 24, если ваше приложение является приложением владельца устройства вы можете позвонить: devicePolicyManager.reboot(yourAdminComponent)

См Docs here

0

Вы можете использовать легендарный LibSuperUser библиотеку.

Написать этот простой код:

Shell.SU.run("reboot"); 
0

Вы делаете <permission ... />. Вам необходимо сделать <USES-permission ... />

Крышки не нужны, это было просто для того, чтобы подчеркнуть это.

Смежные вопросы