Android打开相册获取图片路径

一.获得图片路径

当我们通过Intent打开相册,获取图片后,在onActivityResult回调中会得到图片的Uri。
但是Uri无法直接获得图片的路径。如果你曾经直接操作过android里的数据库的话,应该明白,Uri可以通过ContentResolver获得数据库表里的数据。

例如:
content://com.android.providers.media.documents/document/image:38

content:// 代表scheme
com.android.providers.media.documents 代表authority
document/image:38 代表path

由于打开图片获取的Uri会有不同的类型,所以需要通过不同的方法获取

 private String getImagePath(Uri uri, String selection) {
        String path = null;
        Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }

            cursor.close();
        }
        return path;
    }
private String Uri2Path(Uri uri) {

        String imagePath = null;
        if (DocumentsContract.isDocumentUri(this, uri)) {
            String docId = DocumentsContract.getDocumentId(uri);
            if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                //Log.d(TAG, uri.toString());
                String id = docId.split(":")[1];
                String selection = MediaStore.Images.Media._ID + "=" + id;
                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
            } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                //Log.d(TAG, uri.toString());
                Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(docId));
                imagePath = getImagePath(contentUri, null);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            //Log.d(TAG, "content: " + uri.toString());
            imagePath = getImagePath(uri, null);
        }
        return imagePath;
    }

二.运行时权限获取

由于需要进行文件的读取操作,所以需要获取相关权限。而在23及以上的手机上需要动态获取权限,所以只是进行上面的操作会显示错误。

首先我们需要在manifast清单中加入权限
android.permission.WRITE_EXTERNAL_STORAGE
当然,Read也是可以的,毕竟我们只是读取文件。

然后在java文件中,我们首先需要检测是否获得了权限,如果没有,再请求。

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            int isPermitted=ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (isPermitted!=PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            }
        }

然后在onRequestPermissionsResult中可以获得结果。

参考:
https://www.jianshu.com/p/f9a63fcc0b91

你可能感兴趣的:(准备毕业)