2016-05-06 2 views
0

У меня есть SDK/Library, который используется в нескольких приложениях. Я хочу, чтобы отправить безопасную трансляцию из SDK в приложение, реализующее его, поэтому я защищаю свою трансляцию с разрешения. Мой SDK определяет разрешение:Повторяющееся разрешение в приложении SDK

<permission android:name="my.sdk.permission.BROADCAST" 
    android:label="my_sdk_permission" 
    android:protectionLevel="signature"/> 
<uses-permission android:name="my.sdk.permission.BROADCAST"/> 

И приложение манифеста:

<receiver android:name="my.receiver.MyReceiver" 
      android:permission="my.sdk.permission.BROADCAST" 
      android:protectionLevel="signature" 
      android:exported="false"> 
      <intent-filter> 
       <action android:name="my.receiver.ACTION" /> 
      </intent-filter> 
     </receiver> 

Однако с этой установкой я иногда получаю ошибки установки нескольких приложений с SDK:

INSTALL_FAILED_DUPLICATE_PERMISSION завивки = my.sdk.permission.BROADCAST pkg = my.otherapp

Я думаю, что мне нужно сделать на сборке, убедитесь, что разрешение установлено на пакет приложения, реализующего SDK, но я не уверен

ответ

1

На Android 5.0+, единственный способ, которым 2+ приложения может иметь элемент <permission> с тем же именем, если приложения подписываются одним и тем же ключом подписи.

В вашем случае просто удалите все материалы разрешений. Приемник не экспортируется, поэтому разрешение никогда не вступит в игру. Вы можете также рассмотреть возможность избавиться от <intent-filter>, поскольку это не требуется для неэкспортируемого компонента. Просто явный Intent.

+0

Спасибо за ваш ответ. Но если я правильно понял, и я удаляю разрешение, любое другое приложение может поймать мою трансляцию, зная ее действие? – vkislicins

+1

@vkislicins: Вот почему вы должны избавиться от '<намерения-фильтра>' и действия. Вызовите 'sendBroadcast()' с явным 'Intent'. Или переключитесь на использование какой-либо встроенной шины событий (например, «LocalBroadcastManager», «EventBus» greenrobot, «Отто» Квадрата). У вас есть сценарий, в котором этот * должен быть * системным, и он должен * использовать неявное 'Intent'? Если вы это сделаете, вы, вероятно, можете использовать манифестные заполнители для получения пользовательского разрешения для каждого приложения, хотя я этого не пробовал, и это может ограничить выбор пользователем вашей IDE. – CommonsWare

+0

Этот последний комментарий чрезвычайно полезен, спасибо. Я думаю, что могу достичь своей цели, сохраняя при этом безопасность, перемещая мой приемник из приложения в sdk, регистрируя его в манифесте sdk и используя явное намерение для отправки сообщения. Затем приложения, реализующие sdk, могут расширять приемник и обрабатывать принятое сообщение по своему усмотрению. – vkislicins

Смежные вопросы