Intereting Posts
Возможно ли иметь анимированные иконки запуска для приложений Android? Невозможно связать собственную библиотеку в образце OpenCV Android Предотвращение масштабирования фигур в LayeredList без использования растрового изображения ActionBar скрывается при появлении клавиатуры Content: // mms-sms / conversations / return NullPointerException в Android ICS Samsung 3D-анимация между действиями в Android Фоновый оттенок Lollipop не влияет на кнопку Android.os.networkonmainthreadexception внутри новой темы Веб-страница сбой Android-браузеров Исключение при открытии оповещения обозревателя Parse Как узнать, отключено ли текстовое содержимое TextView Изменение изображения контакта на большую фотографию с помощью PHOTO_FILE_ID в Android Как справиться с ограничениями памяти GPU для обработки изображений высокого разрешения на GPU? Фрагменты и уведомления: укажите различные действия из уведомлений; В зависимости от конфигурации экрана Предотвращение обновления активности при изменении ориентации андроидного фрагмента

Включить связь между двумя приложениями Android с помощью пользовательских разрешений

Один из моих приложений для Android требует некоторых функций, которые являются «опасными», когда дело доходит до разрешений. Они требуют некоторых разрешений, таких как «доступ в Интернет», которые имеют решающее значение в сочетании с частными данными.

Вот почему я хочу создать отдельный «Add-on», то есть второе приложение, которое предоставляет эти критически важные функции. Поэтому, если пользователи хотят их, они могут установить надстройку, но основное приложение будет работать без этих разрешений.

Использование sharedUserId , очевидно, будет самым простым решением, но добавив это впоследствии, когда многие пользователи будут использовать приложение уже, могут возникнуть серьезные проблемы. Разве это не означает, что приложение больше не может получить доступ к своим данным?

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

Я думал, что пользовательские разрешения могут решить проблему. Они могут? Я добавил следующее объявление разрешения как для основного приложения, так и для надстройки в качестве дочернего AndroidManifest.xml в тег manifest в AndroidManifest.xml :

 <permission android:name="com.my.package.ADDON" android:label="@string/permission_title" android:description="@string/permission_description" android:permissionGroup="android.permission-group.PERSONAL_INFO" android:protectionLevel="signature" /> 

Кроме того, обе файлы манифеста получили эту часть:

 <uses-permission android:name="com.my.package.ADDON"></uses-permission> 

Дополнительное приложение включает IntentService , у которого теперь есть следующий атрибут:

 android:permission="com.my.package.ADDON" 

Разве это не должно выполняться, чтобы я мог вызвать IntentService из моего основного приложения через этот код?

 Intent addonIntent = new Intent(); addonIntent.setClassName("com.my.package", "com.my.package.MyService"); startService(addonIntent); 

К сожалению, этот вызов всегда терпит неудачу со следующим исключением:

 E/AndroidRuntime(16721): java.lang.SecurityException: Not allowed to start service Intent { cmp=com.mypackage.addon/.MyService } without permission com.mypackage.permission.ADDON 

Что я сделал не так? Заранее большое спасибо!

Добавление №1 – манифест дополнений:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.mypackage.addon"> <uses-sdk android:minSdkVersion="8" /> <permission android:name="com.mypackage.permission.ADDON" android:label="@string/permission_title" android:description="@string/permission_description" android:permissionGroup="android.permission-group.PERSONAL_INFO" android:protectionLevel="signature" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:permission="com.mypackage.permission.ADDON" android:exported="true"> <service android:enabled="true" android:name=".MyService" /> </application> </manifest> 

Дополнение № 2 – основной манифест приложения:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.mypackage.mainapp"> <uses-sdk android:minSdkVersion="8" /> <permission android:name="com.mypackage.permission.ADDON" android:label="@string/permission_title" android:description="@string/permission_description" android:permissionGroup="android.permission-group.PERSONAL_INFO" android:protectionLevel="signature" /> <uses-permission android:name="com.mypackage.permission.ADDON"></uses-permission> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name="MyApp"> <activity android:name=".MainActivity" android:launchMode="singleTask" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Разве это не означает, что приложение больше не может получить доступ к своим данным?

Верный.

Я добавил следующее разрешение

Я бы сбросил группу permission-group , поскольку это не обязательно.

Кроме того, оба файла манифеста получили эту часть сейчас

Может потребоваться только тот, кто IntentService ваш IntentService .

Разве это не должно выполняться, чтобы я мог вызвать IntentService надстройки из моего основного приложения через этот код?

Нет, если IntentService не экспортируется. Убедитесь, что у вашего IntentService есть <intent-filter> или android:exported="true" . Я бы порекомендовал идти по маршруту <intent-filter> , чтобы вы могли объявить и использовать пользовательскую строку действий, поэтому вы уходите от жесткого кодирования и имен классов в клиентском приложении.

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