最近在做一個(gè)分享功能,直接調(diào)用的是系統(tǒng)的分享,實(shí)際測(cè)試在Android6.0及以下版本,都是可以測(cè)試正常的。我們都知道,在android7.0中,無(wú)法通過(guò)Uri.fromFile(file);直接來(lái)獲取Uri,替換他的是通過(guò)FileProvider,通過(guò)下面這種方式來(lái)獲取文件的Uri,
imageUri = FileProvider.getUriForFile(mContext, 包名.fileProvider",new File(imgCache.get(i) ));
一切想的很美好,但是運(yùn)行調(diào)用分享的時(shí)候,提示:“獲取資源失敗,僅支持分享圖片”,
既然是獲取資源失敗,那就debug一下看看是哪里沒(méi)有獲取到資源,結(jié)果Uri是能正常獲取到的,所有并不是資源的問(wèn)題,那么就從文件類型檢查一下,發(fā)現(xiàn)我設(shè)置的intent的type也是圖片類型的。如:
shareIntent.setType("image/jpeg");,
一切都正常,但是為什么會(huì)有這樣的提示,百般無(wú)奈只能上谷歌,一查,原來(lái)有些應(yīng)用對(duì)于FileProvider生成的Uri無(wú)法識(shí)別,需要轉(zhuǎn)化成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再一次進(jìn)行轉(zhuǎn)化, 把他變成系統(tǒng)可以識(shí)別的Uri
imageUri = ImgFileUtils.getImageContentUri(mContext, new File(imgCache.get(i)));
到這里就能成功調(diào)起微信朋友圈的頁(yè)面了