Проблема с использованием android: protectionLevel = подпись

Я пытаюсь предотвратить привязку приложений к службе, если они не подписаны тем же сертификатом, что и содержащее приложение. Для этого я объявил новое разрешение в манифесте (приложения, содержащего Сервис) с помощью элемента и установил для параметра protectionLevel нового разрешения значение Подпись, как показано.

<permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"
android:protectionLevel="signature"></permission>

<uses-permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"/>

Затем в декларации манифеста для Службы я использую атрибут android: permission, чтобы это новое разрешение требовалось для привязки к Службе.

<service android:name="jp.co.xyz.bluetooth.profile.TIPServer"
 android:permission="jp.co.abc.android.OMRSSettings.permission.Access" >
<intent-filter>
<action android:name="jp.co.xyz.bluetooth.api.ICommonResultCallback" />
<action android:name="jp.co.xyz.bluetooth.api.ITimeServer" />
</intent-filter>

Я пытаюсь получить доступ к этой службе из другого приложения. В манифесте этого второго приложения я добавляю <uses-permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"/> и пытаюсь выполнить привязку к службе первого приложения.

Но у меня есть следующее исключение.

01-02 00:06:54.531: INFO/PowerManagerService(425): Start Light.setBrightness(), [20],  [3]
01-02 00:06:56.473: INFO/PowerManagerService(425): Start Light.setBrightness(), [130], [3]
01-02 00:06:58.055: WARN/dalvikvm(4956): threadid=1: thread exiting with uncaught exception (group=0x40b70390)
01-02 00:06:58.055: WARN/ActivityManager(425): Permission Denial: Accessing service ComponentInfo{jp.co.abc.android.omrsettings/jp.co.xyz.bluetooth.profile.TIPServer} from   pid=4956, uid=10158 requires jp.co.abc.android.OMRSSettings.permission.Access
01-02 00:06:58.065: ERROR/AndroidRuntime(4956): FATAL EXCEPTION: main
java.lang.SecurityException: Not allowed to bind to service Intent {     act=jp.co.xyz.bluetooth.api.ITimeServer }
at android.app.ContextImpl.bindService(ContextImpl.java:1187)
at android.content.ContextWrapper.bindService(ContextWrapper.java:370)
at jp.co.abc.middleware.tip.LeTimeServerProfile.startTimeServer(LeTimeServerProfile.java:45)
at jp.co.abc.tip.TimeActivity.onClick(TimeActivity.java:49)
at android.view.View.performClick(View.java:3511)
at android.view.View$PerformClick.run(View.java:14133)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)
01-02 00:06:58.095: WARN/ActivityManager(425): Force finishing activity      jp.co.abc.tip/.TimeActivity

Может ли кто-нибудь сообщить мне, почему у меня проблемы с разрешениями, хотя я правильно объявляю <uses-permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"/> в манифесте моего второго приложения.

Любая помощь горячо приветствуется.

ИЗМЕНИТЬ

Изменено, чтобы включить исправление, предложенное Леником в его ответе.


person user1400538    schedule 27.11.2012    source источник
comment
можно ли привязаться к сервису, если удалить android:protectionLevel="signature" из манифеста?   -  person lenik    schedule 27.11.2012
comment
Если я удалю подпись android: protectionLevel = из манифеста первого приложения, я могу привязаться к службе из второго приложения.   -  person user1400538    schedule 27.11.2012


Ответы (2)


В дополнение к решению lenik, как не испортить имена ваших разрешений, с вашей текущей реализацией имеет значение порядок установки. Вы должны сначала установить службу (где определено <permission>), прежде чем устанавливать клиент. В противном случае клиент не получит разрешение, поскольку Android проигнорирует <uses-permission> для разрешения, которое он не распознает. Если вы поместите элемент <permission> в оба приложения (с одинаковыми значениями), порядок установки больше не будет иметь значения.

person CommonsWare    schedule 27.11.2012
comment
В сценарии, описанном в моем вопросе, если служба (где определено ‹permission›) является частью приложения, которое создается как часть пользовательского ПЗУ, к которому у меня есть доступ, а клиент - это приложение, которое я устанавливаю в телефон как обычное приложение для Android, возникнет ли проблема с разрешением, упомянутая выше? - person user1400538; 28.11.2012

ваше запрошенное разрешение:

<permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"

и в вашем журнале написано:

requires jp.co.abc.android.OMRSettings.permission.Access

вы должны решить использовать «OMRS» или «OMR» в обоих случаях, одна буква «S» является дополнительной.

person lenik    schedule 27.11.2012
comment
при необходимости вы можете проголосовать против. Я изменил имена пакетов по соображениям безопасности, и там я ошибся - person user1400538; 27.11.2012
comment
@ user1400538 Меня не волнует голосование. Не могли бы вы отредактировать свой вопрос, чтобы исправить орфографические ошибки? - person lenik; 27.11.2012