Android4.4以上版本从图库选择图片返回的路径不正确解决方法

android 4.4系统以前,选择图片,获取图片路径代码如下:

//访问图库
Intent intent = new Intent();
intent.setType("image/*");//可选择图片视频
intent.setAction(Intent.ACTION_GET_CONTENT );
startActivityForResult(intent, Select);

获取图片路径

//方法重载获取返回值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case Select:
            if (resultCode == RESULT_OK) {
                /**
                 * 当选择的图片不为空的话,在获取到图片的途径
                 */
                Uri uri = data.getData();
               // String ddd=Uri.decode(uri.toString());
                try {
                    String[] pojo = {MediaStore.Images.Media.DATA};
 
                    Cursor cursor = managedQuery(uri, pojo, null, null, null);
                    if (cursor != null) {
                        ContentResolver cr = this.getContentResolver();
                        int colunm_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        cursor.moveToFirst();
                        String path = cursor.getString(colunm_index);
                        //以上代码获取图片路径
                      
                         /*获取文件的扩展名*/
                        File f2 = new File(path);
                        String fName2 = f2.getName();//文件名
                        String extendName1 = fName2.substring(fName2.lastIndexOf(".") + 1);//扩展名
                        //复制到指定文件夹中文件的新的名称
                        // String fileName1 = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "." + extendName1;//导入后图片名称
                        String TotalName = Long.toString(System.currentTimeMillis()) + "_" + caseName + "_" + fileName+ "_" + userName;
                        String fileName1 = TotalName + "." + extendName1;
                        // String fileName=str.substring(str.lastIndexOf("/")+1,str.length());
                /*新建存储导入文件的文件夹*/
                        pastePath = mPath + "Import/";
                        File out = new File(pastePath);
                        if (!out.exists()) {
                            out.mkdirs();
                        }
                        //文件的存储路径
                        String newPathone = pastePath + fileName1;
                        boolean res = copyFile(path, newPathone);//复制录音文件到指定文件夹
 
                /*复制另外一份文件到不会删除的目录下方*/
                        ImportPath = newPath + "Import/";
                        File outfileOnew = new File(ImportPath);
                        if (!outfileOnew.exists()) {
                            outfileOnew.mkdirs();
                        }
                        //文件的存储路径
                        String newPathThree = ImportPath + fileName1;
                        boolean result = copyFile(path, newPathThree);//复制录音文件到指定文件夹
                        if (result == true && res == true) {
                            Toast.makeText(this, "导入成功!", Toast.LENGTH_SHORT).show();
                        }
 
                    }
 
                } catch (Exception e) {
                }
                break;
            }
    }
}

Android 4.4系统及以上,使用以上方法获取到的图片路径为空,原因如下:
Android 4.4(含)开始,通过以上方式访问图库后,返回的Uri如下(访问“最近”):
Uri is:content://com.android.providers.media.documents/document/image%3A188382 Uri.getPath is :/document/image:188383 对应的图片真实路径:/storage/emulated/0/Pictures/Screenshots/Screenshot_2014-09-22-21-40-53.png
不但如此,对于不同类型图库,返回的Uri形式并不相同(访问普通相册):
Uri is:content://media/external/images/media/188222 Uri.getPath is :/external/images/media/188223 对应的图片真实路径:/storage/emulated/0/Download/20130224235013.jpg
而4.4之前返回的Uri只存在一种形式,如下:
Uri is: content://media/external/images/media/140462 Uri.getPath is :/external/images/media/140463对应的图片真实路径:/storage/emulated/0/DCIM/Camera/20130224235013.jpg
因此,在Android 4.4或更高版本设备上,通过简单的getDataColumn(Context, Uri, null, null)进行图片数据库已经不能满足所有需求,因此在获取图片真实路径的时候需要根据不同类型区分对待。
针对android4.4及以上选择图片解决方法:
方法一:
Intent intent = new Intent();
intent.setType("image/*");//可选择图片视频
//修改为以下两句代码
intent.setAction(Intent.ACTION_PICK);
intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//使用以上这种模式,并添加以上两句
startActivityForResult(intent, Select);

使用上面的方法,使用android4.4以下onActivityResult中的方法就可以获取到路径,这种方法不区分系统版本。
方法二:
在android中选择图片时,打开相册选择图片(根据是否是4.4及以上设置不同action),代码如下:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {//4.4及以上    intent2.setAction(Intent.ACTION_OPEN_DOCUMENT);
} else {//4.4以下    
intent2.setAction(Intent.ACTION_GET_CONTENT);
}

在onActivityResult里面返回的Uri uri = data.getData();如果是android4.4 uri格式为content://com.android.providers.media.documents/document/image:3952,4.4以下格式为

content://media/external/images/media/3951,要获取图片的存储路径需要,根据系统的版本使用不同的方法获得,代码如下:

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT){//4.4及以上
    String wholeID = DocumentsContract.getDocumentId(contentUri);
    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();
}else{//4.4以下,即4.4以上获取路径的方法
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    filePath = cursor.getString(column_index);
}

**注意:总的来说第二种方式的效果对于4.4系统的界面看起来很不错的,如果只求功能第一种就简便一些了。
参考网址:
[http://y.dobit.top/Detail/61.html]
[http://blog.sina.com.cn/s/blog_88be6cd00102uzu8.html]
[http://www.bubuko.com/infodetail-831974.html]
[http://blog.163.com/shexinyang@126/blog/static/13673931220149135409328/]

关键代码:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {//4.4及以上    intent2.setAction(Intent.ACTION_OPEN_DOCUMENT);
} else {//4.4以下    
intent2.setAction(Intent.ACTION_GET_CONTENT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case PHOTO_REQUEST_TAKEPHOTO:// 当选择拍照时调用
            PrefTool.setBooleanSave(this, Prefs.PRE_NOT_TO_BACKGROUD, false);
            if (resultCode == Activity.RESULT_OK) {
                piclist.add(picName);
                refreshListView();
            }
            break;
        case PHOTO_REQUEST_GALLERY:// 当选择从本地获取图片时
            PrefTool.setBooleanSave(this, Prefs.PRE_NOT_TO_BACKGROUD, false);
            if (resultCode == Activity.RESULT_OK) {
                Uri uri = data.getData();
                String imgPath = "";
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {//4.4及以上
                    String wholeID = DocumentsContract.getDocumentId(uri);
                    String id = wholeID.split(":")[1];
                    String[] column = {MediaStore.Images.Media.DATA};
                    String sel = MediaStore.Images.Media._ID + "=?";
                    Cursor cursor = GroupContext.getApplication().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column,
                            sel, new String[]{id}, null);
                    int columnIndex = cursor.getColumnIndex(column[0]);
                    if (cursor.moveToFirst()) {
                        imgPath = cursor.getString(columnIndex);
                    }
                    cursor.close();
                } else {//4.4以下,即4.4以上获取路径的方法
                    Cursor cursor = getContentResolver().query(uri, null, null,
                            null, null);
                    cursor.moveToFirst();
                    cursor.moveToFirst();
                    String imgNo = cursor.getString(0); // 图片编号
                    imgPath = cursor.getString(1); // 图片文件路径
                    String imgSize = cursor.getString(2); // 图片大小
                    String imgName = cursor.getString(3); // 图片文件名
                    cursor.close();
                }
                String picName = DateUtil.format(new Date(), "yyyyMMddHHmmss")
                        + ".jpg";
                FileCache.copyFile(imgPath, Files.photoPath + picName);
                piclist.add(picName);
                refreshListView();
            }
            break;

    }
}

你可能感兴趣的:(Android4.4以上版本从图库选择图片返回的路径不正确解决方法)