Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как управлять питанием устройства


Makaroff

Вопрос

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

Для Java существует класс PowerManager, но в JNI такого я не нашел.

Подскажите пожалуйста решение.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Понял, тогда посмотрите готовые обертки для всего андроид апи.

Ссылка на комментарий
  • 0
5 часов назад, Brovin Yaroslav сказал:

Понял, тогда посмотрите готовые обертки для всего андроид апи.

Спасибо. Скачал библиотеки. Теперь возникла проблема с преобразованием типов string -> jstring :)))

Цитата

PowerObj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.POWER_SERVICE);
PowerManager := TJPowerManager.Wrap((PowerObj as ILocalObject).GetObjectID);
PowerManager.reboot('null'); //'null' должен быть в jstring

Не понимаю, как конвертировать.

Ссылка на комментарий
  • 0
12 часов назад, Makaroff сказал:

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

Для Java существует класс PowerManager, но в JNI такого я не нашел.

Подскажите пожалуйста решение.

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

Были грабли с использованием? Какие пермишены потребовались?

 

Ссылка на комментарий
  • 0
В 12.10.2016 в 23:44, Brovin Yaroslav сказал:

StringToJString

Спасибо. Я подозревал, что должно быть нечто подобное, перелопатил кучу библиотек, но до Helpers не дошел :)))

В 13.10.2016 в 04:49, Pax Beach сказал:

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

Были грабли с использованием? Какие пермишены потребовались?

 

К сожалению, то что я приводил выше по аналогии с явой не заработало. Вылетает.

Доступ ставил как советуют для явы: reboot и wake lock

Изменено пользователем Makaroff
Ссылка на комментарий
  • 0
  • Модераторы

так я тут покапался чуток

uses
  FMX.Helpers.Android,
  AndroidApi.Helpers,
  AndroidApi.JNI.JavaTypes,
  AndroidApi.JNIBridge,
  AndroidApi.JNI.GraphicsContentViewText,
  Android.os.PowerManager;

function HasPermission(const Permission: string): Boolean;
begin
  Result := TAndroidHelper.Context.checkSelfPermission(StringToJString(Permission))
    = TJPackageManager.JavaClass.PERMISSION_GRANTED;
end;
var
  PowerObj: JObject;
  PowerManager: JPowerManager;
begin
  if HasPermission('android.permission.WAKE_LOCK') then // доступ есть
  begin
    if HasPermission('android.permission.REBOOT') then // доступа НЕТ
    begin
      PowerObj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.POWER_SERVICE);
      PowerManager := TJPowerManager.Wrap((PowerObj as ILocalObject).GetObjectID);
      PowerManager.reboot(nil);
    end else 
	  Log.d('android.permission.REBOOT == DENIED');
  end
  else
    Log.d('android.permission.WAKE_LOCK == DENIED');

если убираем проверку разрешения REBOOT

Цитата

Project prjPower.apk raised exception class EJNIFatal with message 'Invoke error: method not found'.

https://developer.android.com/reference/android/Manifest.permission.html#REBOOT

Цитата

REBOOT

Required to be able to reboot the device.

Not for use by third-party applications.

Constant Value: "android.permission.REBOOT"

 

этот способ только для системы, извне его не вызвать.

Есть еще два способа

1) через SuperUser (Только этот способ остается)

2) через Intent (отменяется)

Цитата

ACTION_REBOOT

Broadcast Action: Have the device reboot. This is only for use by system code.

This is a protected intent that can only be sent by the system.

Constant Value: "android.intent.action.REBOOT

 

Ссылка на комментарий
  • 0
2 часа назад, ZuBy сказал:

1) через SuperUser (Только этот способ остается)

С помощью Runtime.getRuntime()?

TJRuntime.JavaClass.getRuntime().exec(StringToJString('su -c reboot'));

Я пробовал в разных вариациях, у меня error exec при выполнении. Работающий пример никак не могут найти.

Изменено пользователем Makaroff
Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Makaroff сказал:

С помощью Runtime.getRuntime()?

TJRuntime.JavaClass.getRuntime().exec(StringToJString('su -c reboot'));

Я пробовал в разных вариациях, у меня error exec при выполнении.

а перед этим, запрос на su делали?

Ссылка на комментарий
  • 0

А без SuperSU вообще никаких вариантов? На "чистом" устройстве?

Это тоже не прокатит?: https://stackoverflow.com/questions/3635101/how-to-sign-android-app-with-system-signature

Изменено пользователем Makaroff
Ссылка на комментарий
  • 0
  • Модераторы
18 минут назад, Makaroff сказал:

А без SuperSU вообще никаких вариантов? На "чистом" устройстве?

нет, и это правильно

Я бы не хотел чтобы любое приложение могло перезагрузить девайс

Ссылка на комментарий
  • 0
35 минут назад, ZuBy сказал:

Я бы не хотел чтобы любое приложение могло перезагрузить девайс

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

В любом случае спасибо за помощь.

Изменено пользователем Makaroff
Ссылка на комментарий
  • 0
  • Модераторы
1 минуту назад, Makaroff сказал:

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

разрешения сделаны в том числе для фильтрации в маркете, а обычный юзер не смотрит на них. для него это просто кнопка "Принять"

в андроид 6 сделали запрос на использование этого функционала (слизали у эпл конечно, но это правильный ход)

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...