使用 Intent 共享音频文件

Sharing an audio file using intent

这是我的代码:

Intent share = new Intent(Intent.ACTION_SEND);
share.setType("audio/*");
share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///"+filePath));
startActivity(Intent.createChooser(share, "Share Sound File"));

问题:出于某种原因,当我今天在 nexus 5X API 26 模拟器上检查这段代码时,应用程序崩溃了,而 在我的 Xperia z5 premium(api 25) 上,它就像一个魅力。

此代码是否可能与新 api 不兼容?

logcat-

08-24 15:16:08.445 3050-3050/com.example.tsuryohananov.mycallrecorder E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: com.example.tsuryohananov.mycallrecorder, PID: 3050
                                                                                    android.os.FileUriExposedException: file:////storage/emulated/0/CallRecordings/24.08.2017  02-32-19 PM.m4a exposed beyond app through ClipData.Item.getUri()
                                                                                        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1932)
                                                                                        at android.net.Uri.checkFileUriExposed(Uri.java:2348)
                                                                                        at android.content.ClipData.prepareToLeaveProcess(ClipData.java:941)
                                                                                        at android.content.Intent.prepareToLeaveProcess(Intent.java:9735)
                                                                                        at android.content.Intent.prepareToLeaveProcess(Intent.java:9741)
                                                                                        at android.content.Intent.prepareToLeaveProcess(Intent.java:9720)
                                                                                        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1609)
                                                                                        at android.app.Activity.startActivityForResult(Activity.java:4471)
                                                                                        at android.app.Activity.startActivityForResult(Activity.java:4429)
                                                                                        at android.app.Activity.startActivity(Activity.java:4788)
                                                                                        at android.app.Activity.startActivity(Activity.java:4756)
                                                                                        at com.example.tsuryohananov.mycallrecorder.MainActivity.onClick(MainActivity.java:324)
                                                                                        at android.view.View.performClick(View.java:6219)
                                                                                        at android.view.View$PerformClick.run(View.java:24482)
                                                                                        at android.os.Handler.handleCallback(Handler.java:769)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                                        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)

(第324行是startActivity)

logcat中已经提到了这个问题。 android.os.FileUriExposedException: file:////storage/emulated/0/CallRecordings/24.08.2017 02-32-19 PM.m4a 通过 ClipData.Item.getUri()

暴露在应用之外

有两种方法可以解决这个问题。

  1. 输入以下代码

    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build());

Application.onCreate().

我们将通过上述方法简单地更改VmPolicy。这样VM会忽略暴露的URI暴露。默认方法是

builder.detectFileUriExposure()

检查文件是否曝光。

  1. 尝试使用 content:// 而不是 file:// 在以后的 android 版本中,从 24 开始,我们必须使用 FileProvider class 以便其他应用程序也可以访问这些文件。

希望对您有所帮助,有关从 file://content://

参考这个问题 --