1. 图片选择方式

1.1 系统图库

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, SELECT_IMAGE_REQUEST);

1.2 文件管理器

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, SELECT_IMAGE_REQUEST);

1.3 相机

通过Intent ACTION_IMAGE_CAPTURE,可以打开相机拍照。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_REQUEST);

2. 获取图片路径

2.1 Android 4.4(KitKat)以下版本

String path = uri.getPath();

2.2 Android 4.4(KitKat)及以上版本

public String getRealPathFromURI(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = {MediaStore.Images.Media.DATA};
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

2.3 Android 10(Q)及以上版本

public String getRealPathFromURI(Context context, Uri contentUri) {
    if (DocumentsContract.isDocumentUri(context, contentUri)) {
        if (isExternalStorageDocument(contentUri)) {
            String documentId = DocumentsContract.getDocumentId(contentUri);
            String[] split = documentId.split(":");
            String type = split[0];

            if ("primary".equalsIgnoreCase(type)) {
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            }
        } else if (isMediaDocument(contentUri)) {
            String documentId = DocumentsContract.getDocumentId(contentUri);
            String[] split = documentId.split(":");
            String type = split[0];

            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }

            String selection = MediaStore.Images.Media._ID + "=?";
            String[] selectionArgs = new String[]{documentId.split(":")[1]};

            return getDataColumn(context, contentUri, selection, selectionArgs);
        }
    }

    // Media is external (use the base external uri and sort out the rest below)
    return getRealPathFromURIActual(context, contentUri);
}

private String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
    Cursor cursor = null;
    String column = MediaStore.Images.Media.DATA;
    String[] projection = {column};
    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
        if (cursor != null && cursor.moveToFirst()) {
            int columnIndex = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(columnIndex);
        }
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return null;
}

private boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

private boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}

3. 总结