最近在做一个分享功能,直接调用的是系统的分享,实际测试在Android6.0及以下版本,都是可以测试正常的。我们都知道,在android7.0中,无法通过Uri.fromFile(file);直接来获取Uri,替换他的是通过FileProvider,通过下面这种方式来获取文件的Uri,
imageUri = FileProvider.getUriForFile(mContext, 包名.fileProvider",new File(imgCache.get(i) ));
一切想的很美好,但是运行调用分享的时候,提示:“获取资源失败,仅支持分享图片”,
既然是获取资源失败,那就debug一下看看是哪里没有获取到资源,结果Uri是能正常获取到的,所有并不是资源的问题,那么就从文件类型检查一下,发现我设置的intent的type也是图片类型的。如:
shareIntent.setType("image/jpeg");
,
一切都正常,但是为什么会有这样的提示,百般无奈只能上谷歌,一查,原来有些应用对于FileProvider生成的Uri无法识别,需要转化成MediaStore 的 content://。
public static 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;
}
将上面获取到的imageUri再一次进行转化, 把他变成系统可以识别的Uri
imageUri = ImgFileUtils.getImageContentUri(mContext, new File(imgCache.get(i)));
到这里就能成功调起微信朋友圈的页面了