Разрешения настроек Android не действуют так, как должны

#java #android #android-intent #android-permissions #android-settings

#java #Android #android-намерение #android-разрешения #android-настройки

Вопрос:

Мне нужно запросить разрешение у пользователя. Одно из разрешений, которое мне нужно ACTION_MANAGE_OVERLAY_PERMISSION , а другое Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION . Когда вы запрашиваете его, как вы можете видеть в приведенном ниже коде, он выводит пользователя на экран настроек, чтобы пользователь мог отметить галочкой разрешение оттуда.

 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
        Uri.parse("package:"   getPackageName()));
startActivityForResult(intent, OVERLAY_PERMISSION_REQUEST_CODE);
 

На некоторых телефонах Android и версиях Android он перенаправляет пользователя прямо к конкретной настройке приложения (приложение, из которого оно вызывается), на других устройствах он открывает список приложений, из которых пользователь должен найти приложение, а затем отметить разрешение. В большинстве случаев на андроидах младше 10 открывается окно настроек конкретного приложения, а когда оно равно 10 или выше, открывается список.
Есть ли способ заставить его последовательно открывать текущие настройки приложения, которые открыты?

Я попытался добавить:

 intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"   getApplicationContext().getPackageName()));
 

Но это тоже не помогло.

И, во-вторых, есть ли способ запросить это и другие Settings разрешения, не открывая Settings меню, а вместо того, чтобы делать это в диалоговом окне внутри приложения?
Если нет, то есть ли способ запрашивать несколько Settings разрешений одно за другим, потому что для моего приложения требуются Settings разрешения двух типов.

Редактировать

Вот что я имел в виду под конкретными настройками приложения по сравнению со списком.

Весь список приложенийКонкретное приложение

На левой картинке перечислены все приложения, а на правой картинке открыто конкретное приложение (происходит, если вы нажмете на приложение в списке).

Теперь в некоторых случаях он напрямую открывает правую картинку, но в основном он открывает левую. Есть ли способ принудительно открывать нужное изображение в любое время?

Комментарии:

1. «Есть ли способ заставить его последовательно открывать текущие настройки приложения, которые открыты?» — что вы подразумеваете под «текущими открытыми настройками приложения»? «есть ли способ запросить разрешения для этого и других настроек, не открывая меню настроек, а вместо того, чтобы делать это в диалоговом окне внутри приложения? » — нет. «моему приложению требуются два разрешения типа настроек» — возможно, вам следует пересмотреть их использование. Например, системные наложения сегодня недоступны на некоторых устройствах Android, и я не удивлюсь, если в будущем они будут заблокированы для всех.

2. @CommonsWare отредактировал вопрос, чтобы указать «Есть ли способ сделать это …». Спасибо за другие ответы.

Ответ №1:

Есть ли способ принудительно открывать нужное изображение в любое время?

Нет.

Приложение настроек обычно существенно изменяется производителем устройства. Они могут делать все, что захотят. Это включает в себя игнорирование Uri или прямое удаление стороннего доступа к этому экрану, где последнее — это то, о чем предупреждает документация:

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

Если вы создаете свою собственную прошивку для Android, вы можете убедиться, что это Intent действие работает так, как вы хотите, для любых устройств, на которых установлена ваша прошивка.

Комментарии:

1. В качестве последующего вопроса, если вы знаете. Можно ли как-то проверить, будет ли Uri игнорироваться при запросе этого разрешения или нет. Поэтому, если это будет проигнорировано, я бы сначала сказал пользователю, как найти приложение и включить его.

2. @Richard: «Можно ли каким-то образом проверить, будет ли игнорироваться Uri при запросе этого разрешения или нет» — вы бы знали, <intent-filter> не включает package ли схема, поскольку startActivity() вызов просто не сможет найти совпадение. Однако, если приложение <intent-filter> объявляет, что оно принимает Uri , у вас нет возможности узнать, что приложение делает с этим Uri , включая его игнорирование.