收藏
评论

OpenSDK支持FileProvider方式分享文件到微信官方

各位开发者:

最新版本(7.0.13)的微信 SDK 已经适配使用FileProvider的方式来进行消息分享。

如果分享的消息中涉及文件路径(如图片类型消息),建议开发者针对Android 7.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,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="sharedata" path="shareData/"/>
</paths>

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

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="sharedata" path="shareData/"/>
    <external-files-path name="sharedata2" path="shareData2/"/>
</paths>

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

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


2. 使用FileProvider接口

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

public void shareToWechat(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作为文件路径进行分享
    // ...
}
​
​
public String getFileUri(Context context, File file) {
    if (file == null || !file.exists()) {
        return null;
    }
  
    Uri contentUri = FileProvider.getUriForFile(context, 
        "com.example.app.fileprovider",  // 要与`AndroidManifest.xml`里配置的`authorities`一致,假设你的应用包名为com.example.app
        file);
  
    // 授权给微信访问路径
    context.grantUriPermission("com.tencent.mm",  // 这里填微信包名    
        contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
  
    return contentUri.toString();   // contentUri.toString() 即是以"content://"开头的用于共享的路径
}


微信版本支持

  1. OpenSDK版本:必须大于或等于 5.4.3 版本,建议开发者升级至最新版本 5.5.8
  2. 微信版本:当且仅当通过 IWXAPI.getWXAppSupportAPI() 接口获取到的值 >= 0x27000D00,才能支持FileProvider的方式进行分享。示例代码如下:
private IWXAPI api; // api的初始化这里省略public void shareToWechat(Context context) {
    // ...
    if (checkVersionValid(context) && checkAndroidNotBelowN()) {
        String filePath = context.getExternalFilesDir(null) + "/shareData/test.png";
        File file = new File(filePath);
        String contentPath = WXOpenSDKFileProviderHelper.getFileUri(context, file);
      
        // 使用contentPath作为文件路径进行分享
        // ...
    }
    else {
        // 使用原有方式传递文件路径进行分享
        // ...
    }
}
​
// 判断微信版本是否为7.0.13及以上
public boolean checkVersionValid(Context context) {
    return api.getWXAppSupportAPI() >= 0x27000D00;
}
​
// 判断Android版本是否7.0及以上
public boolean checkAndroidNotBelowN() {
    return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N;
}

详细参考 OpenSDK 消息分享文档:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Share_and_Favorites/Android.html


微信团队

2020年03月31日

184064浏览
最后一次编辑于  2020-03-31
收藏

126 个评论

  • 心想事成
    心想事成
    发表于移动端
    2022-04-23
    tygh
    2022-04-23
    赞同 1
    回复
  • 曹东丽
    曹东丽
    发表于移动端
    2022-01-18
    fdgbkfbdcczfjteghu683589gjgdf 6794fhgxfsdgngghdchb
    2022-01-18
    赞同 1
    回复
  • 天神哥哥
    天神哥哥
    2021-10-27

    这个fileprovider分享不支持朋友圈分享吗

    2021-10-27
    赞同 1
    回复
  • akram
    akram
    发表于移动端
    2021-10-08
    😭😭😭😭😭
    2021-10-08
    赞同 1
    回复
  • 泰山
    泰山
    发表于移动端
    2021-07-01
    、{、
    2021-07-01
    赞同 1
    回复 1
  • 神经蛙
    神经蛙
    2020-11-25

    我想知道新版(7.0.20)微信为什么把之前的图片分享方式给去掉了,具体方式文档如下:

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img);
    
    //初始化 WXImageObject 和 WXMediaMessage 对象
    WXImageObject imgObj = new WXImageObject(bmp);
    WXMediaMessage msg = new WXMediaMessage();
    msg.mediaObject = imgObj;
    
    //设置缩略图
    Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
    bmp.recycle();
    msg.thumbData = Util.bmpToByteArray(thumbBmp, true);
    
    //构造一个Req
    SendMessageToWX.Req req = new SendMessageToWX.Req();
    req.transaction = buildTransaction("img");
    req.message = msg;
    req.scene = mTargetScene;
    req.userOpenId = getOpenId();
    //调用api接口,发送数据到微信
    api.sendReq(req);
    


    2020-11-25
    赞同 1
    回复 2
    • 神经蛙
      神经蛙
      2020-11-25
      有人能回答这个问题吗,这样导致不得不把之前的图片分享方式作出修改,按理来说你们应该兼容老版本才对
      2020-11-25
      回复
    • Eviler
      Eviler
      2020-12-15
      微信7.0.21版本有偷偷摸摸的把这个分享方式拿回来了,我真是。。。
      2020-12-15
      1
      回复
  • Trace
    Trace
    2020-11-13
    String filePath = context.getExternalFilesDir(null) + "/shareData/test.png";
    File file = new File(filePath);
    String contentPath = WXOpenSDKFileProviderHelper.getFileUri(context, file);      
    // 使用contentPath作为文件路径进行分享
    // ...
    
    如何使用contentPath作为文件路径进行分享?官方文档好像没介绍啊。有大神可以出来解释一下吗?
    
    
    


    2020-11-13
    赞同 1
    回复 1
    • BlackPearl
      BlackPearl
      2020-11-18
      public String getFileUri(Context context, File file) {
              if (file == null || !file.exists()) {
                  return null;
              }


              Uri contentUri = FileProvider.getUriForFile(context,
                      activity.getString(R.string.string_fileprovider_authority), // 要与`AndroidManifest.xml`里配置的`authorities`一致,假设你的应用包名为com.example.app
                      file);


              // 授权给微信访问路径
              context.grantUriPermission("com.tencent.mm", // 这里填微信包名
                      contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);


              return contentUri.toString(); // contentUri.toString() 即是以"content://"开头的用于共享的路径
          }
      2020-11-18
      回复
  • 青鸟
    青鸟
    发表于移动端
    2020-11-10
    运用FileProvider分享需要app用户怎样操作?不会呀!
    2020-11-10
    赞同 1
    回复
  • 文
    2020-04-22

    分享失败,多文件分享仅支持照片格式????我图片jpeg格式的啊

    2020-04-22
    赞同 1
    回复 1
    • yang
      yang
      2020-06-03
      我也遇到了这个问题,怎么解决啊
      2020-06-03
      回复
  • peerless2012
    peerless2012
    2020-04-18

    微信分享,跳到微信的界面后点击左上角的返回,收到的回调的code是0,代表成功,实际应该是取消,这个有人碰到吗?

    2020-04-18
    赞同 1
    回复 4
    • 茉莉花开
      茉莉花开
      2020-05-24
      请问这个问题解决了吗,我也碰到了
      2020-05-24
      回复
    • 茉莉花开
      茉莉花开
      2020-05-24
      百度搜索倒了,据说是微信修改了,成功和 失败 都是返回 code=0, 表示成功, 防止 app 监测这个状态,强制用户进行分享
      2020-05-24
      回复
    • 💔 晚儿~夏夏💔
      💔 晚儿~夏夏💔
      发表于移动端
      2021-03-13回复茉莉花开
      明明到时间了,我都没有玩,为什么还是打不了
      2021-03-13
      1
      回复
    • 💔 晚儿~夏夏💔
      💔 晚儿~夏夏💔
      发表于移动端
      2021-03-13回复茉莉花开
      明明到时间了,我都没有玩,为什么还是打不了
      2021-03-13
      回复

正在加载...

登录 后发表内容