前言

由于之前的分享的平台都是固定的:微信,微信朋友圈,QQ,微博…
分享的做法就是,用列表分别显示各个平台,然后点击某个选项跳转到对应平台
代码如下:

private void share(File file, boolean isImage) {Intent intent = new Intent(Intent.ACTION_SEND);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {Uri fileUri = FileProvider.getUriForFile(context, AppVersionUtil.getAppPackageName(context) + ".fileProvider", file);intent.putExtra(Intent.EXTRA_STREAM, fileUri);} else {intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));}if (isImage) {intent.setType("image/*");} else {intent.setType("video/*");}intent.setComponent(getPlatformComp(mAdapter.getData().get(position).getType()));startActivity(intent);
}private ComponentName getPlatformComp(int type) {ComponentName comp;switch (type) {case TYPE_WECHAT_FRIEND:comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");break;//朋友圈case TYPE_MOMENT:comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");break;case TYPE_WEIBO:comp = new ComponentName("com.sina.weibo", "com.sina.weibo.composerinde.ComposerDispatchActivity");break;case TYPE_QQ_FRIEND:comp = new ComponentName("com.tencent.mobileqq", "com.tencent.mobileqq.activity.JumpActivity");break;case TYPE_QZONE:comp = new ComponentName("com.qzone", "com.qzonex.module.operation.ui.QZonePublishMoodActivity");break;default:comp = new ComponentName("", "");break;}return comp;
}

其中,AppVersionUtil.getAppPackageName(context)为获取包名的方法:

  public static String getAppPackageName(Context context) {String packageName = "";try {packageName = context.getPackageName();} catch (Exception e) {e.printStackTrace();}return packageName;}

问题

这样的做法,对国内用户来说,或许没啥问题,但是,由于公司app主要客户是国外,微信,QQ这些平台不一定有,因此需要改用系统原生的。
以下是改用原生的分享方式:

 public static void shareFile(Context context, File file, String shareType, String title) {Intent intent = new Intent(Intent.ACTION_SEND);Uri fileUri;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {fileUri = FileProvider.getUriForFile(context, AppVersionUtil.getAppPackageName(context) + ".fileProvider", file);    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);} else {fileUri = Uri.fromFile(file);}intent.putExtra(Intent.EXTRA_STREAM, fileUri);intent.setType(shareType);Intent chooser = Intent.createChooser(intent, title);if (intent.resolveActivity(context.getPackageManager()) != null) {context.startActivity(chooser);}
}

这个对分享图片没啥问题,但是,在分享视频到微信的时候,却会报‘’报导入失败‘’。

解决

网上找了大半天解决方案,最后终于找到了对应的解决方法《利用 Android 系统原生 API 实现分享功能》,最后按照该文章,单独整理了个工具类,方便用于项目中分享图片和视频,代码如下:

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;import java.io.File;public class IntentUtils {public static final String TYPE_VIDEO = "video/*";public static final String TYPE_IMAGE = "image/*";public static void shareImage(Context context, File file, String title) {shareFile(context, file, TYPE_IMAGE, title);}public static void shareVideo(Context context, File file, String title) {shareFile(context, file, TYPE_VIDEO, title);}public static void shareFile(Context context, File file, String shareType, String title) {Intent intent = new Intent(Intent.ACTION_SEND);Uri fileUri;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {if (TYPE_VIDEO.equals(shareType)) {fileUri = getVideoContentUri(context, file);} else {fileUri = FileProvider.getUriForFile(context, AppVersionUtil.getAppPackageName(context) + ".fileProvider", file);}intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);} else {fileUri = Uri.fromFile(file);}intent.putExtra(Intent.EXTRA_STREAM, fileUri);intent.setType(shareType);Intent chooser = Intent.createChooser(intent, title);if (intent.resolveActivity(context.getPackageManager()) != null) {context.startActivity(chooser);}}private static Uri getVideoContentUri(Context context, File file) {String filePath = file.getAbsolutePath();Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Video.Media._ID}, MediaStore.Video.Media.DATA + "=?",new String[]{filePath}, null);Uri uri = null;if (cursor != null) {if (cursor.moveToFirst()) {int id = cursor.getInt(cursor.getColumnIndex(MediaStore.Video.Media._ID));Uri baseUri = Uri.parse("content://media/external/video/media");uri = Uri.withAppendedPath(baseUri, "" + id);}cursor.close();}//如果使用fileProvider获取失败,则使用此方法if (uri == null) {ContentValues values = new ContentValues();values.put(MediaStore.Video.Media.DATA, filePath);uri = context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);}if (uri == null) {uri = FileProvider.getUriForFile(context, AppVersionUtil.getAppPackageName(context) + ".fileProvider", file);}return uri;}}

由于主要是修改项目中的分享方式,这里也偷个懒,并没有对FileProvider进行深入研究,以及其它类型的分享方式。
FileProvider和其相关内容大致如下:
1.AndroidManifest.xml的application标签里添加provider标签:

     <providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>

2.在res目录下添加xml目录,并添加file_paths文件,文件内容大致如下:

<?xml version="1.0" encoding="utf-8"?>
<paths><external-path path="." name="external_storage_root"/>
</paths>

参考

利用 Android 系统原生 API 实现分享功能

Android原生分享图片和视频相关推荐

  1. android 代码分享图片不显示,android原生分享图片失败的问题

    原生分享代码没有错,但是总是分享失败 Android分享图片的分享代码如下 public static void shareImages(Context context, ArrayList uriL ...

  2. Android 原生分享图片文字到微信

    分享纯文字 Activity代码使用 shareWechatFriend(MainActivity.this, "这里是分享的内容"); 方法shareWechatFriend(C ...

  3. android 分享图片和视频

    今天,简单讲讲如何调用手机的分享功能进行分享. 目前实现一键分享功能的方式有两种: 1.需要集成第三方官方SDK包,在获得官方授权后调用其API来完成一键分享功能,例如使用友盟分享等     优点:无 ...

  4. android原生分享功能,Android原生分享到微博、微信等平台的实现方式

    在这个版本功能涉及到Android分享方式的变更,需求要求: 分享只支持新浪微博.微信,其他方式均去掉. 为了更好的测试还是要看下Android分享实现分享的方式,然后才能更好地评估测试时间和设计测试 ...

  5. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )

    文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...

  6. 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )

    文章目录 一. 图片质量压缩方法 二. Skia 二维图形库 三. libjpeg.libpng 函数库引入 在博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供的 ...

  7. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )

    文章目录 一. 图片质量压缩方法 二. 查找对应的 Native 方法源码 三. 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 [Android 内存优化]图片文件压缩 ( An ...

  8. Unity调用android相册获取图片或视频

    Unity调用android相册获取图片或视频 (此文章对有unity基础和对环境配置有基础的童嚡容易看懂) 因为项目上用到,在百度了很多大佬的文章后,陆陆续续踩了很多坑,可能是我哪里设置的不对,大部 ...

  9. 在Android中调用图片、视频、音频、录音、拍照

    在Android中调用图片.视频.音频.录音.拍照 //选择图片 requestCode 返回的标识 Intent innerIntent = new Intent(Intent.ACTION_GET ...

最新文章

  1. postgresql数据库基础
  2. asp.net core 集成JWT
  3. Facebook 竟然把服务 27 亿人的 AI 硬件系统开源了?!
  4. 分析原因型思维模型框架_分析营销型网站优化效果不佳的主要原因
  5. 《手把手教你学C语言》学习笔记(10)--- 程序的循环控制
  6. 从入门到入土:[linux实践]-pam|编写基于libpam的用户认证程序|编写基于PAM认证的应用程序|详细说明|实验步骤|实验截图
  7. 阿里无人车,正在高速过弯
  8. 综述|重邮高新波等最新《少样本目标检测算法》
  9. 计算机省vb二级试题,江苏省计算机二级VB试题及答案
  10. AngularJs--ng-repeate渲染完毕后执行的代码
  11. 学长教你买电脑(笔记本篇)
  12. 重磅!上海985教授当选!全球仅4人!
  13. 云计算机lol,云电脑玩英雄联盟卡不卡?
  14. 国产统信UOS使用FTP跨网段访问桌面云神州网信版windows的共享文件
  15. 前端三刺客---CSS
  16. 2018 ACM-ICPC, Syrian Collegiate Programming Contest I. Rise of the Robots 最小圆覆盖 模板
  17. python求平均数和中位数
  18. 优秀的产品经理需要具备哪些能力?
  19. python处理excel文件有哪些常用的库?
  20. UDP多播:一对多数据收发

热门文章

  1. 重温来路 画蓝图 看木北如何势如破竹
  2. 我天天都在做有氧无氧运动,我的体重虽然下降了,为什么下降的很慢?
  3. 牛客 腾讯算法岗 笔试题整理
  4. 登录计算机系统用英语怎么说,登录用英语怎么说
  5. 猎场,开篇美好鸡血演讲截图和现实残酷生活截图
  6. linux修改日志保存日期,修改linux系统日志保存天数
  7. SpringBoot使用Validation框架完成参数校验AND异常处理
  8. 【计算机系统】缓冲区溢出攻击实验
  9. css 实现最后一行两侧对齐,考虑ios text-align-last 不支持iOS
  10. 慧点科技CEO吕翊:我们做SmartGo移动平台的两个理由