android从相册中获取图片Base64后通过JS桥传递给H5加载实现

下面是处理图片的工具类:

public class BitmapUtil {

    /**
     * 获取小尺寸的照片
     *
     * @param filePath 压缩照片的路径
     * @return 返回压缩处理后的照片
     */
    public static Bitmap getBitmap(String filePath) {

        Bitmap bitmap = null;

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;//只读取图片,不加载到内存中
        BitmapFactory.decodeFile(filePath, options);
        options.inSampleSize = Math.max(1, (int) Math.ceil(Math.max(
                (double) options.outWidth / 1024f,
                (double) options.outHeight / 1024f)));
        options.inJustDecodeBounds = false;//加载到内存中
        bitmap = BitmapFactory.decodeFile(filePath, options);

        return bitmap;
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    public static String getPath(final Context context, final Uri uri) {
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
        // 文件提供
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // 外部存储设备提供
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/"
                            + split[1];
                }
                // TODO handle non-primary volumes
            }
            // 下载文件提供
            else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            }
            // 媒体提供
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = MediaStore.MediaColumns._ID + "=?";
                final String[] selectionArgs = new String[]{split[1]};
                return getDataColumn(context, contentUri, selection,
                        selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return null;
    }

    /**
     * Get the value of the data column for this Uri . This is useful for
     * MediaStore Uris , and other file - based ContentProviders.
     *
     * @param context       The context.
     * @param uri           The Uri to query.
     * @param selection     (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri,
                                       String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = MediaStore.MediaColumns.DATA;
        final String[] projection = {column};
        try {
            cursor = context.getContentResolver().query(uri, projection,
                    selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri
                .getAuthority());
    }


    public static byte[] getBitmapByte(Bitmap bitmap) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
        try {
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return out.toByteArray();
    }
}

使用方法:

 private void openGallery(int num) {

            RxGalleryFinal.with(ApplicationLike.appContext)
                    .image()
                    .gif(true)
                    .multiple()
                    .maxSize(num)
                    .imageLoader(ImageLoaderType.GLIDE)
                    .subscribe(new RxBusResultDisposable<ImageMultipleResultEvent>() {
                        @RequiresApi(api = Build.VERSION_CODES.O)
                        @Override
                        protected void onEvent(ImageMultipleResultEvent event) throws Exception {
                            if (null != event && null != event.getResult() && event.getResult().size() > 0) {
                                if (cordovaCallbackContext != null) {
                                    ArrayList<MediaBean> result = (ArrayList<MediaBean>) event.getResult();
                                    JSONArray jsonArray = new JSONArray();
                                    for (int i = 0; i < result.size(); i++) {

                                        Uri originalUri = Uri.parse("file://" + result.get(i).getOriginalPath());
                                        Uri thumbnailBigUri = Uri.parse("file://" + result.get(i).getThumbnailSmallPath());
                                        String path = BitmapUtil.getPath(ApplicationLike.appContext, originalUri);
                                        Bitmap bitmap = BitmapUtil.getBitmap(path);

                                        jsonArray.put("data:image/png;base64," + Base64.encodeToString(BitmapUtil.getBitmapByte(bitmap), Base64.URL_SAFE));
                                    }
                                    cordovaCallbackContext.success(jsonArray);
                                }
                            }
                        }

                        @Override
                        public void onComplete() {
                            super.onComplete();
                        }
                    }).openGallery();

            //得到图片多选的事件
            RxGalleryListener.getInstance().setMultiImageCheckedListener(new IMultiImageCheckedListener() {
                @Override
                public void selectedImg(Object t, boolean isChecked) {
                    //这个主要点击或者按到就会触发,所以不建议在这里进行Toast
                }

                @Override
                public void selectedImgMax(Object t, boolean isChecked, int maxSize) {
                    ToastUtil.showToast("您最多只能选择" + maxSize + "张图片");
                }
            });

    }

其中RxGalleryFinal为从相册中获取图片的开源框架,地址为:GitHub - FinalTeam/RxGalleryFinal

重点代码:
"data:image/png;base64," + Base64.encodeToString(BitmapUtil.getBitmapByte(bitmap), Base64.URL_SAFE));

1. Base64.encodeToString(BitmapUtil.getBitmapByte(bitmap), Base64.URL_SAFE)将bitmap转换为Base64处理后的字符串。

2.  "data:image/png;base64," 是网页加载图片需要的 ,必须拼接到前面。想要了解跟多请借鉴:      https://blog.csdn.net/lidongliangzhicai/article/details/95030067

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AndroidJS之间传递图片通常有两种方式,一种是通过Base64编码的方式传递,另一种是通过文件路径传递。 如果你选择使用Base64编码的方式传递图片,在Android端需要将图片转换为Base64字符串,然后将其传递JS。在JS端接收到Base64字符串后,需要将其转换为图片进行展示或者上传。 以下是一个简单的示例代码: Android端代码: ```java // 将图片转换为Base64字符串 public String imageToBase64(String path) { Bitmap bitmap = BitmapFactory.decodeFile(path); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] bytes = baos.toByteArray(); return Base64.encodeToString(bytes, Base64.DEFAULT); } // 将Base64字符串传递JS webView.loadUrl("javascript:showImage('" + imageToBase64(path) + "')"); ``` JS端代码: ```javascript // 接收Base64字符串,并将其转换为图片 function showImage(base64String) { var img = document.createElement('img'); img.src = 'data:image/png;base64,' + base64String; document.body.appendChild(img); } ``` 如果你想通过文件路径传递图片,可以参考下面的示例代码: Android端代码: ```java // 选择图片 private void chooseImage() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, REQUEST_CODE_CHOOSE_IMAGE); } // 将文件路径传递JS @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_CHOOSE_IMAGE && resultCode == RESULT_OK) { Uri uri = data.getData(); String path = getPath(uri); webView.loadUrl("javascript:showImage('" + path + "')"); } } // 获取文件路径 private String getPath(Uri uri) { String[] projection = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String path = cursor.getString(column_index); cursor.close(); return path; } ``` JS端代码: ```javascript // 接收文件路径,并将其展示或者上传 function showImage(path) { var img = document.createElement('img'); img.src = path; document.body.appendChild(img); } ``` 以上是两种常见的在AndroidJS之间传递图片的方式,你可以根据具体的需求选择适合自己的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值