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

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

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

获取图片路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//方法重载获取返回值
@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及以上选择图片解决方法:

方法一:

1
2
3
4
5
6
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),代码如下:

1
2
3
4
5
  if  (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { //4.4及以上
                     intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
                 else  { //4.4以下
                     intent.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,要获取图片的存储路径需要,根据系统的版本使用不同的方法获得,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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://blog.sina.com.cn/s/blog_88be6cd00102uzu8.html

http://www.bubuko.com/infodetail-831974.html

http://blog.163.com/shexinyang@126/blog/static/13673931220149135409328/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值