Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get filepath and filename of selected gallery image in Android

I am creating an app which uploads a selected image from the gallery and uploads it to a web service. The webservice requires the filename of selected image plus a base64 encoding of the file contents. I have managed to achieve this with a hardcoded file path. However, I am struggling to get the real filepath of the image. I have read around the web and have this code, but it does not work for me:

 public void onActivityResult(int requestCode, int resultCode, Intent data) {    if (resultCode == RESULT_OK) {      Uri selectedImageUri = data.getData();      String[] projection = {MediaStore.Images.Media.DATA};       try {        Cursor cursor = getContentResolver().query(selectedImageUri, projection, null, null, null);        cursor.moveToFirst();         int columnIndex = cursor.getColumnIndex(projection[0]);        String picturePath = cursor.getString(columnIndex);        cursor.close();        Log.d("Picture Path", picturePath);      }      catch(Exception e) {        Log.e("Path Error", e.toString());      }    }  } 

I get this error:

java.lang.NullPointerException 

EDIT

Forgot to mention I am using Kitkat. It looks like my problem is KitKat related. I found this (see below) which helped me get my app working:

Android Gallery on KitKat returns different Uri for Intent.ACTION_GET_CONTENT

like image 360
amburnside Avatar asked Dec 02 '13 08:12

amburnside


1 Answers

Add this class in your project

ImageFilePath.java

import android.annotation.SuppressLint; import android.annotation.TargetApi; 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;  //import android.provider.<span id="IL_AD11" class="IL_AD">MediaStore</span>;  @SuppressLint("NewApi") @TargetApi(Build.VERSION_CODES.KITKAT) public class ImageFilePath {      /**      * Method for return file path of Gallery image      *      * @param context      * @param uri      * @return path of the selected image file from gallery      */     static String nopath = "Select Video Only";      @TargetApi(Build.VERSION_CODES.KITKAT)     @SuppressLint("NewApi")     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 nopath;     }      /**      * Get the value of the data column for this Uri. This is <span id="IL_AD2"      * class="IL_AD">useful</span> 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 nopath;     }      /**      * @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());     } } 

In your onActivityResult

 @Override     public void onActivityResult(int requestCode, int resultCode, Intent data) {         super.onActivityResult(requestCode, resultCode, data);          if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {              Uri uri = data.getData();               realPath = ImageFilePath.getPath(SignupActivity.this, data.getData()); //                realPath = RealPathUtil.getRealPathFromURI_API19(this, data.getData());              Log.i(TAG, "onActivityResult: file path : " + realPath);             try {                 Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);                 // Log.d(TAG, String.valueOf(bitmap));                  ImageView imageView = (ImageView) findViewById(R.id.img_profile);                 imageView.setImageBitmap(bitmap);                 imageView.setVisibility(View.VISIBLE);              } catch (IOException e) {                 e.printStackTrace();             }         } else {             Toast.makeText(this, "Something Went Wrong", Toast.LENGTH_SHORT).show();         }      } 
like image 180
Arpit Patel Avatar answered Oct 16 '22 21:10

Arpit Patel