Выключить устройство программноAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Выключить устройство программно

Сообщение Anonymous »

Я пишу приложение, предназначенное для работы на одной конкретной модели устройства (приставка Android с прошивкой на базе Amlogic). У меня есть права root, и мое приложение подписано сертификатом встроенного ПО.

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

У меня нет команды выключения. У меня есть команда перезагрузки.

Код: Выделить всё

reboot -p
не помогает. Он просто зависает на устройстве, оставаясь включенным.

PowerManager на шаг лучше, но вместо полного выключения устройства переводит устройство в спящий режим:

Код: Выделить всё

PowerManager pm = (PowerManager)getSystemService(Service.POWER_SERVICE);
pm.goToSleep(SystemClock.uptimeMillis());
Я открыт для всех предложений — хакерских или иных. Ожидается, что версия Android останется 4.2.2.



Намерения

Эта команда приведет к перезагрузке устройства. Intent.ACTION_SHUTDOWN, похоже, ничего не делает. Возможно, это намерение только сообщить об отключении, а не инициировать его?

Код: Выделить всё

Intent i = new Intent(Intent.ACTION_REBOOT);
i.putExtra("nowait", 1);
i.putExtra("interval", 1);
i.putExtra("window", 0);
sendBroadcast(i);
Наибольшая удача, которую мне удалось получить, это запросить отключение по намерению:

Код: Выделить всё

Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
i.putExtra("android.intent.extra.KEY_CONFIRM", true);
startActivity(i);


Тема завершения работы

Это немного ближе. Определенно интересно. Можете ли вы найти пример его использования?

На данный момент я придумал следующее:

Код: Выделить всё

Class sdClass = Class.forName("com.android.server.power.ShutdownThread");
Constructor con = sdClass.getDeclaredConstructors()[0];
con.setAccessible(true);

for (Method m : sdClass.getDeclaredMethods()) {
if (m.getName().matches("shutdown")) {
m.setAccessible(true);
m.invoke(sdClass, PlayerActivity.this, false);
} else if (m.getName().matches("rebootOrShutdown")) {
m.setAccessible(true);
m.invoke(sdClass, PlayerActivity.this, false);
} else if (m.getName().matches("beginShutdownSequence")) {
m.setAccessible(true);
m.invoke(sdClass, PlayerActivity.this, false);
}
}

Код: Выделить всё

shutdown
и BeginShutdownSequence создают NullPointerException (понимаете, почему?), а restartOrShutdown создает исключение InvocateTargetException из-за UnsatisfiedLinkError... Он не может найти собственный метод:


java.lang.UnsatisfiedLinkError: Собственный метод не найден:
com.android.server.power.PowerManagerService.nativeShutdown:()V в
com.android.server.power.PowerManagerService.nativeShutdown(собственный
метод) в
com.android.server.power.PowerManagerService.lowLevelShutdown(PowerManagerService.java:2163)
в
com.android.server.power.ShutdownThread.rebootOrShutdown(ShutdownThread.java:543)
на
com.android.server.power.ShutdownThread.run(ShutdownThread.java:393)

Код: Выделить всё

lowLevelShutdown
— это функция, которую в конечном итоге достигают все функции при настройке на выключение (а не перезагрузку). Поэтому выяснение того, как избежать этой ошибки ссылки, может быть ключевым моментом.

Подробнее здесь: https://stackoverflow.com/questions/246 ... mmatically
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»