Android用原生分享多张图片适配7.0、8.0

常规操作只能适配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及以下都是没问题的

image.png

但是在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;
        }
    }
}

按照以上步骤操作,可能会解决分享的问题,亲测有效!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,758评论 25 708
  • 本篇主要对Android调用系统相机裁剪及适配Android N的总结,不习惯简书代码风格的,也可以在 Andro...
    Showdy阅读 9,665评论 9 34
  • 转载出处:http://blog.csdn.net/chay_chan 关于 最近在软件的维护和更新过程中,了解到...
    LightDreams阅读 1,373评论 1 51
  • Android7.0发布已经有一个多月了,Android7.0在给用户带来一些新的特性的同时,也给开发者带来了新的...
    东经315度阅读 1,433评论 0 14
  • 当下时常被同学说的一句话就是,不要因为没结果而避免开始,然而有结果的人生我认为是奋斗的动力,回首我的高中岁月,虽不...
    韩铭阅读 271评论 0 1

友情链接更多精彩内容