我已经将服务编写为应用程序的一部分。 我尝试使用以下代码从第二个应用程序调用此服务:
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属性。