android 4.4之前可以用这种方法获取图片的绝对路径
String[] proj = { MediaStore.Images.Media.DATA };
cursor = activity.managedQuery(uri, proj, null, null, null);
column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
} catch (Exception e) {
return null;
}
if (column_index == -1) {
return null;
}
String path = cursor.getString(column_index);
但是android4.4之后,用这种方法获取到到path为null。
这时候就需要根据系统版本来使用不同方法处理了。
Android系统中可以通过如下方法判断版本:
Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
所以,我们正确的获取选择选择图片的绝对路径的方法应该这样写:
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;
/**
* Created by nicholas on 1/18/15.
*/
public class FileUtil {
Uri contentUri;
boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
public FileUtil() {
}
public void setContentUri(Uri uri) {
this.contentUri = uri;
}
public Uri getContentUri() {
return contentUri;
}
public String getPath(Context context, Uri uri) {
Log.v(" File -",
"Authority: " + uri.getAuthority() +
", Fragment: " + uri.getFragment() +
", Port: " + uri.getPort() +
", Query: " + uri.getQuery() +
", Scheme: " + uri.getScheme() +
", Host: " + uri.getHost() +
", Segments: " + uri.getPathSegments().toString()
);
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
return getRealPathFromUriKitKatPlus(context, uri);
} else {
return getRealPathFromUriMinusKitKat(context, uri);
}
}
private String getRealPathFromUriKitKatPlus(Context context, Uri uri) {
Cursor cursor = null;
String wholeId = DocumentsContract.getDocumentId(uri);
String id = wholeId.split(":")[1];
try {
String proj[] = {MediaStore.Images.Media.DATA};
String sel = MediaStore.Images.Media._ID + "=?";
cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
proj, sel, new String[]{id}, null);
int column_index = cursor.getColumnIndexOrThrow(proj[0]);
String filePath = "";
if (cursor.moveToFirst()){
filePath = cursor.getString(column_index);
}
cursor.close();
return filePath;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
private String getRealPathFromUriMinusKitKat(Context context, Uri uri) {
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
System.out.println(picturePath);
return picturePath;
}
}
参考:
http://welp.cn/question/26481/answer/50052
https://github.com/npesa92/myFitWhole/blob/bc61b302d524a66f759ed24fd0d07c2a1356d900/app/src/main/java/com/nicky/myfit/util/FileUtil.java