首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >意图权限和JobIntentService

意图权限和JobIntentService
EN

Stack Overflow用户
提问于 2017-06-18 14:19:55
回答 2查看 1.8K关注 0票数 0

我有一个应用程序A,它向应用程序B发送一个意图。app有一个文件提供程序,并将一个文件共享给B。它将授权添加到这个意图中,它在B.B上启动一个服务,有一个IntentService并处理这个意图。现在,我想根据新的Android政策将B改为使用JobIntentService。但是我不能从A调用startService,所以我修改了代码以发送显式广播。我在剪贴图中添加了uri。然而,当我收到应用程序B的意图时,我有一个安全异常。

应用程序A:

代码语言:javascript
复制
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:

代码语言:javascript
复制
@Override
public void onReceive(Context arg0, Intent arg1) {
    if (MyService.INTENT_UPDATE.equals(arg1.getAction())) {
        MyService.enqueueWork(arg0, arg1);
    }
}

堆叠:

代码语言:javascript
复制
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。反正一点用也没有。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-18 16:08:03

好吧,我发现问题了。广播接收器不接收权限,也不能调用startService,因此在这种情况下,您只有一种棘手的方法来使用作业服务。我创建了一个no显示活动来转发意图:

代码语言:javascript
复制
public class ProxyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyService.enqueueWork(this, getIntent());
        finish();
    }
}

但是,我并不完全确定这个解决方案,因为该活动每次只能发送一个意图。如果你有多重意图是个问题。您可以使用带有单个实例的launchMode,并使用onHandleIntent(),这是一个好主意,但您不能再使用主题--没有显示--而且您也不知道什么时候可以调用finish()。

编辑:,正如Ian (谷歌)所解释的“您找到的...as,URI权限确实可以通过传递ClipData链接到其他组件。”当您在Api setData()上使用setData()或setDataAndType()时,系统会自动创建clip数据,这就解释了为什么它能工作,但是仍然存在单一意图的问题。

Edit2: --我找到了一个更好的解决方案--至少在我的例子中--使用brodcast接收器,但是调用者使用context.grantUriPermissions()方法。

票数 1
EN

Stack Overflow用户

发布于 2017-06-18 14:30:06

FileProvider的文档里他们说

内容URI允许您使用临时访问权限授予读和写访问权限。当创建包含内容URI的意图时,为了将内容URI发送到客户端应用程序,还可以调用Intent.setFlags()来添加权限。只要接收活动的堆栈处于活动状态,客户端应用程序就可以使用这些权限。对于要使用服务的意图,只要服务正在运行,权限就可用。

我的猜测是,当您退出广播接收器的onReceive方法时,权限就没有了。

解决方案:事实证明,问题是不支持广播接收器,而且您只能针对活动和服务,就像文档中提到的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44615930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档