Android分享文件到微信和QQ功能的实现(兼容android 7.0以上的共享文件)

在android开发过程中,遇到需要分享数据到微信的开发需求时,基本都是集成友盟等第三方开发工具,简单集成SDK并且进行配置后,就可以分享到不同的APP内,很少有用到android提供的原生开发组件。

第三方开发工具和android原生开发组件的对比:

系统自带功能的优势:
1、将筛选出手机内所有可以接收该分享的App用于分享(使用第三方指定分享到QQ/微信 等App时,该手机内可能并没有安装QQ软件)。
2、对分享的内容、类型限制较小(比如可以文件分享,可以大图分享等,之前使用第三方分享的时候,图片大小会有限制,且支持文件分享的平台较少)。 第三方平台大多不支持文件的分享
3、集成和使用简便。代码量很少,而且使用系统自带的功能,让人放心

第三方平台的优势为:

1、内容只能分享到指定App去,而不是一大堆可选,且能保证分享正确性(比如系统自带的分享文件,会有微信朋友圈选项,点击后会提示不支持此种资源)。
2、能统计分享次数(第三方会帮我们统计),分享出去的东西会带上App属性(比如一个链接,会显示是从哪个App分享过来的。原生分享没试过,不知是否也会带)。
3、容易设置参数的回调,在发送结束后可以回到第三方应用,使用原生方式发送结束后不能跳转回第三方应用

然而,像友盟这样的第三方开发工具只能分享文字、图片、和链接类型,并不支持分享文件,所有,分享文件类型还是需要android原生的开发组件

接下来的代码示例就是使用原生开发组件实现分享pdf文件到QQ/微信:代码相当简单

final Uri uri;final File file = new File(getPath() + "file_1571813009280.pdf");int currentapiVersion = android.os.Build.VERSION.SDK_INT;if (currentapiVersion >= 24) {//若SDK大于等于24  获取uri采用共享文件模式    uri = FileProvider.getUriForFile(this.getApplicationContext(), "应用包名.fileprovider", file);        } else {            uri = Uri.fromFile(file);        }Intent share = new Intent(Intent.ACTION_SEND);share.putExtra(Intent.EXTRA_STREAM, uri);share.setType(/*"application/pdf"*/getMimeType(file.getAbsolutePath()));//此处可发送多种文件  share.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);share.addCategory(Intent.CATEGORY_DEFAULT);share.setPackage("com.tencent.mobileqq");//若需要分享到微信,只需要更改Package即可//share.setPackage("com.tencent.mm")if (share.resolveActivity(MainActivity.this.getPackageManager()) != null) {MainActivity.this.startActivity(share);} else {Toast.makeText(MainActivity.this, "没有可以处理该pdf文件的应用", Toast.LENGTH_SHORT).show();       }

其中,
getPath()是获取pdf文件存储的路径
resolveActivity()方法用来获取可以接收这个pdf文件,并且包名(Package)为“com.tencent.mobileqq”的应用
getMimeType()方法是根据文件名获取对应mime类型

getPath()代码如下:找到 根目录/CHINARES_UT文件夹,若没有,则会创建这个文件

/**     * 获取存储路径,自定义目录     *     * @return     */    public String getPath() {        String state = Environment.getExternalStorageState();        String path;        if (state.equals(Environment.MEDIA_MOUNTED)) {            path = Environment.getExternalStorageDirectory().getPath()                    + File.separator                    + "CHINARES_UT"                    + File.separator;        } else {            path = getCacheDir().getPath() + File.separator + "CHINARES_UT" + File.separator;//CHINARES_UT:保存文件和照片的目录        }        File file = new File(path);        if (!file.exists()) {            file.mkdirs();    }return path;    }

getMimeType()代码如下:

/** * 根据文件后缀获取文件MIME类型 * * @param filePath * @return */private static String getMimeType(String filePath) {    MediaMetadataRetriever mmr = new MediaMetadataRetriever();    String mime = "*/*";    if (filePath != null) {        try {            mmr.setDataSource(filePath);            mime = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE);        } catch (IllegalStateException e) {            return mime;        } catch (IllegalArgumentException e) {            return mime;        } catch (RuntimeException e) {            return mime;        }    }    return mime;}

注:Android N对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。
而进行此授权的最简单方式是使用 FileProvider 类,在使用 FileProvider 类之前还需要进行一下配置。

具体配置:
配置FileProvider文件共享

更多相关文章

  1. Android搜索控件的基本使用方法
  2. Android(安卓)NDK Hello + JNI 与 NDK区别
  3. 初学Android,使用自定义的XML资源(十八)
  4. Android开发中使用矢量图
  5. 解读Android(安卓)LOG机制的实现:(6)c/c++域使用LOG
  6. Android(安卓)- 利用Android(安卓)studio + Android(安卓)Killer
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. 设置Android程序的默认安装位置
  2. android 获取 imei号码
  3. 2011.10.11——— android GestureDetect
  4. TabActivity的使用遇到的问题
  5. Android(安卓)手机震动 设置震动时间
  6. Android中获得上下文的静态方法
  7. 2011.09.13——— android Bitmap.Config
  8. android点滴5
  9. Android(安卓)ListView 长按列表弹出菜单
  10. stagefright