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/