常规操作只能适配6.0及以下
直接上分享的代码:
Intent share_intent = new Intent();
ArrayList<Uri> imageUris = new ArrayList<Uri>();
Uri uri;
for (File f : files) {
imageUris.add(Uri.fromFile(f));
}
share_intent.setAction(Intent.ACTION_SEND_MULTIPLE);//设置分享行为
share_intent.setType("image/png");//设置分享内容的类型
share_intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
context.startActivity(Intent.createChooser(share_intent, "Share"));
这样的话在Android6.0及以下都是没问题的
但是在7.0、8.0上就会出现出现:**android.os.FileUriExposedException **异常,出现这样的问题是因为分享限制原因,需要配置一些东西。
适配Android7.0、8.0
- 代码书写
public static void originalShareImage(Context context, ArrayList<File> files) {
Intent share_intent = new Intent();
ArrayList<Uri> imageUris = new ArrayList<Uri>();
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
for (File f : files) {
Uri imageContentUri =
FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider",f);
imageUris.add(imageContentUri);
}
} else {
for (File f : files) {
imageUris.add(Uri.fromFile(f));
}
}
share_intent.setAction(Intent.ACTION_SEND_MULTIPLE);//设置分享行为
share_intent.setType("image/png");//设置分享内容的类型
share_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
share_intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
context.startActivity(Intent.createChooser(share_intent, "Share"));
}
- Mainifest配置
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="your packge name.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
- file_paths配置
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="myFile"
path="folder"></external-path>
</paths>
其中myFile可以随意写,folder是根目录下的文件夹,也就是你放图片的主目录
以上配置,可能出现微信分享不成功,QQ可以分享成功,系统其它一些应用可以成功的情况,所以也不是很完善,所以,就想出了一个终极的解决办法
终极分享
public static void originalShareImage(Context context, ArrayList<File> files) {
Intent share_intent = new Intent();
ArrayList<Uri> imageUris = new ArrayList<Uri>();
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
for (File f : files) {
Uri imageContentUri = getImageContentUri(context, f);
imageUris.add(imageContentUri);
}
} else {
for (File f : files) {
imageUris.add(Uri.fromFile(f));
}
}
share_intent.setAction(Intent.ACTION_SEND_MULTIPLE);//设置分享行为
share_intent.setType("image/png");//设置分享内容的类型
share_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
share_intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
context.startActivity(Intent.createChooser(share_intent, "Share"));
}
- 获取图片的绝对的分享地址
/**
*
* @param context
* @param imageFile
* @return content Uri
*/
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);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
return Uri.withAppendedPath(baseUri, "" + id);
} else {
if (imageFile.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
网友评论
这是我的图片路径,file_paths文件该怎么配置?我是分享单张图片,我按照你说的现在只要选择分享到qq,就提示我文件不存在或者为空,