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

Специальные разрешения


x11

Вопрос

Как оказалось, на китайских смартфонах типа Сяоми, Мейзу и даже в Самсунг есть специальный менеджер, который принудительно прибивает приложения и даже службы, чтобы те не пожирали заряд АКБ.

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

Я так понимаю, что это что-то своё, фирменное, а не Андроида.

Внимание, вопрос. Как туда добавить своё приложение/службу?

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

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

  • 0

Такое поведение на Андроиде с 5 версии.

function GetPowerManager: JPowerManager;
var
  PowerServiceNative: JObject;
begin
  PowerServiceNative := TAndroidHelper.Context.getSystemService
    (TJContext.JavaClass.POWER_SERVICE);
  if not Assigned(PowerServiceNative) then
    raise Exception.Create('Could not locate Power Service');
  Result := TJPowerManager.Wrap((PowerServiceNative as ILocalObject)
    .GetObjectID);
  if not Assigned(Result) then
    raise Exception.Create('Could not access Power Manager');
end;

//Intent: JIntent;
if TJBuild_VERSION.JavaClass.SDK_INT >= 23 then
begin
	pw := GetPowerManager;
	if Assigned(pw) then
	  if not pw.isIgnoringBatteryOptimizations
		(StringToJString('ВАШ ПАКЕТ')) then
	  begin
		Intent := TJIntent.Create;
		try
		  Intent.setAction
			(TJSettings.JavaClass.
			ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
		  Intent.setData(TJnet_Uri.JavaClass.parse
			(StringToJString('package:ВАШ ПАКЕТ')));
		  TAndroidHelper.Context.startActivity(Intent);
		except
		  on e: Exception do
			fgToast(e.Message, 3);
		end;
	  end;
end;

 

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

В 5ой версии приложение не закрывается. А вот начиная с 6ой...

Дело в том, что у разных производителей это всё живёт в разных пунктах меню даже и там настройки разные и по разному обзываются.

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

r@di0, спасибо, а куда эту функцию вставлять, где и как правильно использовать? В какой момент, в каком событии?

При старте приложения? Один раз при первом запуске или постоянно?

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

И ещё вопрос. Нужны ли какие-то доп. разрешения указывать в настройках проекта для этой функции?

WAKELOCK (Wake lock) - это оно?

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Uses_Permissions

Изменено пользователем x11
Ссылка на комментарий
  • 0
4 часа назад, x11 сказал:

В общем.... r@di0, это не совсем то или даже совсем не то, что нужно.

Пожалуйста, поясните почему не то, и что всё же Вам действительно нужно. Надеюсь ответ займет менее 10 дней )

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

Потому что разрешение WAKELOCK - это для того, чтобы приложение не давало устройству заснуть, а не для того, чтобы устройство не прибивало приложение.

И вот ещё ответ на др. форуме: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1299268&msg=21591594

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

Вы вообще пробовали приведенный код? Он не имеет отношения к WakeLock, а как раз добавляет приложение в WhiteList.
Если Вы хотите сделать "неубиваемое" приложение, то Вам не получится обойтись каким-то легким решением. Особенно если приложению необходимо использовать сеть. Почитайте про doze mode.
Можете ещё посмотреть эту статью: http://delphiworlds.com/2018/01/monitoring-location-updates-on-android/
Там предпринята попытка сделать подобное "неубиваемое" приложение.

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

Вы вообще пробовали приведенный код? Он не имеет отношения к WakeLock, а как раз добавляет приложение в WhiteList.

Ещё не пробовал.

Ссылка на комментарий
  • 0
В 12.07.2018 в 09:50, r@di0 сказал:

(StringToJString('ВАШ ПАКЕТ')) then

 

В 12.07.2018 в 09:50, r@di0 сказал:

(StringToJString('package:ВАШ ПАКЕТ')));

 

Сразу задам ещё вопрос.

Если вышеуказанную процедуру нужно вставлять в DataModule службы, то какой пакет прописывать: пакет основного приложения или пакет службы? У них ведь разные названия.

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

Здесь

https://stackoverflow.com/questions/40640352/dialog-for-intent-settings-action-request-ignore-battery-optimizations

написано, что нужно добавлять такое разрешение:

<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

 

и здесь похожая проблема

https://forums.embarcadero.com/thread.jspa?messageID=896940

Изменено пользователем x11
Ссылка на комментарий
  • 0
В 21.07.2018 в 18:45, x11 сказал:

r@di0, спасибо, а куда эту функцию вставлять, где и как правильно использовать? В какой момент, в каком событии?

При старте приложения? Один раз при первом запуске или постоянно? 

 

Я понял. Нужно в приложении где-нибудь создать кнопку/меню. Эта функция будет вызывать системное окно Андроида, где и нужно выбрать один из двух пунктов: "Экономия заряда батареи".

Там 2 одинаковых, но значки разные. Я сперва выбрал то, что с зелёной иконкой и получил ошибку - приложение "Экономия заряда батареи" вызвало ошибку и будет закрыто.

А вот выбрав второе, я получил ещё запрос: Не ограничивать расход батареи? И там выбрал Да. И моё приложение только после этого попало в "белый список". Т.е. всё равно надо пользователю что-то выбирать.

Screenshot_1.png

Ссылка на комментарий
  • 0
В 22.07.2018 в 08:15, x11 сказал:

В общем.... r@di0, это не совсем то или даже совсем не то, что нужно.

 

Установил приложение на Сяоми с Андроид 7.0.

Выполнил код и Андроид выдал запрос, где я ответил Да.

Потом полез в настройки Андроида, а там всё равно "Стандартное ограничение".

Получается, что это какое-то своё собственное ограничение или совмещённое с Андроидом?

 

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

Или в процедуре нужно применить/передать какую-то другую константу?

Screenshot_10.png

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

В общем, нужно писать сервис "правильный", который будет запускаться гугл-сервисами или через манифест, чтобы вызывалась твой процедура через BroadcastReceiver, ну т.е. чтобы сервис оживал только во время нужного события.

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

В общем, я создал новую тему с целю переписать немного принцип запуска службы

http://fire-monkey.ru/topic/5168-процедура-в-сервисе-через-broadcastreceiver/

 

Изменено пользователем x11
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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