android+html5 上傳圖片兼容4.0 5.0 6.0

根據需求用 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碼/>



其中有不足,有好方法可以請教




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章