How to get file path in onActivityResult in Android 4.4

For android 4.3 and earlier, I use this method:

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 returns null

+3


source to share


1 answer


            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();
                            }



                        }
                    }

                }

      



+18


source







All Articles