Get filepath and filename of selected gallery image in Android

后端 未结 9 2090
天命终不由人
天命终不由人 2020-11-27 04:47

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 e

相关标签:
9条回答
  • 2020-11-27 05:26

    A little late to the party but here's my code, hope this helps.

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Uri selectedImageUri = data.getData( );
            String picturePath = getPath( getActivity( ).getApplicationContext( ), selectedImageUri );
            Log.d("Picture Path", picturePath);
        }
    }
    
    public static String getPath( Context context, Uri uri ) {
        String result = null;
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = context.getContentResolver( ).query( uri, proj, null, null, null );
        if(cursor != null){
            if ( cursor.moveToFirst( ) ) {
                int column_index = cursor.getColumnIndexOrThrow( proj[0] );
                result = cursor.getString( column_index );
            }
            cursor.close( );
        }
        if(result == null) {
            result = "Not found";
        }
        return result;
    }
    
    0 讨论(0)
  • 2020-11-27 05:27

    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();
            }
    
        }
    
    0 讨论(0)
  • 2020-11-27 05:33

    Hope this helps you

     if (Build.VERSION.SDK_INT <19){
    
        Intent intent = new Intent(); 
        intent.setType("image/jpeg");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, 
        getResources().getString(R.string.select_picture)),GALLERY_INTENT_CALLED);
    
     }else{
    
          Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
          intent.addCategory(Intent.CATEGORY_OPENABLE);
          intent.setType("image/jpeg");
          startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED);
     }
    
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data)
     {
    
          super.onActivityResult(requestCode, resultCode, data);
          if (resultCode != Activity.RESULT_OK) return;
          if (null == data) return;
          Uri originalUri = null;
    
          if (requestCode == GALLERY_INTENT_CALLED) {
               originalUri = data.getData();
          } 
          else if (requestCode == GALLERY_KITKAT_INTENT_CALLED) {
               originalUri = data.getData();
               final int takeFlags = data.getFlags()
                & (Intent.FLAG_GRANT_READ_URI_PERMISSION
                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    
                // Check for the freshest data.
                getContentResolver().takePersistableUriPermission(originalUri,    takeFlags);
          }
          loadSomeStreamAsynkTask(originalUri);
    }
    
    0 讨论(0)
  • 2020-11-27 05:34

    If you are like me and you dont have a local file ready, for instance you want to give user a chance to take a picture and then upload the picture this is how to do it. I am a noob in java but i have allot of experience in coding. Stackoverflow helped me allot so now it is my time to do something back.

    Under class activity you have to declare these two items. asuming you have a working upload class and php script.

    NOTE i am not taking any consideration about all the different API's out there. I am using java compiler 1.7 and a API range of 10 to 18.

    public class Yourproject extends Activity {
    File imageFile;
    File imageFileName;
    
    //This part is needed for decoding the path adres.
    
     private String getRealPathFromURI(Uri contentURI) {
                String result;
                Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
                if (cursor == null) { // Source is Dropbox or other similar local file path
                    result = contentURI.getPath();
                } else { 
                    cursor.moveToFirst(); 
                    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME); 
                    result = cursor.getString(idx);
                    cursor.close();
                }
                return result;
            }
    
    //This is needed for the path name, now you might just want to use one decoding script depending on //your class in total.
    //In my case this was the way to go.
    //To use one single addres use this line ImageColumns.DATA in the int idx declaration.
    
            private String getRealPathFromNAME(Uri contentNAME) {
                String result;
                Cursor cursor = getContentResolver().query(contentNAME, null, null, null, null);
                if (cursor == null) { // Source is Dropbox or other similar local file path
                    result = contentNAME.getPath();
                } else { 
                    cursor.moveToFirst(); 
                    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME); 
                    result = cursor.getString(idx);
                    cursor.close();
                }
                return result;
            }
    
    //Then under protected void onCreate(Bundle savedInstanceState) you place this code to get 
    //the image and process it.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            //declare the ImageView
            final ImageView inputPicture = (ImageView) findViewById(R.id.imageView2);
    
            inputPicture.setImageURI((Uri) getIntent().getExtras().get("picture"));
            //here where recieve the image from last page "Putextra" method
    
    
            try {
                //here we will get the data and proces it trough to get the real 
                //address for uploading.
                //This is send from a other activity with a Intent.EXTRA_STREAM
                //The code looks like this:
                /*********"Putextra"*********/
                //final ImageView iv = (ImageView) findViewById(R.id.imageView1);
                //final Uri thumb = (Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM);
                //iv.setImageURI(thumb);
    
                //Sending it to the next activity
    
                //it.putExtra("picture", thumb);    
                /*********"Putextra"*********/
    
                Uri fileUri = (Uri) getIntent().getExtras().get("picture");
                //get 
                //Uri fileName = (Uri) getIntent().getExtras().get("picture");
                //get
                imageFile = new File(getRealPathFromURI(fileUri));
                //send
                imageFileName = new File(getRealPathFromNAME(fileUri));
                //send
                //i got a exeption Uri fileName, use fileUri twice..
            } catch (Exception e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
            //here we will declare the name for furter processing.
            final File uploadFilePath = imageFile;
            final File uploadFileName = imageFileName;
    
    
    }
    

    And the rest i will leave up to u, if you got this far, I am pretty sure you will finish.

    0 讨论(0)
  • 2020-11-27 05:35

    Try this to get data as well as file path and insert into folder.

    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        try {
            if (resultCode == RESULT_OK)
            {
                nav = data.getData();
                String[] projection = { MediaStore.Images.Media.DATA };
                Cursor cursor = managedQuery(nav, projection, null, null, null);
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                String path= cursor.getString(column_index);
                Toast.makeText(getApplicationContext(), path, 500).show();
                mBitmap = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), nav);
                insert(mBitmap);
    
                if (mBitmap != null) {  
                    mBitmap.recycle();  
                    mBitmap = null;  
                } 
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void insert(Bitmap finalBitmap) {
        File myDir=new File("/sdcard/saved_images");
        myDir.mkdirs();
    
        Random generator = new Random();
        int n = 10000;
        n = generator.nextInt(n);
        String fname = "Image-"+ n +".jpg";
        File file = new File (myDir, fname);
        if (file.exists ()) file.delete (); 
        try {
            FileOutputStream out = new FileOutputStream(file);
            finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
            File dstFile = new File(file.getParent(), "." + file.getName());
            file.renameTo(dstFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    0 讨论(0)
  • 2020-11-27 05:38

    Use below code,

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        if (resultCode == RESULT_OK) {
    
         Uri selectedImageUri = data.getData();
         String s = getRealPathFromURI(selectedImageUri);
         editText1.setText(s);
    }
    }
    

    and below is your getRealPathFromURI function,

    public String getRealPathFromURI(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        @SuppressWarnings("deprecation")
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    
    0 讨论(0)
提交回复
热议问题