2012-11-27 50 views
5

我試圖阻止應用程序綁定到服務,如果他們沒有使用與包含應用程序相同的證書籤名。爲此,我通過使用元素在清單(包含服務的應用程序的清單)中聲明瞭新權限,並將新權限的protectionLevel設置爲Signature,如圖所示。使用android的問題: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:權限屬性,使這個新的許可是需要綁定服務。

<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"/>

任何幫助,非常感謝。

編輯

修改,以包括校正lenik建議在他的回答。

+0

如果您從清單中刪除'android:protectionLevel =「signature」',您可以綁定到服務嗎? – lenik

+0

如果我從第一個應用程序的清單中刪除android:protectionLevel =「簽名」,我可以綁定到來自第二個應用程序 – user1400538

回答

3

您請求的權限:

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

和你的日誌說:

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

,你應該決定使用這兩種情況 「OMRS」 或 「OMR」,一個 「S」 是多餘的。

+1

的服務,如果需要可以倒計時。我出於安全原因修改了軟件包名稱,並且在那裏我拼錯 – user1400538

+0

@ user1400538我不關心投票,請問您是否可以編輯您的問題來糾正拼寫錯誤? – lenik

5

除了lenik的解決方案,不要搞亂您的權限名稱,在您當前的實施中,安裝順序很重要。在安裝客戶端之前,您必須先安裝服務(其中定義了<permission>)。否則,客戶端將不會收到該權限,因爲Android會忽略<uses-permission>以獲取其無法識別的權限。如果您將<permission>元素放入兩個應用程序(具有相同的值),則安裝順序將不再起作用。

+0

在我的問題中解釋的場景中,如果服務(其中定義了)是作爲自定義ROM的一部分構建的應用程序的一部分,我可以訪問該應用程序,並且客戶端是我在手機中安裝的應用程序作爲一個正常的Android應用程序,這是否會給出上述權限問題? – user1400538