美文网首页Android 开发技术分享Android技术知识Android开发
Android用原生分享多张图片适配7.0、8.0

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

作者: HannyYeung | 来源:发表于2018-01-15 17:33 被阅读1039次

    常规操作只能适配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;
            }
        }
    }
    
    

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

    相关文章

      网友评论

      • 807a53f53c49:data/data/../files/ 下的文件分享有问题 微信 qq 不行 qq邮箱可以。
      • 807a53f53c49:思路清晰
      • 努力搬砖:这种方式如果QQ或者微信已经唤醒或者打开,无法分享成功
        努力搬砖:@HannyYeung 你这不使用setClass()或者ComponentName么??
        努力搬砖:@HannyYeung 我测试过,如果微信或者QQ已经打开,点击分享只会打开微信或者QQ,但是不能分享
        HannyYeung:不会吧,我测试的时候,微信是打开的呀
      • SuperZiLu:/storage/emulated/0/AAAAAAAPlus/1550447848@qq.com/Snapshot/0001002003/IP116 Plus_saved picture_20180619_150756.png
        这是我的图片路径,file_paths文件该怎么配置?我是分享单张图片,我按照你说的现在只要选择分享到qq,就提示我文件不存在或者为空,

      本文标题:Android用原生分享多张图片适配7.0、8.0

      本文链接:https://www.haomeiwen.com/subject/irydoxtx.html