文章参考地址
Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博 原
处理使用Intent分享图片到微信朋友圈时,在微信7.0版本出现“获取资源失败,无法分享到朋友圈”,导致分享失败的问题
本文是参考其他作者的,但是其他作者没有对现在的版本做一个进一步的处理,本文就是在他们的基础上进一步处理
注意
1、视频的分享到朋友圈,需要集成第三方的来实现,要么自己去接微信的来实现,无法走系统的分享,但是可以走系统的分享给好友
/**
* @date: 2019/5/23 0023
* @author: gaoxiaoxiong
* @description: 分享功能
**/
public class ShareFileUtils {
private static ShareFileUtils shareFileUtils;
public static ShareFileUtils getInstance(){
if (shareFileUtils==null){
shareFileUtils = new ShareFileUtils();
}
return shareFileUtils;
}
/**
* 微信7.0版本号,兼容处理微信7.0版本分享到朋友圈不支持多图片的问题
*/
public static final int VERSION_CODE_FOR_WEI_XIN_VER7 = 1380;
//微信的包名
public static final String PACKAGE_NAME_WEI_XIN = "com.tencent.mm";
//QQ的包名
public static final String PACKAGE_NAME_QQ="com.tencent.mobileqq";
//QQ空间
public static final String PACKAGE_NAME_QZONE="com.qzone";
//新浪微博
public static final String PACKAGE_NAME_XINLANGWEIBO="com.sina.weibo";
/**
* 分享文本
*
* @param context
* @param path
*/
public void shareUrl(Context context, String path) {
checkFileUriExposure();
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_TEXT, path);
it.setType("text/plain");
context.startActivity(Intent.createChooser(it, "分享APP"));
}
/**
* @date: 2019/5/23 0023
* @author: gaoxiaoxiong
* @description:分享视频微信到朋友圈
**/
public void shareVideoToWeChatFriend(Context context,String path){
if (StringUtils.getInstance().isEmpty(path)) {
return;
}
checkFileUriExposure();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, path);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_SUBJECT, "我是标题");//添加分享内容标题
ComponentName comp = new ComponentName(PACKAGE_NAME_WEI_XIN, "com.tencent.mm.ui.tools.ShareToTimeLineUI");
intent.setComponent(comp);
context.startActivity(Intent.createChooser(intent, "分享"));
}
/**
* @date: 2019/5/23 0023
* @author: gaoxiaoxiong
* @description:分享视频给好友
**/
public void shareVideoToWeChat(Context context,String path){
if (StringUtils.getInstance().isEmpty(path)) {
return;
}
checkFileUriExposure();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(path)));
ComponentName comp = new ComponentName(PACKAGE_NAME_WEI_XIN, "com.tencent.mm.ui.tools.ShareImgUI");
intent.setComponent(comp);
intent.setType("video/*");
context.startActivity(Intent.createChooser(intent, "分享"));
}
/**
* 分享文件
*
* @param context
* @param path
*/
public void shareFile(Context context, String path) {
if (StringUtils.getInstance().isEmpty(path)) {
return;
}
checkFileUriExposure();
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(path)));
intent.setType("*/*"); //分享文件
context.startActivity(Intent.createChooser(intent, "分享"));
}
/**
* 分享单张图片
*
* @param context
* @param path
*/
public void shareImage(Context context, String path) {
shareImage(context, path, null, null, null);
}
/**
* 分享多张图片
*
* @param context
* @param pathList
*/
public void shareImage(Context context, List<String> pathList) {
shareImage(context, null, pathList, null, null);
}
/**
* 分享到微信好友,单图
*/
public void shareImageToWeChat(Context context, String path) {
//判断是否安装微信,如果没有安装微信 又没有判断就直达微信分享是会挂掉的
if (!isAppInstall(context, PACKAGE_NAME_WEI_XIN)) {
CustomToast.getToast().ToastShow(context,"您还没有安装微信", R.drawable.fail);
return;
}
shareImage(context, path, null, PACKAGE_NAME_WEI_XIN, "com.tencent.mm.ui.tools.ShareImgUI");
}
/**
* 分享到微信好友,多图
*/
public void shareImageToWeChat(final Context context, List<String> pathList) {
//判断是否安装微信,如果没有安装微信 又没有判断就直达微信分享是会挂掉的
if (!isAppInstall(context, PACKAGE_NAME_WEI_XIN)) {
CustomToast.getToast().ToastShow(context,"您还没有安装微信", R.drawable.fail);
return;
}
shareImage(context, null, pathList, PACKAGE_NAME_WEI_XIN, "com.tencent.mm.ui.tools.ShareImgUI");
}
/**
* 分享到微信朋友圈,单图
*/
public void shareImageToWeChatFriend(Context context, String path) {
if (!isAppInstall(context, PACKAGE_NAME_WEI_XIN)) {
CustomToast.getToast().ToastShow(context,"您还没有安装微信", R.drawable.fail);
return;
}
shareImage(context, path, null, PACKAGE_NAME_WEI_XIN, "com.tencent.mm.ui.tools.ShareToTimeLineUI");
}
/**
* 分享到微信朋友圈,多图
*/
public void shareImageToWeChatFriend(Context context, List<String> pathList) {
if (!isAppInstall(context, PACKAGE_NAME_WEI_XIN)) {
CustomToast.getToast().ToastShow(context,"您还没有安装微信", R.drawable.fail);
return;
}
shareImage(context, null, pathList, PACKAGE_NAME_WEI_XIN, "com.tencent.mm.ui.tools.ShareToTimeLineUI");
}
/**
* 分享图片给QQ好友,单图
*/
public void shareImageToQQ(Context context, String path) {
if (!isAppInstall(context, PACKAGE_NAME_QQ)) {
CustomToast.getToast().ToastShow(context,"您还没有安装QQ", R.drawable.fail);
return;
}
shareImage(context, path, null, PACKAGE_NAME_QQ, "com.tencent.mobileqq.activity.JumpActivity");
}
/**
* 分享图片给QQ好友,多图
*/
public void shareImageToQQ(Context context, List<String> pathList) {
if (!isAppInstall(context, PACKAGE_NAME_QQ)) {
CustomToast.getToast().ToastShow(context,"您还没有安装QQ", R.drawable.fail);
return;
}
shareImage(context, null, pathList, PACKAGE_NAME_QQ, "com.tencent.mobileqq.activity.JumpActivity");
}
/**
* 分享图片到QQ空间,单图
*/
public void shareImageToQZone(Context context, String path) {
if (!isAppInstall(context, PACKAGE_NAME_QZONE)) {
CustomToast.getToast().ToastShow(context,"您还没有安装QQ空间", R.drawable.fail);
return;
}
shareImage(context, path, null, PACKAGE_NAME_QZONE, "com.qzonex.module.operation.ui.QZonePublishMoodActivity");
}
/**
* 分享图片到QQ空间,多图
*/
public void shareImageToQZone(Context context, List<String> pathList) {
if (!isAppInstall(context, PACKAGE_NAME_QZONE)) {
CustomToast.getToast().ToastShow(context,"您还没有安装QQ空间", R.drawable.fail);
return;
}
shareImage(context, null, pathList, PACKAGE_NAME_QZONE, "com.qzonex.module.operation.ui.QZonePublishMoodActivity");
}
/**
* 分享图片到微博,单图
*/
public void shareImageToWeibo(Context context, String path) {
if (!isAppInstall(context, PACKAGE_NAME_XINLANGWEIBO)) {
CustomToast.getToast().ToastShow(context,"您还没有安装新浪微博", R.drawable.fail);
return;
}
shareImage(context, path, null, PACKAGE_NAME_XINLANGWEIBO, "com.sina.weibo.EditActivity");
}
/**
* 分享图片到微博,多图
*/
public void shareImageToWeibo(Context context, List<String> pathList) {
if (!isAppInstall(context, PACKAGE_NAME_XINLANGWEIBO)) {
CustomToast.getToast().ToastShow(context,"您还没有安装新浪微博", R.drawable.fail);
return;
}
shareImage(context, null, pathList, PACKAGE_NAME_XINLANGWEIBO, "com.sina.weibo.EditActivity");
}
/**
* 检测手机是否安装某个应用
*
* @param context
* @param appPackageName 应用包名
* @return true-安装,false-未安装
*/
public boolean isAppInstall(Context context, String appPackageName) {
PackageManager packageManager = context.getPackageManager();// 获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName;
if (appPackageName.equals(pn)) {
return true;
}
}
}
return false;
}
/**
* 分享前必须执行本代码,主要用于兼容SDK18以上的系统
*/
private void checkFileUriExposure() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
}
}
/**
* @param context 上下文
* @param path 不为空的时候,表示分享单张图片,会检验图片文件是否存在
* @param pathList 不为空的时候表示分享多张图片,会检验每一张图片是否存在
* @param pkg 分享到的指定app的包名
* @param cls 分享到的页面(微博不需要指定页面)
*/
private void shareImage(Context context, String path, List<String> pathList, String pkg, String cls) {
if (path == null && pathList == null) {
CustomToast.getToast().ToastShow(context,"找不到您要分享的图片文件", R.drawable.fail);
return;
}
checkFileUriExposure();
try {
if (path != null) {
//单张图片
File file = new File(path);
if (!file.exists()) {
CustomToast.getToast().ToastShow(context,"图片不存在,请检查后重试", R.drawable.fail);
return;
}
Intent intent = new Intent();
if (pkg != null && cls != null) {
//指定分享到的app
if (pkg.equals(PACKAGE_NAME_XINLANGWEIBO)) {
//微博分享的需要特殊处理
intent.setPackage(pkg);
} else {
ComponentName comp = new ComponentName(pkg, cls);
intent.setComponent(comp);
}
}
intent.setAction(Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.N){//android 系统版本大于7.0
intent.putExtra(Intent.EXTRA_STREAM, getImageContentUri(context, file));
}else {
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(path)));
}
intent.setType("image/*"); //分享文件
context.startActivity(Intent.createChooser(intent, "分享"));
} else {
//多张图片
ArrayList<Uri> uriList = new ArrayList<>();
for (int i = 0; i < pathList.size(); i++) {
File file = new File(pathList.get(i));
if (!file.exists()) {
CustomToast.getToast().ToastShow(context, "第" + (i + 1) + "张图片不存在,请检查后重试", R.drawable.fail);
return;
}
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.N){
Uri imageContentUri = getImageContentUri(context, file);
uriList.add(imageContentUri);
}else {
uriList.add(Uri.fromFile(new File(pathList.get(i))));
}
}
Intent intent = new Intent();
if (pkg != null && cls != null) {
//指定分享到的app
if (pkg.equals(PACKAGE_NAME_XINLANGWEIBO)) {
//微博分享的需要特殊处理
intent.setPackage(pkg);
} else {
ComponentName comp = new ComponentName(pkg, cls);
intent.setComponent(comp);
}
}
/* if (pkg.equals(PACKAGE_NAME_WEI_XIN) && getVersionCode(context,pkg) >= VERSION_CODE_FOR_WEI_XIN_VER7 ){//微信版本&&微信版本>=7.0以上
// 微信7.0及以上版本
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
}else {//其它包名 和微信版本<7.0
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
}*/
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setType("image/*");
context.startActivity(Intent.createChooser(intent, "分享"));
}
} catch (Exception e) {
CustomToast.getToast().ToastShow(context, "分享失败,未知错误", R.drawable.fail);
}
}
/**
* 获取制定包名应用的版本的versionCode
* @param context
* @param
* @return
*/
public static int getVersionCode(Context context,String packageName) {
try {
PackageManager manager = context.getPackageManager();
PackageInfo info = manager.getPackageInfo(packageName, 0);
int version = info.versionCode;
return version;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* @date: 2019/5/23 0023
* @author: gaoxiaoxiong
* @description: 解决android7.0版本获取图片问题
**/
public Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",
new String[] { filePath }, null);
Uri uri = null;
if (cursor != null) {
if (cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
uri = Uri.withAppendedPath(baseUri, "" + id);
}
cursor.close();
}
if (uri == null) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
return uri;
}
}