如何获得文件路径onActivityResult的Android 4.4系统 [英] How to get file path in onActivityResult in Android 4.4
本文介绍了如何获得文件路径onActivityResult的Android 4.4系统的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有关Android的4.3和更早的版本我用这个梅托德:
乌里myUri = data.getData();
光标光标= getContentResolver()查询(myUri,新的String [] {_数据},NULL,NULL,NULL);
cursor.moveToFirst();
字符串文件路径= cursor.getString(cursor.getColumnIndex(_数据));
cursor.close();
但Android的奇巧它返回null
解决方案
进口android.content.ContentUris;
进口android.content.Context;
进口android.database.Cursor;
进口android.net.Uri;
进口android.os.Build;
进口android.os.Environment;
进口android.provider.DocumentsContract;
进口android.provider.MediaStore;
公共类ImageFilePath {
/ **
*对于画廊的图像返回文件路径的方法
*
* @参数方面
* @参数URI
* @返回从图库中选择图像文件的路径
* /
公共静态字符串getPath(最终上下文的背景下,最终乌里URI){
//检查这里奇巧或新版本
最终布尔isKitKat = Build.VERSION.SDK_INT> = Build.VERSION_ codeS.KITKAT;
// DocumentProvider
如果(isKitKat&安培;&安培; DocumentsContract.isDocumentUri(上下文,URI)){
// ExternalStorageProvider
如果(isExternalStorageDocument(URI)){
最后弦乐的docId = DocumentsContract.getDocumentId(URI);
最终的String []分割= docId.split(:);
最终的字符串类型=分割[0];
如果(主.equalsIgnoreCase(类型)){
返回Environment.getExternalStorageDirectory()+/
+割裂[1];
}
}
// DownloadsProvider
否则如果(isDownloadsDocument(URI)){
最后字符串ID = DocumentsContract.getDocumentId(URI);
最后乌里contentUri = ContentUris.withAppendedId(
Uri.parse(内容://下载/ public_downloads),
Long.valueOf(ID));
返回getDataColumn(背景下,contentUri,NULL,NULL);
}
// MediaProvider
否则如果(isMediaDocument(URI)){
最后弦乐的docId = DocumentsContract.getDocumentId(URI);
最终的String []分割= docId.split(:);
最终的字符串类型=分割[0];
乌里contentUri = NULL;
如果(形象.equals(类型)){
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}否则如果(视频.equals(类型)){
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
}否则如果(音频.equals(类型)){
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
最后弦乐选择=_id =?;
最终的String [] selectionArgs两个=新的String [] {分割[1]};
返回getDataColumn(背景下,contentUri,选择,
selectionArgs两个);
}
}
// MediaStore(和一般)
否则,如果(内容.equalsIgnoreCase(uri.getScheme())){
//返回的远程地址
如果(isGooglePhotosUri(URI))
返回uri.getLastPathSegment();
返回getDataColumn(背景下,URI,NULL,NULL);
}
// 文件
否则,如果(文件.equalsIgnoreCase(uri.getScheme())){
返回uri.getPath();
}
返回null;
}
/ **
*获取此URI数据列的值。这是有用
* MediaStore尤里斯,和其他基于文件ContentProviders。
*
* @参数方面
*上下文。
* @参数URI
*的URI查询。
* @参数选择
*(可选)筛选查询中使用。
* @参数selectionArgs两个
在查询中使用*(可选)选择参数。
*返回:_data列,它通常是一个文件路径的值。
* /
公共静态字符串getDataColumn(上下文的背景下,开放的URI,
串选择,字符串[] selectionArgs两个){
光标光标= NULL;
最终的String列=_data;
最终的String []投影= {列};
尝试 {
光标= context.getContentResolver()查询(URI,投影,
选择,selectionArgs两个,空);
如果(光标=空&安培;!&安培; cursor.moveToFirst()){
最终诠释指数= cursor.getColumnIndexOrThrow(列);
返回cursor.getString(指数);
}
} 最后 {
如果(光标!= NULL)
cursor.close();
}
返回null;
}
/ **
* @参数URI
*的URI来检查。
* @返回URI是否权威ExternalStorageProvider。
* /
公共静态布尔isExternalStorageDocument(URI URI){
返回com.android.externalstorage.documents.equals(URI
.getAuthority());
}
/ **
* @参数URI
*的URI来检查。
* @返回URI是否权威DownloadsProvider。
* /
公共静态布尔isDownloadsDocument(URI URI){
返回com.android.providers.downloads.documents.equals(URI
.getAuthority());
}
/ **
* @参数URI
*的URI来检查。
* @返回URI是否权威MediaProvider。
* /
公共静态布尔isMediaDocument(URI URI){
返回com.android.providers.media.documents.equals(URI
.getAuthority());
}
/ **
* @参数URI
*的URI来检查。
* @返回URI是否权威是谷歌的照片。
* /
公共静态布尔isGooglePhotosUri(URI URI){
返回com.google.android.apps.photos.content.equals(URI
.getAuthority());
}
}
onActivityResult你写
@覆盖
公共无效onActivityResult(INT申请code,INT结果code,意图数据){
super.onActivityResult(要求code,因此code,数据);
如果(结果code == Activity.RESULT_OK){
如果(要求code == SELECT_PHOTO){
如果(空==数据)
返回;
乌里selectedImageUri = data.getData();
的System.out.println(selectedImageUri.toString());
//媒体库
selectedImagePath = ImageFilePath.getPath(
getActivity(),selectedImageUri);
Log.i(映像文件的路径,+ selectedImagePath);
的System.out.println(映像路径=+ selectedImagePath);
如果(selectedImagePath =空&安培;!&安培;!selectedImagePath.equals())
{
uploadImageOnServer upImg =新uploadImageOnServer();
upImg.execute();
}
其他
{
AlertDialogManager alDailog =新AlertDialogManager(getActivity(),图片上传,请选择有效的图像,0);
alDailog.showDialog();
}
}
}
}
For android 4.3 and earlier I use this metod:
Uri myUri = data.getData();
Cursor cursor = getContentResolver().query(myUri,new String []{"_data"}, null, null, null);
cursor.moveToFirst();
String filePath = cursor.getString(cursor.getColumnIndex("_data"));
cursor.close();
But for Android kitKat it return null
解决方案
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
public class ImageFilePath {
/**
* Method for return file path of Gallery image
*
* @param context
* @param uri
* @return path of the selected image file from gallery
*/
public static String getPath(final Context context, final Uri uri) {
// check here to KITKAT or new version
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/"
+ split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] { split[1] };
return getDataColumn(context, contentUri, selection,
selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context
* The context.
* @param uri
* The Uri to query.
* @param selection
* (Optional) Filter used in the query.
* @param selectionArgs
* (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri,
String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = { column };
try {
cursor = context.getContentResolver().query(uri, projection,
selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri
.getAuthority());
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri
.getAuthority());
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri
.getAuthority());
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri
.getAuthority());
}
}
onActivityResult you have to write
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == SELECT_PHOTO) {
if (null == data)
return;
Uri selectedImageUri = data.getData();
System.out.println(selectedImageUri.toString());
// MEDIA GALLERY
selectedImagePath = ImageFilePath.getPath(
getActivity(), selectedImageUri);
Log.i("Image File Path", "" + selectedImagePath);
System.out.println("Image Path ="+selectedImagePath);
if(selectedImagePath!=null&&!selectedImagePath.equals(""))
{
uploadImageOnServer upImg = new uploadImageOnServer();
upImg.execute();
}
else
{
AlertDialogManager alDailog = new AlertDialogManager(getActivity(), "Image Upload", "Please Select Valid Image", 0);
alDailog.showDialog();
}
}
}
}
这篇关于如何获得文件路径onActivityResult的Android 4.4系统的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文