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
下面是处理图片的工具类:public class BitmapUtil { /** * 获取小尺寸的照片 * * @param filePath 压缩照片的路径 * @return 返回压缩处理后的照片 */ public static Bitmap getBitmap(String filePath) { Bitmap bitmap = null; BitmapFactory.Options op
</head>
<input accept=image/* name=upimage id=upload_file type=file onchange=gen_base64()>
<textarea id=base64_output name=Word style= width:820px></textarea>
"action": "action_name",
"callback": "function_name", // optional
"data": {...} // optional
id:这次操作的id,回调时会再传回来。因为交互有可能是异步的,对同一个接口调用多次时,回调时以id来区分是哪一次。id由js自己定义保证唯一即可,简单的做法是使用M
在 Android 给 JS 传 Base64 格式的图片时
报错 Refusing to load URL as it exceeds 2097152 characters
2097152 字节 / 1024 / 1024 = 2 兆,这说明调用 loadUrl,最多只能传 2M 的内容
Base64是将原文按照每 3 个字节一组分开,这个 3 字节组中的每一组将被按照位分解成 4 个部分,每个...
package cn.pucheng.parking.activity;
import android.Manifest;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.D...
Android上加载网页无非就这么几句话
webView1.getSettings().setJavaScriptEnabled(true);//设置JavaScript接口
webView1.loadUrl("你所要加载网页的地址");/*