使用 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()
暴露在应用之外
有两种方法可以解决这个问题。
输入以下代码
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
在 Application.onCreate().
我们将通过上述方法简单地更改VmPolicy。这样VM会忽略暴露的URI暴露。默认方法是
builder.detectFileUriExposure()
检查文件是否曝光。
- 尝试使用 content:// 而不是 file://
在以后的 android 版本中,从 24 开始,我们必须使用
FileProvider
class 以便其他应用程序也可以访问这些文件。
希望对您有所帮助,有关从
file://
到 content://
参考这个问题 --
这是我的代码:
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()
暴露在应用之外有两种方法可以解决这个问题。
输入以下代码
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build());
在 Application.onCreate().
我们将通过上述方法简单地更改VmPolicy。这样VM会忽略暴露的URI暴露。默认方法是
builder.detectFileUriExposure()
检查文件是否曝光。
- 尝试使用 content:// 而不是 file://
在以后的 android 版本中,从 24 开始,我们必须使用
FileProvider
class 以便其他应用程序也可以访问这些文件。
希望对您有所帮助,有关从
file://
到 content://
参考这个问题 --