2012-11-27 20 views
5

アプリケーションに含まれているアプリケーションと同じ証明書で署名されていないアプリケーションがサービスにバインドされないようにしようとしています。このために、要素を使用してマニフェスト(サービスを含むアプリケーションの)に新しいパーミッションを宣言し、新しいパーミッションのprotectionLevelをSignatureに示すように設定しました。この新しい権限をサービスにバインドするために必要とされるように許可属性:android:protectionLevel = "signature"を使用した問題

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

はその後、サービスのマニフェスト宣言で、私はアンドロイドを使用しています。

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

他のアプリケーションからこのサービスにアクセスしようとしています。この2番目のアプリケーションのマニフェストでは、<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は彼の答えに修正案を含むように変更

EDIT

+0

マニフェストから 'android:protectionLevel =" signature "を削除するとサービスにバインドできますか? – lenik

+0

最初のアプリケーションのマニフェストからandroid:protectionLevel = "signature"を削除すると、2番目のアプリケーションのサービスにバインドできます。 – user1400538

答えて

3

あなたの要求されたアクセス権は、次のとおりです。

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

とログは言う:あなたは両方のケースで "OMRS" または "OMR" を使用することを決定しなければならない

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

、一つの "S" は余分です。

+1

必要に応じてdownvoteできます。私はセキュリティ上の理由からパッケージ名を変更しました。私は間違っていました。 – user1400538

+0

@ user1400538投票について気にしません。スペルミスを修正するために質問を編集してください。 – lenik

5

あなたの現在の実装では、インストール名が重要であるというlenikの解決策に加えて、クライアントをインストールする前に、最初にサービス(<permission>が定義されている)をインストールする必要があります。そうしないと、クライアントは認識できないアクセス許可のために<uses-permission>をAndroidが無視するため、許可を受け取りません。 <permission>要素をの両方に同じ値を持つ個のアプリケーションに入れると、インストールの順序は問題になりません。

+0

私の質問で説明したシナリオでは、サービス(が定義されている)が、私がアクセスできるカスタムROMの一部として構築されたアプリケーションの一部であり、クライアントが電話機にインストールするアプリケーション通常のアンドロイドアプリケーションとして、これは上記の許可の問題を与えるでしょうか? – user1400538

関連する問題