如何获得文件路径onActivityResult的Andr​​oid 4.4系统 [英] How to get file path in onActivityResult in Android 4.4

查看:142
本文介绍了如何获得文件路径onActivityResult的Andr​​oid 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的Andr​​oid 4.4系统的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆