Android原生分享图片和视频
前言
由于之前的分享的平台都是固定的:微信,微信朋友圈,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原生分享图片和视频相关推荐
- android 代码分享图片不显示,android原生分享图片失败的问题
原生分享代码没有错,但是总是分享失败 Android分享图片的分享代码如下 public static void shareImages(Context context, ArrayList uriL ...
- Android 原生分享图片文字到微信
分享纯文字 Activity代码使用 shareWechatFriend(MainActivity.this, "这里是分享的内容"); 方法shareWechatFriend(C ...
- android 分享图片和视频
今天,简单讲讲如何调用手机的分享功能进行分享. 目前实现一键分享功能的方式有两种: 1.需要集成第三方官方SDK包,在获得官方授权后调用其API来完成一键分享功能,例如使用友盟分享等 优点:无 ...
- android原生分享功能,Android原生分享到微博、微信等平台的实现方式
在这个版本功能涉及到Android分享方式的变更,需求要求: 分享只支持新浪微博.微信,其他方式均去掉. 为了更好的测试还是要看下Android分享实现分享的方式,然后才能更好地评估测试时间和设计测试 ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )
文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )
文章目录 一. 图片质量压缩方法 二. Skia 二维图形库 三. libjpeg.libpng 函数库引入 在博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供的 ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )
文章目录 一. 图片质量压缩方法 二. 查找对应的 Native 方法源码 三. 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 [Android 内存优化]图片文件压缩 ( An ...
- Unity调用android相册获取图片或视频
Unity调用android相册获取图片或视频 (此文章对有unity基础和对环境配置有基础的童嚡容易看懂) 因为项目上用到,在百度了很多大佬的文章后,陆陆续续踩了很多坑,可能是我哪里设置的不对,大部 ...
- 在Android中调用图片、视频、音频、录音、拍照
在Android中调用图片.视频.音频.录音.拍照 //选择图片 requestCode 返回的标识 Intent innerIntent = new Intent(Intent.ACTION_GET ...
最新文章
- postgresql数据库基础
- asp.net core 集成JWT
- Facebook 竟然把服务 27 亿人的 AI 硬件系统开源了?!
- 分析原因型思维模型框架_分析营销型网站优化效果不佳的主要原因
- 《手把手教你学C语言》学习笔记(10)--- 程序的循环控制
- 从入门到入土:[linux实践]-pam|编写基于libpam的用户认证程序|编写基于PAM认证的应用程序|详细说明|实验步骤|实验截图
- 阿里无人车,正在高速过弯
- 综述|重邮高新波等最新《少样本目标检测算法》
- 计算机省vb二级试题,江苏省计算机二级VB试题及答案
- AngularJs--ng-repeate渲染完毕后执行的代码
- 学长教你买电脑(笔记本篇)
- 重磅!上海985教授当选!全球仅4人!
- 云计算机lol,云电脑玩英雄联盟卡不卡?
- 国产统信UOS使用FTP跨网段访问桌面云神州网信版windows的共享文件
- 前端三刺客---CSS
- 2018 ACM-ICPC, Syrian Collegiate Programming Contest I. Rise of the Robots 最小圆覆盖 模板
- python求平均数和中位数
- 优秀的产品经理需要具备哪些能力?
- python处理excel文件有哪些常用的库?
- UDP多播:一对多数据收发