android.os.FileUri在将包含Uri的意图中继到文件时会暴露异常

android.os.FileUri在将包含Uri的意图中继到文件时会暴露异常,android,exception,android-intent,Android,Exception,Android Intent,基本上,我正在尝试做“”所做的事情。将“系统共享”对话框替换为自定义对话框 在某些情况下,它起作用,但在另一些情况下,它不起作用 例如,如果我转到相机应用程序并共享照片,我的应用程序将自动调用,并显示一个对话框,其中包含可用于共享照片的已安装目标应用程序。因此,如果我点击Gmail图标,我在一个RecyclerView中看到了这个图标,Gmail就会打开,照片就会出现在草稿中 购买如果我尝试对来自其他应用程序的csv文件执行相同操作,在我的情况下,我尝试告诉“”我想要共享备份,以便通过Gmail

基本上,我正在尝试做“”所做的事情。将“系统共享”对话框替换为自定义对话框

在某些情况下,它起作用,但在另一些情况下,它不起作用

例如,如果我转到相机应用程序并共享照片,我的应用程序将自动调用,并显示一个对话框,其中包含可用于共享照片的已安装目标应用程序。因此,如果我点击Gmail图标,我在一个RecyclerView中看到了这个图标,Gmail就会打开,照片就会出现在草稿中

购买如果我尝试对来自其他应用程序的csv文件执行相同操作,在我的情况下,我尝试告诉“”我想要共享备份,以便通过Gmail发送给我,然后我的应用程序会收到共享请求(请记住,它将替换操作系统提供的共享对话框),然后当它尝试启动Gmail并转发意图时,然后发生错误

这是日志:

03-06 18:24:45.756 E/SharerAct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
03-06 18:24:45.757 W/SharerAct: INSERT INTENT: Intent { act=android.intent.action.CHOOSER flg=0x10800000 cmp=org.example.android.my_app_name.app/.ui.activities.Insert (has extras) }
03-06 18:24:45.757 W/SharerAct: INSERT ACTION: android.intent.action.CHOOSER
03-06 18:24:45.757 W/SharerAct: INSERT TYPE: null
03-06 18:24:45.757 W/SharerAct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
03-06 18:24:45.758 W/SharerAct: INSERT BUNDLE -> android.intent.extra.INITIAL_INTENTS -- [Landroid.os.Parcelable;@fa03561 -- ([Landroid.os.Parcelable;)
03-06 18:24:45.759 W/SharerAct: INSERT BUNDLE -> android.intent.extra.INTENT -- Intent { act=android.intent.action.SEND typ=text/csv flg=0x1 clip={text/csv T:https://play.google.com/store/apps/details?id=net.cachapa.libra} (has extras) } -- (android.content.Intent)
03-06 18:24:45.759 W/SharerAct: INSERT BUNDLE -> android.intent.extra.TITLE -- Datenbank exportieren -- (java.lang.String)
03-06 18:24:45.759 E/SharerAct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
03-06 18:24:45.759 W/SharerAct: INSERT INNER INTENT: Intent { act=android.intent.action.SEND typ=text/csv flg=0x1 clip={text/csv T:https://play.google.com/store/apps/details?id=net.cachapa.libra} (has extras) }
03-06 18:24:45.760 W/SharerAct: INSERT INNER ACTION: android.intent.action.SEND
03-06 18:24:45.760 W/SharerAct: INSERT INNER TYPE: text/csv
03-06 18:24:45.760 W/SharerAct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
03-06 18:24:45.761 W/SharerAct: INSERT INNER BUNDLE -> android.intent.extra.SUBJECT -- Libra Database: 2017-03-06 -- (java.lang.String)
03-06 18:24:45.761 W/SharerAct: INSERT INNER BUNDLE -> android.intent.extra.TEXT -- https://play.google.com/store/apps/details?id=net.cachapa.libra -- (java.lang.String)
03-06 18:24:45.762 W/SharerAct: INSERT INNER BUNDLE -> android.intent.extra.STREAM -- file:///storage/emulated/0/Android/data/net.cachapa.libra/cache/Libra_2017-03-06.csv -- (android.net.Uri$StringUri)
03-06 18:24:45.762 E/SharerAct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
03-06 18:24:45.773 W/SharerAct: SharerActivity: finish
03-06 18:24:45.810 W/ChooserAct: #################################################
03-06 18:24:45.810 W/ChooserAct: ChooserAct: onCreate, sis: null
03-06 18:24:45.810 W/ChooserAct: #################################################
03-06 18:24:45.810 V/FA: onActivityCreated
03-06 18:24:45.841 E/ShrTrgtActvtsAdapter:  ---> Android Beam
03-06 18:24:45.854 E/ShrTrgtActvtsAdapter:  ---> In Google Drive speichern
03-06 18:24:45.865 E/ShrTrgtActvtsAdapter:  ---> Gmail
03-06 18:24:45.874 E/ShrTrgtActvtsAdapter:  ---> Per LAN
03-06 18:24:45.878 E/ShrTrgtActvtsAdapter:  ---> ES Speichern unter
03-06 18:24:45.886 E/ShrTrgtActvtsAdapter:  ---> Inbox
03-06 18:24:45.895 E/ShrTrgtActvtsAdapter:  ---> FolderSync

//... later, after clicking on Gmail

03-06 18:24:54.926 E/AndroidRuntime: FATAL EXCEPTION: main
 Process: org.example.android.my_app_name.app, PID: 21298
 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/net.cachapa.libra/cache/Libra_2017-03-06.csv exposed beyond app through ClipData.Item.getUri()
     at android.os.StrictMode.onFileUriExposed(StrictMode.java:1796)
     at android.net.Uri.checkFileUriExposed(Uri.java:2346)
     at android.content.ClipData.prepareToLeaveProcess(ClipData.java:845)
     at android.content.Intent.prepareToLeaveProcess(Intent.java:8941)
     at android.content.Intent.prepareToLeaveProcess(Intent.java:8926)
     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
     at android.app.ContextImpl.startActivity(ContextImpl.java:791)
     at android.app.ContextImpl.startActivity(ContextImpl.java:768)
     at android.content.ContextWrapper.startActivity(ContextWrapper.java:356)
     at org.example.android.my_app_name.app.ui.adapters.ShareTargetActivitiesAdapter$ViewHolder$1.onClick(ShareTargetActivitiesAdapter.java:95)
     at android.view.View.performClick(View.java:5637)
     at android.view.View$PerformClick.run(View.java:22429)
     at android.os.Handler.handleCallback(Handler.java:751)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:154)
     at android.app.ActivityThread.main(ActivityThread.java:6119)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
因此,
SharerAct
android.intent.action.CHOOSER
“广播”做出反应,获取存储在
android.intent.extra.intent
中的意图,并在完成之前将该意图转发给
ChooserAct

ChooserAct
,一个以对话框为主题的活动,然后通过在RecyclerView中填充目标来构建对话框,这些目标是通过调用
pm.querytentActivities(iContent,PackageManager.MATCH_DEFAULT_)获得的在该转发意图上

单击目标应用程序时,将执行以下代码

m_llLayout.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View view) {
        int iPosition = (int)view.getTag(R.string.tag_index);
        PackageManager pm = MyApplication.getAppContext().getPackageManager();
        ResolveInfo info = m_ailIRItems.get(iPosition).m_riInfo;
        ActivityInfo activityInfo = info.activityInfo;
        m_iIntent.setClassName(activityInfo.packageName, activityInfo.name); // <- see this?
        m_iIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        //m_iIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //m_iIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        MyApplication.getAppContext().startActivity(m_iIntent);
        m_dlgAactivityChooser.finish();
    }
});
我的路在哪里

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="files" path="MyAppsHomeFolder/" />
    <external-path name="external_files" path="."/>
</paths>

最初,我只在那里列出了
MyAppsHomeFolder/
,因为我在那里存储了备份和只属于应用程序的东西。但在试图解决当前问题的同时,我现在还添加了

所以,我对如何处理这个
android.os.FileUriExposedException
一无所知

我认为这与存储在
/storage/emulated/0/Android/data
文件夹的受保护存储中的文件有关。但是“andmakeshare”能够依赖于共享意图,所以我肯定遗漏了一些东西。

标记内清单文件中带有“${applicationId}.provider”的“org.example.android.my_app_name.files”

我不确定,但它可能会帮助您:)

替换 标记内清单文件中带有“${applicationId}.provider”的“org.example.android.my_app_name.files”


我不确定,但它可能会帮助你:)

说了很多话。但是对于重要的意图,您忽略了代码。请显示内容的所有代码。为什么不在onClick中创建该意图?请这样做。让它成为本地的。不要使用全局指针。我们甚至看不到您是否使用了文件提供程序。1)m_iContent是recyclerview适配器类的本地内容,该类中包含onClick。我也可以将它附加到
mlllayout.setTag()
上,但不需要它。2)不在onClick中创建,因为它是在
android.intent.action.CHOOSER
广播的
android.intent.extra.intent
中传递给我的。这是为了不修改extras包中包含的任何内容,比如流。(没有更多有用的代码显示)这是我正在传递的一个包裹。
,然后Gmail打开,照片在草稿中。
。你不会在那里得到/使用一个文件uri,而是一个内容方案。你只会在Android 7下得到一个文件uri ExposedException,不是吗?很多人都在谈论。但是对于重要的意图,您忽略了代码。请显示内容的所有代码。为什么不在onClick中创建该意图?请这样做。让它成为本地的。不要使用全局指针。我们甚至看不到您是否使用了文件提供程序。1)m_iContent是recyclerview适配器类的本地内容,该类中包含onClick。我也可以将它附加到
mlllayout.setTag()
上,但不需要它。2)不在onClick中创建,因为它是在
android.intent.action.CHOOSER
广播的
android.intent.extra.intent
中传递给我的。这是为了不修改extras包中包含的任何内容,比如流。(没有更多有用的代码显示)这是我正在传递的一个包裹。
,然后Gmail打开,照片在草稿中。
。你不会在那里得到/使用一个文件uri,而是一个内容方案。你只会在Android 7下得到一个FileUriExposedException,不是吗?
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="files" path="MyAppsHomeFolder/" />
    <external-path name="external_files" path="."/>
</paths>