美文网首页Andoid
Android4.4以上版本从图库选择图片返回的路径不正确解决方

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

作者: Haraway | 来源:发表于2017-01-06 16:25 被阅读0次

    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以上版本从图库选择图片返回的路径不正确解决方

        本文链接:https://www.haomeiwen.com/subject/hccxbttx.html