Code Bye

android选择图片,获取路径为空

package com.example.upimg;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import com.lidroid.xutils.BitmapUtils;
public class MainActivity extends Activity {
private Button btn;
private ImageView iv;
private final String IMAGE_TYPE = “image/*”;
private final int IMAGE_CODE = 1;
String path = “”;
BitmapUtils bitmapUtils;
Uri originalUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
getAlbum.setType(IMAGE_TYPE);
startActivityForResult(getAlbum, IMAGE_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) { // 此处的 RESULT_OK 是系统自定义得一个常量
System.out.println(“error”);
return;
}
Bitmap bm = null;
// 外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
ContentResolver resolver = getContentResolver();
// 此处的用于判断接收的Activity是不是你想要的那个
if (requestCode == IMAGE_CODE) {
try {
originalUri = data.getData(); // 获得图片的uri
// 显得到bitmap图片这里开始的第二部分,获取图片的路径:
bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);
String[] proj = { MediaStore.Images.Media.DATA };
// 好像是android多媒体数据库的封装接口,具体的看Android文档
Cursor cursor = managedQuery(originalUri, proj, null, null,
null);
// 按本人个人理解 这个是获得用户选择的图片的索引值
int column_index = cursor
.getColumnIndex(MediaStore.Images.Media.DATA);
// 将光标移至开头 ,这个很重要,不小心很容易引起越界
cursor.moveToNext();
// 最后根据索引值获取图片路径
path = cursor.getString(column_index);
System.out.println(path+” a”);
iv.setImageBitmap(bm);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这个代码是网上找的,本人本人试了,但是图片地址path  = null ;; 怎么做才能拿到图片地址 path
解决方案

2

先看看有没有获取读写SDCard的权限   本人之前写过一个Demo,是原因是没加权限

2

Environment.getExternalStorageDirectory();
来获取SD卡根目录

2

你没把/mnt/sdcard/加在文件名前面。具体就如楼上那么表示。

3

问一下你解决了么?

2

给你说对吧斯蒂芬vbs

3

cursor.moveToNext(); 你这是把光标移到开头么?光标移到开头cursor.moveToFirst();你那样得到的值肯定是空的.原因是查询完成的时候,光标已经在最后一个位置了,你再移动到下一个了,值就是空了

2

你这种方法调用图库并获取图片在android4.4版本之前是可行的,但是之后就不可行了,(即在android4.4版本之后)。根本原因是前者和后者返回的URI已经不是同一个了,前者URI中包含了文件的绝对路径,是有_data的,但是后者URI就没有了。所以你拿不到!
<4.4 URI:content://media/external/images/media/164 含有文件的绝对路径
》4.4URI :content://com.android.providers.media.documents/document/image:3951,只有文件的相对编号
两者返回的内容也有所不同
解决的放法有很多,比较简单的就是Intent.ACTION_GET_CONTENT换成Intent.ACTION_PICK

4

// 设置要返回的字段
String[] columns = { Media.DATA }; // , Media._ID, Media.TITLE, Media.DISPLAY_NAME
// 执行查询,返回一个cursor
Cursor cursor = managedQuery(Media.EXTERNAL_CONTENT_URI, columns, null, null, null);
cursor.moveToFirst();
int fileColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
List<String> imagePath = new ArrayList<String>();
do {
String imageFilePath = cursor.getString(fileColumn);
System.out.println(imageFilePath);
imagePath.add(imageFilePath);
} while (cursor.moveToNext());
一直用的4.3 不知道4.4之后能不能用, 可以试一下.

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明android选择图片,获取路径为空