选取图片最佳实践

2017-10-17  本文已影响9人  满船清梦___
  1. 开启选取图片Intent, 其他方式存在各种问题,
void choosePic() {
        Intent intent = new Intent(Intent.ACTION_PICK);// ACTION_GET_CONTENT
        intent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intent, PICTURE);
    }
  1. 获取选取的result, 根据标记code判断并获取uri
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data == null) {
            return;
        }
        Uri uri = data.getData();
        switch (requestCode) {
            case PICTURE:
                String path = "";
                Log.d(TAG, "uri: " + uri);
                Log.d(TAG, "uri RealPath: " + getPathFromUri(this, uri));

                if (new File(uri.getPath()).exists()) {
                    path = uri.getPath();
                    Log.d(TAG, "uri.getPath()");
                } else {
                    path = getPathFromUri(this, uri);
                    Log.d(TAG, "setImageBitmap");
                }
                Log.d(TAG, "path: " + path);

                Bitmap bm = BitmapFactory.decodeFile(path);
                image.setLayerType(View.LAYER_TYPE_HARDWARE,null);
                image.setImageBitmap(bm);
                File file = new File(path);
                Log.d(TAG, "file.exists():" + file.exists());
                Log.d(TAG, "file.getPath():" + file.getPath());
                break;
            default:
                break;
        }
    }
  1. 对应不同机型,返回的uri类型不同,需判断处理后统一格式
    public static String getPathFromUri(Context context, Uri contentUri) {
        Cursor cursor = null;
        try {
            String[] proj = {MediaStore.Images.Media.DATA};
            cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
            if (cursor != null) {
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
            } else {
                return null;
            }
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }
  1. 安卓版本6.0以后, 注意申请权限
    @RequiresApi(api = Build.VERSION_CODES.M)
    void requestPermission() {
        int REQUEST_CODE_CONTACT = 101;
        String[] permissions = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
        //验证是否许可权限
        for (String str : permissions) {
            if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                //申请权限
                this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
                return;
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读