博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android选择图片,通过uri获取路径
阅读量:6229 次
发布时间:2019-06-21

本文共 4567 字,大约阅读时间需要 15 分钟。

hot3.png

/** * 选择相册图片 */public void choosePhoto() {        Intent intent = new Intent();		intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");        intent.setAction(Intent.ACTION_PICK);        startActivityForResult(intent, ALBUM_REQUEST_CODE);} 	@Override    public void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == Activity.RESULT_OK) {            if (requestCode == ALBUM_REQUEST_CODE) {                try {                    Uri uri = data.getData();                    Bitmap bitmap = getBitmap(uri);                    // 设置图片预览                    ivPhoto.setImageBitmap(bitmap);                    photoPath = getRealPathFromUri(FeedBackActivity.this, uri);                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }		private Bitmap getBitmap(Uri uri) {        if (uri == null) return null;        Bitmap bitmap = null;        try {            ContentResolver cr = this.getContentResolver();            bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));        } catch (FileNotFoundException e) {            e.printStackTrace();            LogUtils.e("Exception", e.getMessage(),e);        }        return bitmap;    }/** * 根据Uri获取图片的绝对路径 * * @param context 上下文对象 * @param uri     图片的Uri * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null */public static String getRealPathFromUri(Context context, Uri uri) {    int sdkVersion = Build.VERSION.SDK_INT;    if (sdkVersion >= 19) { // api >= 19        return getRealPathFromUriAboveApi19(context, uri);    } else { // api < 19        return getRealPathFromUriBelowAPI19(context, uri);    }} /** * 适配api19以下(不包括api19),根据uri获取图片的绝对路径 * * @param context 上下文对象 * @param uri     图片的Uri * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null */private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {    return getDataColumn(context, uri, null, null);} /** * 适配api19及以上,根据uri获取图片的绝对路径 * * @param context 上下文对象 * @param uri     图片的Uri * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null */@SuppressLint("NewApi")private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {    String filePath = null;    if (DocumentsContract.isDocumentUri(context, uri)) {        // 如果是document类型的 uri, 则通过document id来进行处理        String documentId = DocumentsContract.getDocumentId(uri);        if (isMediaDocument(uri)) { // MediaProvider            // 使用':'分割            String id = documentId.split(":")[1];             String selection = MediaStore.Images.Media._ID + "=?";            String[] selectionArgs = {id};            filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);        } else if (isDownloadsDocument(uri)) { // DownloadsProvider            Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));            filePath = getDataColumn(context, contentUri, null, null);        }    } else if ("content".equalsIgnoreCase(uri.getScheme())){        // 如果是 content 类型的 Uri        filePath = getDataColumn(context, uri, null, null);    } else if ("file".equals(uri.getScheme())) {        // 如果是 file 类型的 Uri,直接获取图片对应的路径        filePath = uri.getPath();    }    return filePath;} /** * 获取数据库表中的 _data 列,即返回Uri对应的文件路径 * @return */private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {    String path = null;     String[] projection = new String[]{MediaStore.Images.Media.DATA};    Cursor cursor = null;    try {        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);        if (cursor != null && cursor.moveToFirst()) {            int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);            path = cursor.getString(columnIndex);        }    } catch (Exception e) {            e.printStackTrace();	}finally {		if (cursor != null) {			cursor.close();		}	}    return path;} /** * @param uri the Uri to check * @return Whether the Uri authority is MediaProvider */private static boolean isMediaDocument(Uri uri) {    return "com.android.providers.media.documents".equals(uri.getAuthority());} /** * @param uri the Uri to check * @return Whether the Uri authority is DownloadsProvider */private static boolean isDownloadsDocument(Uri uri) {    return "com.android.providers.downloads.documents".equals(uri.getAuthority());}

转载于:https://my.oschina.net/u/2501904/blog/1922245

你可能感兴趣的文章
搭建hexo博客
查看>>
shell编程(一)基础
查看>>
图的着色问题
查看>>
( 转)UVM验证方法学之一验证平台
查看>>
Jdbc&Web
查看>>
MySQL 数据类型
查看>>
对于WEB APP安全问题的一些思考
查看>>
《Unicast QoS Routing Algorithms for SDN Survey 2018》【毕设 - 论文阅读】
查看>>
修改上传文件控件的样式-----html,css
查看>>
Firebug控制台详解[转]
查看>>
使用Flash Builder 4.6出现 新建配置 失败 java.lang.NullPointerException错误
查看>>
Frp基础配置模版
查看>>
JDK源码阅读--Object
查看>>
有关于认证和加密
查看>>
深入浅出Git教程(转载)
查看>>
[转载]MySQL5.6 PERFORMANCE_SCHEMA 说明
查看>>
max_allowed_packet引起同步报错处理
查看>>
006 复杂的数据类型&函数(方法)
查看>>
javascript:getElementsByName td name
查看>>
ASP.NET连接SQL、Access、Excel数据库(二)——连接实例
查看>>