android 分享支持fileprovider方式

如果分享的媒体文件中涉及文件路径(如图片类型、视频类型),建议开发者针对android 7.0 版本及其以上设备,判断抖音版本支持的情况下,更新为FileProvider方式进行分享。

第一步:集成支持fileprovider的sdk

参见Android接入指南

第二步:接入步骤

  1. 在Application中,初始化DouYinOpenApiFactory
    @Override
    public void onCreate() {
        super.onCreate();
        String clientkey = "[Client Key]"; // 修改为在开发者应用登记页面申请的clientkey
        DouYinOpenApiFactory.init(new DouYinOpenConfig(clientkey));
    }
  1. Manifest中申请权限,注册接收回调activity
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
    <!--如果第三方自定义了接收回调的activity则可以跳过此步骤-->
    <!--置于application结点下-->
    <activity android:name=".douyinapi.DouYinEntryActivity"
        android:launchMode="singleTask"
        android:taskAffinity="你的包名"
        android:exported="true">
    </activity>

抖音支持版本为12.5.0及其以上 已经适配使用FileProvider的方式来进行媒体文件分享。以下是具体的适配说明。

FileProvider适配

1. 配置

在项目的AndroidManifest.xml添加相关配置,示例如下:

    <provider  android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_provider_paths" />
    </provider>
    <!--${applicationId}为你的应用包名-->

在res/xml目录(如果没有xml目录,则新建一个)下,添加文件file_provider_paths.xml,内容如下:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="sharedata" path="shareData/"/>
</paths>

external-files-path表示通过 Context.getExternalFilesDir(null) 接口获取到的目录下的文件才可被共享,其他未配置的路径均不可被分享。同样的节点可以配置多个,以支持多个不同的子目录,如下所示:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="sharedata" path="shareData/"/>
</paths>

paths内部还支持节点配置其他的路径,比如:

  • files-path,对应于 Context.getFilesDir() 获取到的目录
  • cache-path,对应于 Context.getCacheDir() 获取到的目录
  • ...
  • 还有一些其他可配置的路径,开发者可自行了解使用。

2. 使用FileProvider接口

将路径通过FileProvider的接口转换成content://URI形式,示例如下:

    public String getFileUri(Context context) {
        String filePath = context.getExternalFilesDir(null) + "/shareData/test.png";
        // 该filePath对应于xml/file_provider_paths里的第一行配置:,因此才可被共享
        File file = new File(filePath);
        String contentPath = getFileUri(context, file);
        // 使用contentPath作为文件路径进行分享
        // 要与`AndroidManifest.xml`里配置的`authorities`一致,假设你的应用包名为com.example.app
        Uri contentUri = FileProvider.getUriForFile(context,
                "com.example.app.fileprovider",file);
        // 授权给抖音访问路径,这里填抖音包名
        context.grantUriPermission("com.ss.android.ugc.aweme",
                contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
        return contentUri.toString();   // contentUri.toString() 即是以"content://"开头的用于共享的路径
    }

3.分享图片

DouYinOpenApi douYinOpenApi = DouYinOpenApiFactory.create(this);
if (douyinOpenApi.isShareSupportFileProvider() &&
        android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    ArrayList<String> images = new ArrayList<>();
    images.add(xxx);  // 将FileProvider格式的路径传的该list中
    Share.Request request = new Share.Request();
    ImageObject imageObject = new ImageObject();
    imageObject.mImagePaths = images; // 该路径可以传FileProvider格式的路径
    MediaContent mediaContent = new MediaContent();
    mediaContent.mMediaObject = imageObject;
    request.mMediaContent = mediaContent;
    douyinOpenApi.share(request);
} else {
    Toast.makeText(TestFileProviderActivity.this, "版本不符合", Toast.LENGTH_LONG).show();
}

4. 分享视频

if (douyinOpenApi.isShareSupportFileProvider() &&
        android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
 
    ArrayList<String> videos = new ArrayList<>();
    videos.add(xxx路径)
    Share.Request request = new Share.Request();
    VideoObject videoObject = new VideoObject();
    videoObject.mVideoPaths = videos; // 该地方路径可以传FileProvider格式的路径
    MediaContent content = new MediaContent();
    content.mMediaObject = videoObject;
    request.mMediaContent = content;
    douyinOpenApi.share(request);
} else {
    Toast.makeText(TestFileProviderActivity.this, "版本不符合", Toast.LENGTH_LONG).show();
}

接收回调等相关后续工作参考这篇文档

诚邀您对本文档易读易用性进行评价
好用
不好用