【问题标题】:Issue using android:protectionLevel="signature"使用 android:protectionLevel="signature" 的问题
【发布时间】:2012-11-27 12:22:02
【问题描述】:

如果应用程序未使用与包含应用程序相同的证书进行签名,我会尝试阻止它们绑定到服务。为此,我使用一个元素在(包含服务的应用程序的)清单中声明了一个新权限,并将新权限的 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"/>

然后,在服务的清单声明中,我使用了一个 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>

我尝试从另一个应用程序访问此服务。在第二个应用程序的清单中,我添加了&lt;uses-permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"/&gt; 并尝试绑定到第一个应用程序的服务。

但我得到以下异常。

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

尽管我在第二个应用的清单中正确声明了&lt;uses-permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"/&gt;,但有人可以告诉我为什么我有权限问题。

非常感谢任何帮助。

编辑

修改为包括列尼克在他的回答中建议的更正。

【问题讨论】:

  • 如果你从清单中删除android:protectionLevel="signature",你能绑定到服务吗?
  • 如果我从第一个应用程序的清单中删除 android:protectionLevel="signature",我可以从第二个应用程序绑定到服务

标签: android android-service


【解决方案1】:

除了 lenik 不弄乱您的权限名称的解决方案之外,对于您当前的实施,安装顺序也很重要。在安装客户端之前,您必须先安装服务(其中定义了 &lt;permission&gt;)。否则,客户端将不会收到该权限,因为 Android 将忽略 &lt;uses-permission&gt; 以获得它无法识别的权限。如果您将&lt;permission&gt; 元素放在两个 应用程序中(具有相同的值),安装顺序将不再重要。

【讨论】:

  • 在我的问题中解释的场景中,如果服务(定义 的地方)是应用程序的一部分,该应用程序是作为我有权访问的自定义 ROM 和客户端的一部分构建的我在手机中安装的应用程序是普通的android应用程序,这会出现上述权限问题吗?
【解决方案2】:

您请求的权限是:

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

你的日志说:

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

你应该决定在这两种情况下使用“OMRS”还是“OMR”,一个“S”是额外的。

【讨论】:

  • 如果需要,您可以投反对票。出于安全原因,我修改了包名称,但我拼错了
  • @user1400538 我不关心投票,请您编辑您的问题以纠正拼写错误吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
相关资源
最近更新 更多