根據需求用 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;}@Overridepublic 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); } } }
第四步-----------------------------------------------------------------顯示------------------------------------------------------------------------------------
<img src=“data:image/png;base64,這個地方是base64碼/>
其中有不足,有好方法可以請教