根据需求用 android+html5开发,实现上传图片兼容4.0 5.0 6.0
步骤:
1、获取相册图片路径
2、把图片转换成bigmap,压缩,剪切
3、把bigmap转成base64码
4、放到html5中显示
第一步-------------------------------------------获取路径-----------------------------------------------------------------------
public String getPicBase64Code(){ selectImageUri(); while (!isSelect){ try {Thread.sleep(1000);}catch (Exception e){} } isSelect = false; return base64code; }
/*** * 区分android版本 */ private void selectImageUri() { if(android.os.Build.VERSION.SDK_INT >=23){ if (!checkSelfPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { selectImage(); } }else{ selectImage(); }} 第二三步--------------------------------------转码----------------------------------------------------------------------------
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ if (resultCode != RESULT_OK) { if(resultCode == RESULT_CANCELED){ isSelect = true; base64code =""; } return ; } try {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if( requestCode == IMAGE_CODE) { String url = data.getData().toString(); Uri originalUri = data.getData(); //获得图片的uri //file://mnt/sdcard/photo/image.png if (url.contains("file://")) { bm = BitmapUtil.GetLocalOrNetBitmap(url); } //content://com.android.providers.media.documents/document/image%3A8641 else if (url.contains("/image%3A")) { bm = MediaStore.Images.Media.getBitmap(resolver, Uri.fromFile(new File(getPath(context, originalUri)))); } //content://media/external/images/media/69013 else if (url.contains("content://media/external/images/media")) { String[] proj = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(originalUri, proj, null, null, null); cursor.moveToFirst(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); } //缩放、裁剪 bm = BitmapUtil.zoomBitmap(bm, 200, 150); //压缩 base64code = BitmapUtil.bitmapToBase64(bm, 10); isSelect = true; }} catch (Exception e) { Log. e( "TAG-->Error",e.toString()); } }
其他方法:
/
private void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType(IMAGE_TYPE); startActivityForResult(intent, IMAGE_CODE); }private static final int REQUEST_STORAGE_PERMISSION = 0; public boolean checkSelfPermissions( final String permission){ int checkSelfPermission = ContextCompat. checkSelfPermission( this, permission); boolean granted =checkSelfPermission != PackageManager. PERMISSION_GRANTED; if (granted) { ActivityCompat. requestPermissions( this, new String[]{permission}, REQUEST_STORAGE_PERMISSION); if (!ActivityCompat. shouldShowRequestPermissionRationale( this, permission)) { //是否设置显示dialog new AlertDialog.Builder(LoginActivity. this) .setMessage( "你需要启动权限"+permission) .setPositiveButton( "OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat. requestPermissions(LoginActivity. this, new String[]{ permission}, REQUEST_STORAGE_PERMISSION); } }) .setNegativeButton( "Cancel", null) .create() .show(); } } return granted;} @TargetApi(Build.VERSION_CODES. KITKAT) public static String getPath( final Context context, final Uri uri) { String filePath = null; String wholeID = DocumentsContract. getDocumentId(uri); String id = wholeID.split( ":")[ 1]; String[] column = { MediaStore.Images.Media. DATA }; String sel = MediaStore.Images.Media. _ID+ "=?"; Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media. EXTERNAL_CONTENT_URI, column, sel, new String[] { id }, null); int columnIndex = cursor.getColumnIndex(column[ 0]); if (cursor.moveToFirst()) { filePath = cursor.getString(columnIndex); } cursor.close(); return filePath;} @Override public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults);}
工具类:
/** * Created by shuo on 2016/3/31. */ public class BitmapUtil { /** * bitmap转为base64 * @param bitmap * @param bitmapQuality 压缩质量 * @return */ public static String bitmapToBase64(Bitmap bitmap,int bitmapQuality) { String result = null; ByteArrayOutputStream baos = null; try { if (bitmap != null) { baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, bitmapQuality, baos); byte[] bitmapBytes = baos.toByteArray(); result = android.util.Base64.encodeToString(bitmapBytes, android.util.Base64.NO_WRAP); } } finally { try { if (baos != null) { baos.flush(); baos.close(); } } catch (IOException e) { e.printStackTrace(); } } return result; } /** * base64转为bitmap * @param base64Data * @return */ public static Bitmap base64ToBitmap(String base64Data) { byte[] bytes = android.util.Base64.decode(base64Data, android.util.Base64.DEFAULT); return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } /*** * 生成缩略图 * @param bitmap * @param width * @param height * @return */ public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); float scaleWidth = ((float) width / w); float scaleHeight = ((float) height / h); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp; } /** * 得到本地或者网络上的bitmap url - 网络或者本地图片的绝对路径,比如: * * A.网络路径: url="http://blog.foreverlove.us/girl2.png" ; * * B.本地路径:url="file://mnt/sdcard/photo/image.png"; * * C.支持的图片格式 ,png, jpg,bmp,gif等等 * * @param url * @return */ public static int IO_BUFFER_SIZE=2*1024; public static Bitmap GetLocalOrNetBitmap(String url) { Bitmap bitmap = null; InputStream in = null; BufferedOutputStream out = null; try { in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE); final ByteArrayOutputStream dataStream = new ByteArrayOutputStream(); out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE); copy(in, out); out.flush(); byte[] data = dataStream.toByteArray(); bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); data = null; return bitmap; } catch (IOException e) { e.printStackTrace(); return null; } } private static void copy(InputStream in, OutputStream out) throws IOException { byte[] b = new byte[IO_BUFFER_SIZE]; int read; while ((read = in.read(b)) != -1) { out.write(b, 0, read); } } }
第四步-----------------------------------------------------------------显示------------------------------------------------------------------------------------
其中有不足,有好方法可以请教