android 启动服务权限,从android启动服务时的权限问题

我已经将服务编写为应用程序的一部分。 我尝试使用以下代码从第二个应用程序调用此服务:

Intent intent = new Intent () ; intent.setClassName("com.test" ,"com.test.DownloadService") ; // Create a new Messenger for the communication back Messenger messenger = new Messenger(handler); intent.putExtra("MESSENGER", messenger); intent.setData(Uri.parse("http://www.vogella.com/index.html")); intent.putExtra("urlpath", "http://www.vogella.com/index.html"); this.startService(intent);

它给出了以下例外07-10 09:27:28.819: ERROR/AndroidRuntime(4226): FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.inject/com.inject.MyActivity}: java.lang.SecurityException: Not allowed to start service Intent { dat=http://www.vogella.com/index.html cmp=com.test/.DownloadService (has extras) } without permission not exported from uid 10109 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1971) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1996) at android.app.ActivityThread.access$700(ActivityThread.java:126) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1156) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4458) 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:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.SecurityException: Not allowed to start service Intent { dat=http://www.vogella.com/index.html cmp=com.test/.DownloadService (has extras) } without permission not exported from uid 10109 at android.app.ContextImpl.startService(ContextImpl.java:1122) at android.content.ContextWrapper.startService(ContextWrapper.java:359) at com.inject.MyActivity.onCreate(MyActivity.java:28) at android.app.Activity.performCreate(Activity.java:4465) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1935) ... 11 more

为什么会出现此权限问题?

当我从同一个应用程序调用服务时,以下代码非常有效:

Intent intent = new Intent(this, DownloadService.class); // Create a new Messenger for the communication back Messenger messenger = new Messenger(handler); intent.putExtra("MESSENGER", messenger); intent.setData(Uri.parse("http://www.vogella.com/index.html")); intent.putExtra("urlpath", "http://www.vogella.com/index.html"); startService(intent);

有人可以告诉我为什么当我从另一个应用程序调用该服务时出现此权限问题,尽管我已经在App2的清单中提供了所有必需的权限。

编辑

App2的清单

包含服务的App1的清单

该服务不可用于其他应用程序,因为您尚未明确提供该服务。 您的服务需要像这样定义:

您不需要任何额外的权限(除非您想使用它们)

你看过文件吗? 这个问题非常清楚:

在清单标签中声明服务时,可以强制执行对服务的全局访问。 通过这样做,其他应用程序将需要在其自己的清单中声明相应的元素,以便能够启动,停止或绑定到服务。

从GINGERBREAD开始,当使用Context.startService(Intent)时,您还可以在Intent上设置Intent.FLAG_GRANT_READ_URI_PERMISSION和/或Intent.FLAG_GRANT_WRITE_URI_PERMISSION。 这将授予服务临时访问Intent中特定URI的权限。 在服务为该启动命令或更高版本命令调用stopSelf(int)之前,或者直到服务已完全停止,访问将一直保持。 这适用于授予对未请求保护服务权限的其他应用程序的访问权限,或甚至根本不导出服务的权限。

此外,服务可以通过在执行该调用的实现之前调用checkCallingPermission(String)方法来保护具有权限的单个IPC调用。

有关权限和安全性的更多信息,请参阅“安全性和权限”文档。

如果您在阅读文档后仍有权限问题,请向我们展示您的AndroidManifest.xml 。 另请参阅清单中服务的exported和permission属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值