Android 6:不能再共享文件了?

Dan*_*e B 30 android share android-intent android-6.0-marshmallow

我正在共享一个图像,这段代码适用于Android 6之前的设备:

Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri uri = Uri.fromFile(new File(mFilename));
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
mContext.startActivity(Intent.createChooser(shareIntent, mChooserTitle));
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用Android 6共享时,我收到toast错误" 无法附加空文件 ".

我确认该文件存在且不是零长度.

有人有解决方案吗?

Dan*_*e B 38

FileProvider按照@CommonsWare的建议实现了一个解决方案

首先需要配置FileProvider:

  • 首先,添加<provider>到您的文件清单XML

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.myfileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_provider_paths" />
    </provider>
    
    Run Code Online (Sandbox Code Playgroud)
  • 第二,在单独的XML文件中定义文件路径,我称之为" file_provider_paths.xml "

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="share" path="/" />
    </paths>
    
    Run Code Online (Sandbox Code Playgroud)

您可以在本文档页面中找到完整的说明

在用XML设置文件提供程序后,这是共享图像文件的代码:

Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri fileUri = FileProvider.getUriForFile(mContext, "com.myfileprovider", new File(mFilename));
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
shareIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
mContext.startActivity(Intent.createChooser(shareIntent, mChooserTitle));
Run Code Online (Sandbox Code Playgroud)


Com*_*are 22

Android 6.0运行时权限系统的一个限制是会出现导致问题的极端情况.您遇到的问题是:尝试将外部存储上的文件共享给没有针对该特定UI路径的运行时权限检查的应用程序.

我说这是一个"极端情况",因为,对于接收应用程序中影响用户的这个错误,用户以前不能使用该应用程序并授予必要的权限.或者:

  • 用户之前从未使用过该应用,但仍尝试与其共享内容,或者

  • 用户通过"设置"撤消了权限,但没有意识到它会破坏这一点功能

这两个都是低概率事件.

作为发件人,您有两个主要选择:

  1. 使用中切换出来file:// Uri的值,赞成的文件服务ContentProvider一样FileProvider,所以允许不再需要,或

  2. 只是住在角落的情况下

  • @DanieleB:FWIW,我写了[博客文章](https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html). (9认同)