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