фонAndroid пользовательских разрешений - Зефир
Исторически Android Персонализированные разрешения have been a mess и were install order dependent, который был известен expose vulnerabilities.
До появления API 21 было нерешенное временное решение, в котором объявлялось пользовательское разрешение другого приложения в вашем манифесте, предоставлялось разрешение ... Однако, поскольку API 21, только одно приложение может объявлять пользовательские разрешения и устанавливать другое приложение, объявляющее это же разрешение, будет предотвращено.
Альтернативами являются переустановка приложения, требующего разрешения, поэтому они обнаруживаются системой, но это is not a good user experience. Или проверьте во время выполнения для разрешений вызывающего приложения, но that is not without its theoretical flaws.
Проблема
На Android Зефира (6.0 - API 23) приложение должно запросить разрешение от пользователя, использовать свое собственное разрешение. Объявленное пользовательское разрешение не предоставляется автоматически.
Это кажется странным, учитывая, что только одно приложение может его объявить.
Для репликации
Объявите пользовательского разрешения и BroadcastReceiver в манифесте.
<permission
android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"
android:description="@string/control_description"
android:icon="@mipmap/ic_launcher"
android:label="@string/control_label"
android:protectionLevel="normal or dangerous"/>
<uses-permission
android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/>
// etc
<receiver
android:name="com.example.app.MyBroadcastReceiver"
android:permission="com.example.app.permission.CONTROL_EXAMPLE_APP">
<intent-filter android:priority="999">
<action android:name="com.example.app.REQUEST_RECEIVER"/>
</intent-filter>
</receiver>
С приложением третьей стороной, заявить, что она использует пользовательское разрешение в манифесте (и принять его с помощью диалога или настройки) и вызовите:
final Intent intent = new Intent("com.example.app.REQUEST_RECEIVER");
context.sendOrderedBroadcast(intent, "com.example.app.permission.CONTROL_EXAMPLE_APP", new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
// getResultCode();
}
}, null, Activity.RESULT_CANCELED, null, null);
Результат будет возвращать ОТМЕНЕН и журнал будет показывать:
system_process Вт/BroadcastQueue: Разрешение отказа: прием Intent { акт = com.example.app.REQUEST_RECEIVER FLG = 0x10 (имеет дополнительные услуги)} до com.example.app/.MyBroadcastReceiver требует com.example.app.permission.CONTROL_EXAMPLE_APP из-отправителя com.example.thirdparty
Если я использую стандартный диалог ActivityCompat.requestPermissions()
, чтобы позволить пользователю принять разрешение , приемник, как и следовало ожидать, работает правильно.
Вопрос
Это ожидаемое поведение? Или я почему-то что-то упустил?
Казалось бы смешно, чтобы поднять диалог, сообщающий
Приложение Пример App хочет разрешение использовать пример приложения
И это может действительно относятся к пользователю, предоставляя им такой бессмысленный запрос.
Я могу, конечно, изменить описание и имя разрешений на то, что они будут принимать, например «общаться с другими установленными приложениями», но прежде чем вздохнуть и принять этот подход, я подумал, что попрошу об этом вопрос.
Примечание
Пример упорядоченной трансляции, чтобы повторить эту проблему. Мое приложение использует другие реализации поставщиков контента и связанную службу. Это не альтернативная реализация, которую я требую, это подтверждение проблемы.
Благодарим за внимание.
Редактировать: Чтобы уточнить, для других реализаций, таких как объявление разрешения на службу (которое было бы наиболее просто реплицироваться), автоматически выдано объявленное пользовательское разрешение.
FWIW, я не могу воспроизвести вашу проблему, по крайней мере, на Android 7.1 (Google Pixel). Я скопировал ваш код в новый проект Android Studio и не испытываю проблем с отправкой трансляции с клиента на приемник и получением ответа. Теперь мой образец может быть проще вашего (например, оба приложения подписаны одним и тем же ключом для подписания). Если вы можете создать пример приложения, которое последовательно воспроизводит эту проблему, и вы можете воспроизвести его на 7.1, [file the issue] (http://b.android.com) против предварительного просмотра разработчика, включая пример приложения и полные инструкции. – CommonsWare
Чтобы быть понятным, вы просите руководство, как запросить разрешение у пользователя разумным образом, что он не будет отрицать? или вы просите предложить решение, когда он отклонит ваше разрешение, какими могут быть возможности? я запутался –
Я думаю, что тот факт, что приложение запрашивает собственное разрешение, можно интерпретировать как «главный переключатель», что-то вроде: «позволить другим приложениям управлять этим приложением». И хотя разрешение должно быть предоставлено в сторонних приложениях (тоже), чтобы иметь возможность контролировать пример приложения, некоторые пользователи могут фактически использовать его, чтобы полностью исключить функцию «управляемости». (Но все же нечетно, что сервис, например, автоматически получает пользовательское разрешение ...) – Gyebro