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;} @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);
        }
    }

}

 
  
 
  
 
  

第四步-----------------------------------------------------------------显示------------------------------------------------------------------------------------




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




你可能感兴趣的:(Android)