我有一个应用程序 A 向应用程序 B 发送意图。应用程序 A 有一个文件提供程序并与 B 共享一个文件。它将授权添加到意图并在 B 上启动一个服务。B 有一个 IntentService 并处理意图。现在我想根据新的 Android O 策略更改 B 以使用 JobIntentService 。但是我不能从 A 调用 startService,所以我修改了我的代码以发送显式广播。我在剪辑数据中添加了 uri。但是,当我收到有关应用程序 B 的意图时,我遇到了安全异常。
应用程序 A:
Uri contentUri = FileProvider.getUriForFile(this, "com.myotherapp.fileprovider",
newFile);
Intent i = new Intent(INTENT_UPDATE);
ClipData clipData = ClipData.newRawUri(at.name(), contentUri);
i.setClipData(clipData);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
i.setPackage("com.myapp");
sendBroadcast(i);
应用 B:
@Override
public void onReceive(Context arg0, Intent arg1) {
if (MyService.INTENT_UPDATE.equals(arg1.getAction())) {
MyService.enqueueWork(arg0, arg1);
}
}
堆:
Process: com.myapp, PID: 7690
java.lang.RuntimeException: Unable to start receiver com.myapp.MyReceiver: java.lang.SecurityException: UID 10083 does not have permission to content://com.myotherapp.fileprovider/files/Q3hnMrF8BsOJeznpVLizkTB4H6LkI90T.csv [user 0]
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3259)
at android.app.ActivityThread.-wrap17(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6540)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.SecurityException: UID 10083 does not have permission to content://com.myotherapp.fileprovider/files/Q3hnMrF8BsOJeznpVLizkTB4H6LkI90T.csv [user 0]
at android.os.Parcel.readException(Parcel.java:1948)
at android.os.Parcel.readException(Parcel.java:1894)
at android.app.job.IJobScheduler$Stub$Proxy.enqueue(IJobScheduler.java:211)
at android.app.JobSchedulerImpl.enqueue(JobSchedulerImpl.java:53)
at android.support.v4.app.JobIntentService$JobWorkEnqueuer.enqueueWork(JobIntentService.java:314)
at android.support.v4.app.JobIntentService.enqueueWork(JobIntentService.java:472)
at com.myapp.MyService.enqueueWork(MyService.java:41)
at com.myapp.myrec.onReceive(UpdateReceiver.java:21)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3252)
at android.app.ActivityThread.-wrap17(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6540)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
编辑:我尝试在 JobInfo 上使用使用 setClipData 的 JobService。无论如何它根本不起作用。