मीडियास्टार से URI से फ़ाइल नाम और पथ प्राप्त करें


390

मेरे पास एक onActivityResultमीडियास्टोर छवि चयन से वापसी है जिसे मैं निम्नलिखित का उपयोग करके एक छवि के लिए एक यूआरआई प्राप्त कर सकता हूं:

Uri selectedImage = data.getData();

इसे स्ट्रिंग में बदलने से यह मिलता है:

content://media/external/images/media/47

या एक रास्ता देता है:

/external/images/media/47

हालाँकि मैं इसे एक पूर्ण पथ में परिवर्तित करने का कोई तरीका नहीं खोज सकता, क्योंकि मैं छवि को बिटमैप में लोड करना चाहता हूं, ताकि कहीं और कॉपी न हो सके। मुझे पता है कि यह यूआरआई और सामग्री रिज़ॉल्वर का उपयोग करके किया जा सकता है, लेकिन ऐसा लगता है कि फोन रिबूट करने पर टूट जाता है, मुझे लगता MediaStoreहै कि रिबूट के बीच इसकी संख्या समान नहीं है।



एपीआई 19 और समाधान के ऊपर यहाँ है, stackoverflow.com/a/51227392/9815519 । आशा है दोस्तों यह आपकी मदद कर सकता है।
हसीब अकर

जवाबों:


609

एपीआई 19 से नीचे यूआरआई से फाइल पाथ प्राप्त करने के लिए इस कोड का उपयोग करें:

public String getRealPathFromURI(Context context, Uri contentUri) {
  Cursor cursor = null;
  try { 
    String[] proj = { MediaStore.Images.Media.DATA };
    cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
  } finally {
    if (cursor != null) {
      cursor.close();
    }
  }
}

65
प्रबंधित की बजाय (.........) (पदावनत) आप एक ही पैरामीटर के साथ getContentResolver ()। क्वेरी (.....) का उपयोग कर सकते हैं। अच्छा काम
पाब्लो जॉनसन

44
नवीनतम एंड्रॉइड संस्करण (किटकैट) में यह एक त्रुटि देता है: स्ट्रिंग स्ट्रिंग शून्य है।
क्रिस्टोफर मास

17
जैसा कि क्रिस्टोफर बताते हैं - यह 4.4+ में समर्थित नहीं है। इस सवाल को अधिक जानकारी के लिए देखें: stackoverflow.com/questions/20067508/…
ǝlǝ

13
काम नहीं करता। कर्सर अशक्त है। और मैं एंड्रॉइड 4.4+ पर नहीं हूं, मैं 4.1.2 पर हूं।
मट्टियो

11
5 उपकरणों पर परीक्षण किया गया। Android 4.1.2 को छोड़कर सभी पर शून्य देता है। सभी नए एंड्रॉइड पर अशक्त है।
टीना

127

पहले उत्तर पर सिर्फ एक सरल अद्यतन: mActivity.managedQuery()अब पदावनत हो गया है। मैंने नई विधि के साथ कोड को अपडेट किया है।

private String getRealPathFromURI(Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
    CursorLoader loader = new CursorLoader(mContext, contentUri, proj, null, null, null);
    Cursor cursor = loader.loadInBackground();
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String result = cursor.getString(column_index);
    cursor.close();
    return result;
}

android देव स्रोत


3
@dextor: यह मेरे लिए काम नहीं किया। यह काम करता है जब मैं किसी फ़ाइल ब्राउज़र में फ़ाइल क्लिक करता हूं, लेकिन जब मैं ईमेल अनुलग्नक पर क्लिक करता हूं, तब भी मुझे वह content://...चीज मिल जाती है। मैंने यहां बिना किस्मत के सभी सुझावों को आजमाया। कोई विचार क्यों?
लुइस ए। फ्लोरिट

@ मेरे ऊपर भी मुझे एक ही मुद्दा मिलता है
लिंकैंडज़ेलडा

1
@dextor आपको कर्सर बंद करने की आवश्यकता है।
एथर्टन

क्या आप इसमें मदद कर सकते हैं: stackoverflow.com/questions/27103529/…
Chlebta

@ डेक्सटर मैंने इस समाधान की कोशिश की यह काम नहीं किया, शायद इस बीच कुछ बदल गया। इस सवाल से पॉल बर्क का समाधान stackoverflow.com/questions/20067508/… हालांकि काम किया।
एंडीज

111

ओरियो के लिए

Uri uri = data.getData(); 
File file = new File(uri.getPath());//create path from uri
final String[] split = file.getPath().split(":");//split the path.
filePath = split[1];//assign it to a string(your choice).

ओरेओ के नीचे के सभी संस्करण के लिए मैंने यह तरीका बनाया है जो कि उरई से वास्तविक पथ प्राप्त करता है

 @SuppressLint("NewApi")
    public static String getFilePath(Context context, Uri uri) throws URISyntaxException {
        String selection = null;
        String[] selectionArgs = null;
        // Uri is different in versions after KITKAT (Android 4.4), we need to
        if (Build.VERSION.SDK_INT >= 19 && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            } else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                uri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
            } else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                if ("image".equals(type)) {
                    uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                selection = "_id=?";
                selectionArgs = new String[]{
                        split[1]
                };
            }
        }
        if ("content".equalsIgnoreCase(uri.getScheme())) {


          if (isGooglePhotosUri(uri)) {
              return uri.getLastPathSegment();
           }

            String[] projection = {
                    MediaStore.Images.Media.DATA
            };
            Cursor cursor = null;
            try {
                cursor = context.getContentResolver()
                        .query(uri, projection, selection, selectionArgs, null);
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                if (cursor.moveToFirst()) {
                    return cursor.getString(column_index);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return null;
    }

    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

  public static boolean isGooglePhotosUri(Uri uri) {
    return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}

7
उरी के हर प्रकार पर मूल रूप से काम करने वाला एकमात्र संस्करण है - शीर्ष उत्तर होना चाहिए ..
मैथ्यू फिशर

6
यह कोड काम कर रहा है यदि उपयोगकर्ता ने एसडी कार्ड से फ़ाइल का चयन नहीं किया है। यदि उपयोगकर्ता ने एसडी कार्ड से फाइल का चयन किया है, तो लौटाया हुआ पथ उदाहरण के लिए है / स्टोरेज / एमुलेटेड / 0 / फाइलपैथ भले ही फाइल / स्टोरेज / एसडी कार्ड / फाइल पर स्थित हो
adi9090

इस समस्या को हल करने के लिए कोई समाधान नहीं है @ adi9090। मैं इस मुद्दे पर लगभग 2 दिनों से अटका हुआ हूं :(
अली नवाज

2
अच्छी तरह से आप Android url के लिए सामग्री पिकर की तरह कुछ पुस्तकालय की कोशिश कर सकते हैं: github.com/nbsp-team/MaterialFilePicker यह समाधान के लिए और अधिक करीब ले जा सकता है मैं अभी भी उस पर हूँ अगर यू किसी भी समाधान कृपया इसे नीचे पोस्ट करें ..
अली नवाज

4
या तो काम नहीं करता है: java.lang.UnsupportedOperationException: असमर्थित उरई सामग्री: //com.android.externalstorage.documents/tree/primary%3ADCIM%2FC4era... यदि Android टीम ने जीवन को इतना कठिन बना दिया है
Leon

96

फाइलसिस्टम में एक uri खोजने की कोशिश न करें, यह डेटाबेस में चीजों को देखने के लिए धीमा है।

आप कारखाने को एक इनपुट स्ट्रीम देकर यूआरआई से एक बिटमैप प्राप्त कर सकते हैं जैसे आप कारखाने को एक फ़ाइल देते हैं:

InputStream is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();

5
वास्तव में यह एकमात्र सही प्रतिक्रिया है। कोई भी वास्तव में फ़ाइल नाम के बारे में परवाह नहीं करता है। हमें जो चाहिए वो है कंटेंट। वास्तविक फ़ाइल ऐप के निजी फ़ोल्डर में हो सकती है, इंटरनेट, sqlite में या विशुद्ध रूप से आभासी हो और मक्खी पर उत्पन्न हो।
दुरीलका

18
जो विशिष्ट प्रश्न पूछा गया है वह फ़ाइल नाम और पथ के लिए है। हां, ओपी फ़ाइल से एक बिटमैप प्राप्त करना चाहता है, लेकिन यह सभी के लिए सही नहीं है। कभी-कभी हमें वास्तविक फ़ाइल सामग्री की आवश्यकता होती है।
हपरनिकेतस

3
@durilka, एक उदाहरण: यदि फ़ाइल एक वीडियो है और आप एक थंबनेल चाहते हैं, तो फ़ंक्शन "ThumbnailUtils.createVideoThumbnail" बस स्ट्रिंग के पथ के साथ कॉल किया जा सकता है, इनपुटस्ट्रीम के किसी भी प्रकार को स्वीकार नहीं करता है।
एलियनट्यू

1
अगर वीडियो प्रदाता सामग्री मेटाडेटा के साथ थंबनेल प्रदान करता है, तो मैं पहले जांच करूंगा। एंड्रॉइड सभी के बारे में है "यदि यह किसी ने पहले से ही किया है तो इसे स्वयं लागू न करें"। वास्तव में मुझे विश्वास दिलाता है कि कैसे हर महत्वाकांक्षी आवेदन खुद की फोटो कैप्चरिंग बनाने की कोशिश करता है।
दुरिल्का

4
आपने अभी एक पथ पेश किया है जो
आउटऑफमेरी

39

यहाँ यह फ़ाइल नाम प्राप्त करने का मेरा उदाहरण है, जैसे फ़ाइल: // ... और सामग्री: // ... से। यह मेरे लिए न केवल एंड्रॉइड मीडियास्टोर के साथ काम करता है, बल्कि एज़एक्सप्लेर जैसे तीसरे भाग के आवेदन के साथ भी काम करता है।

public static String getFileNameByUri(Context context, Uri uri)
{
    String fileName="unknown";//default fileName
    Uri filePathUri = uri;
    if (uri.getScheme().toString().compareTo("content")==0)
    {      
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        if (cursor.moveToFirst())
        {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);//Instead of "MediaStore.Images.Media.DATA" can be used "_data"
            filePathUri = Uri.parse(cursor.getString(column_index));
            fileName = filePathUri.getLastPathSegment().toString();
        }
    }
    else if (uri.getScheme().compareTo("file")==0)
    {
        fileName = filePathUri.getLastPathSegment().toString();
    }
    else
    {
        fileName = fileName+"_"+filePathUri.getLastPathSegment();
    }
    return fileName;
}

4
क्या यह फाइल: // और कंटेंट: // यूआरआई और इसके विपरीत में परिवर्तित हो सकता है? मैंने अपने प्रोजेक्ट में कोड को शामिल करने की कोशिश की, लेकिन यह कहता है कि ApplicationObject को हल नहीं किया जा सकता है।
user280109

5
यह ApplicationObject के साथ समस्या है, क्या आप मुझे कुछ कोड दे सकते हैं?
निकोले निकोफोरचुक

ओह, यह ठीक है, चिंता मत करो, मुझे कुछ अन्य उदाहरण कोड मिला जो काम किया, चीयर्स।
user280109

2
यह सबसे अच्छा उत्तर होने के योग्य है, यह अधिक व्यापक है और मेरे पास एक समस्या का हल है।
एंड्रियास रुडोल्फ

जब आप getLastPathSegment () .String () तब प्राप्त कर रहे हैं जब getLastPathSegment () पहले से ही एक स्ट्रिंग लौटाता है?
droid8421

15

अच्छे मौजूदा उत्तर, जिनमें से कुछ मैं अपने साथ लाया करता था:

मुझे URI से पथ प्राप्त करना है और पथ से URI प्राप्त करना है, और Google के पास कठिन समय है ताकि किसी को भी यह समस्या हो, जिसके पास एक ही मुद्दा है (उदाहरण के लिए, MediaStoreवीडियो से थंबनेल प्राप्त करने के लिए जिसका भौतिक स्थान आपके पास पहले से है )। भूतपूर्व:

/**
 * Gets the corresponding path to a file from the given content:// URI
 * @param selectedVideoUri The content:// URI to find the file path from
 * @param contentResolver The content resolver to use to perform the query.
 * @return the file path as a string
 */
private String getFilePathFromContentUri(Uri selectedVideoUri,
        ContentResolver contentResolver) {
    String filePath;
    String[] filePathColumn = {MediaColumns.DATA};

    Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    filePath = cursor.getString(columnIndex);
    cursor.close();
    return filePath;
}

उत्तरार्द्ध (जो मैं वीडियो के लिए करता हूं, लेकिन ऑडियो या फ़ाइलों या अन्य प्रकार की संग्रहीत सामग्री के लिए MediaStore.Audio (आदि) MediaStore.Video के लिए उपयोग करके भी उपयोग किया जा सकता है:

/**
 * Gets the MediaStore video ID of a given file on external storage
 * @param filePath The path (on external storage) of the file to resolve the ID of
 * @param contentResolver The content resolver to use to perform the query.
 * @return the video ID as a long
 */
private long getVideoIdFromFilePath(String filePath,
        ContentResolver contentResolver) {


    long videoId;
    Log.d(TAG,"Loading file " + filePath);

            // This returns us content://media/external/videos/media (or something like that)
            // I pass in "external" because that's the MediaStore's name for the external
            // storage on my device (the other possibility is "internal")
    Uri videosUri = MediaStore.Video.Media.getContentUri("external");

    Log.d(TAG,"videosUri = " + videosUri.toString());

    String[] projection = {MediaStore.Video.VideoColumns._ID};

    // TODO This will break if we have no matching item in the MediaStore.
    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(projection[0]);
    videoId = cursor.getLong(columnIndex);

    Log.d(TAG,"Video ID is " + videoId);
    cursor.close();
    return videoId;
}

मूल रूप से, (या जो भी आप क्वेरी कर रहे हैं उसका उप-भाग) का DATAकॉलम MediaStoreफ़ाइल पथ को संग्रहीत करता है, इसलिए आप या तो इसका उपयोग करते हैं जिसे आप देखना चाहते हैं।DATA फ़ील्ड , या फ़ील्ड का उपयोग करके जो कुछ भी आप चाहते हैं उसे देख सकते हैं।

मैं फिर Schemeऊपर के रूप में उपयोग करने के लिए अपने डेटा के साथ क्या करना है:

 private boolean  getSelectedVideo(Intent imageReturnedIntent, boolean fromData) {

    Uri selectedVideoUri;

    //Selected image returned from another activity
            // A parameter I pass myself to know whether or not I'm being "shared via" or
            // whether I'm working internally to my app (fromData = working internally)
    if(fromData){
        selectedVideoUri = imageReturnedIntent.getData();
    } else {
        //Selected image returned from SEND intent 
                    // which I register to receive in my manifest
                    // (so people can "share via" my app)
        selectedVideoUri = (Uri)getIntent().getExtras().get(Intent.EXTRA_STREAM);
    }

    Log.d(TAG,"SelectedVideoUri = " + selectedVideoUri);

    String filePath;

    String scheme = selectedVideoUri.getScheme(); 
    ContentResolver contentResolver = getContentResolver();
    long videoId;

    // If we are sent file://something or content://org.openintents.filemanager/mimetype/something...
    if(scheme.equals("file") || (scheme.equals("content") && selectedVideoUri.getEncodedAuthority().equals("org.openintents.filemanager"))){

        // Get the path
        filePath = selectedVideoUri.getPath();

        // Trim the path if necessary
        // openintents filemanager returns content://org.openintents.filemanager/mimetype//mnt/sdcard/xxxx.mp4
        if(filePath.startsWith("/mimetype/")){
            String trimmedFilePath = filePath.substring("/mimetype/".length());
            filePath = trimmedFilePath.substring(trimmedFilePath.indexOf("/"));
        }

        // Get the video ID from the path
        videoId = getVideoIdFromFilePath(filePath, contentResolver);

    } else if(scheme.equals("content")){

        // If we are given another content:// URI, look it up in the media provider
        videoId = Long.valueOf(selectedVideoUri.getLastPathSegment());
        filePath = getFilePathFromContentUri(selectedVideoUri, contentResolver);

    } else {
        Log.d(TAG,"Failed to load URI " + selectedVideoUri.toString());
        return false;
    }

     return true;
 }

11

इनमें से किसी भी उत्तर ने मेरे लिए सभी मामलों में काम नहीं किया। मुझे इस विषय पर सीधे Google के दस्तावेज़ीकरण https://developer.android.com/guide/topics/providers/document-provider.html पर जाना पड़ा और इस उपयोगी विधि का पता चला:

private Bitmap getBitmapFromUri(Uri uri) throws IOException {
    ParcelFileDescriptor parcelFileDescriptor =
    getContentResolver().openFileDescriptor(uri, "r");
    FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
    Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
    parcelFileDescriptor.close();
    return image;
}

आप इस बिटमैप को छवि दृश्य में प्रदर्शित करने के लिए उपयोग कर सकते हैं।


7

एपीआई 19 और इसके बाद के संस्करण , उरी से छवि फ़ाइल पथ पूरी तरह से काम करता है। मैं इस नवीनतम PIE API 28 को भी देखता हूं ।

public String getImageFilePath(Uri uri) {
    String path = null, image_id = null;

    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
        image_id = cursor.getString(0);
        image_id = image_id.substring(image_id.lastIndexOf(":") + 1);
        cursor.close();
    }

    Cursor cursor = getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null);
    if (cursor!=null) {
        cursor.moveToFirst();
        path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        cursor.close();
    }
    return path;
}

3
सबसे पहले, आपने दो बार कर्सर को इनिशियलाइज़ किया है! दूसरी बात, यह कोड CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0इस पंक्ति पर फेंकता है :path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
हर्षिल पानसरे

मैं Oreo स्टॉक एंड्रॉइड का उपयोग कर रहा हूं और यह किसी कारण से इस पर काम नहीं करता है
हर्षिल पानसरे

URI से पीडीएफ फाइल फाइल पथ कैसे प्राप्त करें

@ हर्षिलपंसारे, आपको एंड्रॉइड ओरेओ के लिए काम करना कैसे मिला? मैं 2 दिन से इस पर अटका हुआ हूं।
कशिश मल्होत्रा

यह काम नहीं करता है अगर चयनित आइटम एक छवि नहीं है
मुस्तैसिर

5

इसे उरी से छवि फ़ाइल पथ प्राप्त करने का प्रयास करें

public void getImageFilePath(Context context, Uri uri) {

    Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    String image_id = cursor.getString(0);
    image_id = image_id.substring(image_id.lastIndexOf(":") + 1);
    cursor.close();
    cursor = context.getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null);
    cursor.moveToFirst();
    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
    cursor.close();
    upLoadImageOrLogo(path);
}

4

उन लोगों के लिए समाधान, जिन्हें किटकैट में जाने के बाद समस्या है:

"यह अनधिकृत कंटेंटप्रॉइडर विधि पर वापस गिरने के दौरान MediaProvider, DownloadsProvider, और ExternalStorageProvider से फ़ाइल पथ प्राप्त करेगा" https://stackoverflow.com/a/20559175/6905777


यह एकदम सही जवाब है
AndroidPlayer2

3

गैलरी से एक चित्र प्राप्त करने के बाद, केवल यूआरआई को नीचे विधि में केवल एंड्रॉइड 4.4 (किटकैट) के लिए पास करें:

public String getPath(Uri contentUri) {// Will return "image:x*"

    String wholeID = DocumentsContract.getDocumentId(contentUri);

    // Split at colon, use second item in the array
    String id = wholeID.split(":")[1];

    String[] column = { MediaStore.Images.Media.DATA };

    // Where id is equal to
    String sel = MediaStore.Images.Media._ID + "=?";

    Cursor cursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel,
            new String[] { id }, null);

    String filePath = "";

    int columnIndex = cursor.getColumnIndex(column[0]);

    if (cursor.moveToFirst()) {
        filePath = cursor.getString(columnIndex);
    }

    cursor.close();
    return filePath;
}

मेरे लिए यही एक काम है। मुझे गैलरी से कुछ चाहिए था। क्या आपके पास किटकैट के नीचे काम करने का तरीका है? @ शर्मा_कुंई
एसआईआर कोडिएलॉट

3

इसे इस्तेमाल करे

फिर भी, यदि आपको वास्तविक मार्ग प्राप्त करने के लिए समस्या हो रही है, तो आप मेरे उत्तरों की कोशिश कर सकते हैं। उपरोक्त उत्तर से मुझे मदद नहीं मिली।

स्पष्टीकरण : - इस विधि को यूआरआई मिलता है और फिर अपने एंड्रॉइड डिवाइस के एपीआई स्तर की जांच करें उसके बाद एपीआई स्तर के अनुसार यह रियल पथ उत्पन्न करेगा। एपीआई पथ के अनुसार वास्तविक पथ विधि बनाने के लिए कोड अलग है।

  1. URI से वास्तविक रास्ता प्राप्त करने की विधि

    @SuppressLint("ObsoleteSdkInt")
    public String getPathFromURI(Uri uri){
        String realPath="";
    // SDK < API11
        if (Build.VERSION.SDK_INT < 11) {
            String[] proj = { MediaStore.Images.Media.DATA };
            @SuppressLint("Recycle") Cursor cursor = getContentResolver().query(uri, proj, null, null, null);
            int column_index = 0;
            String result="";
            if (cursor != null) {
                column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                realPath=cursor.getString(column_index);
            }
        }
        // SDK >= 11 && SDK < 19
        else if (Build.VERSION.SDK_INT < 19){
            String[] proj = { MediaStore.Images.Media.DATA };
            CursorLoader cursorLoader = new CursorLoader(this, uri, proj, null, null, null);
            Cursor cursor = cursorLoader.loadInBackground();
            if(cursor != null){
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                realPath = cursor.getString(column_index);
            }
        }
        // SDK > 19 (Android 4.4)
        else{
            String wholeID = DocumentsContract.getDocumentId(uri);
            // Split at colon, use second item in the array
            String id = wholeID.split(":")[1];
            String[] column = { MediaStore.Images.Media.DATA };
            // where id is equal to
            String sel = MediaStore.Images.Media._ID + "=?";
            Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{ id }, null);
            int columnIndex = 0;
            if (cursor != null) {
                columnIndex = cursor.getColumnIndex(column[0]);
                if (cursor.moveToFirst()) {
                    realPath = cursor.getString(columnIndex);
                }
                cursor.close();
            }
        }
        return realPath;
     }
  2. इस विधि का उपयोग इस प्रकार करें

    Log.e(TAG, "getRealPathFromURI: "+getPathFromURI(your_selected_uri) );

आउटपुट: -

04-06 12: 39: 46.993 6138-6138 / com.app.qtm ई / टैग: getRealPathFromURI: /storage/emulated/0/Video/avuters_infinity_war_4k_8k-7680x4320.jpg


1
साथ मेरे शारीरिक डिवाइस एपीआई स्तर 25 रिटर्न गंभीर अपवाद कमांड के साथ String wholeID = DocumentsContract.getDocumentId(uri);मैं मिलता है:java.lang.RuntimeException: Failure delivering result
Aliton ओलिविएरा

3

मैंने इस तरह किया है:

    Uri queryUri = MediaStore.Files.getContentUri("external");
    String columnData = MediaStore.Files.FileColumns.DATA;
    String columnSize = MediaStore.Files.FileColumns.SIZE;

    String[] projectionData = {MediaStore.Files.FileColumns.DATA};


    String name = null;
    String size = null;

    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if ((cursor != null)&&(cursor.getCount()>0)) {
        int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);

        cursor.moveToFirst();

        name = cursor.getString(nameIndex);
        size = cursor.getString(sizeIndex);

        cursor.close();
    }

    if ((name!=null)&&(size!=null)){
        String selectionNS = columnData + " LIKE '%" + name + "' AND " +columnSize + "='" + size +"'";

        Cursor cursorLike = getContentResolver().query(queryUri, projectionData, selectionNS, null, null);

        if ((cursorLike != null)&&(cursorLike.getCount()>0)) {
            cursorLike.moveToFirst();
            int indexData = cursorLike.getColumnIndex(columnData);
            if (cursorLike.getString(indexData) != null) {
                result = cursorLike.getString(indexData);
            }
            cursorLike.close();
        }
    }

    return result;

2

चूँकि प्रबंधित किया गया है, आप कोशिश कर सकते हैं:

CursorLoader cursorLoader = new CursorLoader(context, uri, proj, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();

2

यहां मैं आपको दिखाने जा रहा हूं कि BROWSE बटन कैसे बनाया जाता है, जिस पर क्लिक करने पर यह एसडी कार्ड खोलेगा, आप एक फाइल का चयन करेंगे और परिणामस्वरूप आपको फ़ाइल नाम और चयनित का पथ मिल जाएगा एक:

एक बटन जिसे आप हिट करेंगे

browse.setOnClickListener(new OnClickListener()
{
    public void onClick(View v)
    {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_PICK);
        Uri startDir = Uri.fromFile(new File("/sdcard"));
        startActivityForResult(intent, PICK_REQUEST_CODE);
    }
});

फ़ंक्शन जिसे परिणाम फ़ाइल नाम और फ़ाइल पथ मिलेगा

protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
    if (requestCode == PICK_REQUEST_CODE)
    {
        if (resultCode == RESULT_OK)
        {
            Uri uri = intent.getData();

            if (uri.getScheme().toString().compareTo("content")==0)
            {
                Cursor cursor =getContentResolver().query(uri, null, null, null, null);
                if (cursor.moveToFirst())
                {
                    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);//Instead of "MediaStore.Images.Media.DATA" can be used "_data"
                    Uri filePathUri = Uri.parse(cursor.getString(column_index));
                    String file_name = filePathUri.getLastPathSegment().toString();
                    String file_path=filePathUri.getPath();
                    Toast.makeText(this,"File Name & PATH are:"+file_name+"\n"+file_path, Toast.LENGTH_LONG).show();
                }
            }
        }
    }
}

मैंने यहाँ सुझावों का पालन किया, और काम नहीं किया। जब मैं K9 ईमेल क्लाइंट अटैचमेंट में क्लिक करता हूं, तो मुझे मिलता है content://com.fsck.k9.attachmentprovider/34fc2cc9-aa46-45e9-9e3f-2f27f0457249/1‌​/VIEW। यहां के तरीकों को लागू करने के बाद, मुझे अभी भी एक ही स्ट्रिंग मिलती है, न कि सही रास्ता, यही है /mnt/sdcard/Android/data/com.fsck.k9/files/34fc2cc9-aa46-45e9-9e3f-2f27f0457249‌​.db_att/1। कोई सुराग?
लुइस ए। फ्लोरिट

2

पिछले Android Q के लिए कोई भी तरीका , जब MediaStore.Images.Media.DATA अब उपलब्ध नहीं होगा? इस क्षेत्र को Android Q में अपग्रेड किया गया है:

एपीआई स्तर 29 में इस स्थिरांक को हटा दिया गया था। इस पथ पर सीधे पहुंचने के लिए ऐप्स के पास फाइल सिस्टम अनुमति नहीं हो सकती है। सीधे इस पथ को खोलने का प्रयास करने के बजाय, एप्लिकेशन को एक्सेस प्राप्त करने के लिए ContentResolver # openFileDescriptor (Uri, String) का उपयोग करना चाहिए।

https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA

--- सम्पादित

जहां तक ​​मुझे पिछले Android Q के लिए पता है कि RELATIVE_PATH पर रिले करने का एकमात्र तरीका है

स्टोरेज डिवाइस के भीतर इस मीडिया आइटम का रिलेटिव पाथ जहां यह बना रहता है। उदाहरण के लिए, /storage/0000-0000/DCIM/Vacation/IMG1024.JPG पर संग्रहीत आइटम में DCIM / अवकाश / का एक पथ होगा।

https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#RELATIVE_PATH


क्या Android Q की सभी फ़ाइलों में सापेक्ष पथ है या क्या हमें उन्हें जोड़ने की आवश्यकता है, जैसे कि यदि फ़ाइल पहले से ही डिवाइस पर मौजूद है तो इसका सापेक्ष पथ उपलब्ध होगा?
1234567

1
@ 1234567 लिंक में वर्णन के अनुसार यदि आप इसे शून्य मानते हैं, तो सिस्टम इसे ठीक से सेट कर देगा। यदि फ़ाइल पहले से मौजूद है, तो मीडिया स्कैनर को फ़ील्ड जोड़ना चाहिए।
मालाचियाज

आपको लक्ष्य एपीआई के रूप में एंड्रॉइड क्यू की आवश्यकता है और शायद
स्कोपेड

1

@PercyPercy का थोड़ा संशोधित संस्करण - यह फेंकता नहीं है और यदि कुछ भी गलत होता है, तो यह शून्य हो जाता है :

public String getPathFromMediaUri(Context context, Uri uri) {
    String result = null;

    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
    int col = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
    if (col >= 0 && cursor.moveToFirst())
        result = cursor.getString(col);
    cursor.close();

    return result;
}

1

यहां आपको फाइल का नाम मिलता है

String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME};
                    Uri uri = data.getData();
                    String fileName = null;
                    ContentResolver cr = getActivity().getApplicationContext().getContentResolver();

                    Cursor metaCursor = cr.query(uri,
                            projection, null, null, null);
                    if (metaCursor != null) {
                        try {
                            if (metaCursor.moveToFirst()) {
                                fileName = metaCursor.getString(0);
                            }
                        } finally {
                            metaCursor.close();
                        }
                    }

संभवत: ऑप के लिए मददगार नहीं है क्योंकि वह निरपेक्ष पथ की तलाश में था (न कि केवल फ़ाइल नाम) ... लेकिन यह निश्चित रूप से नरक ने मुझे प्रक्रिया को समझने में मदद की।
रहस्यवादी कोला

1

सरल और आसान। आप इसे यूआरआई से नीचे की तरह ही कर सकते हैं!

public void getContents(Uri uri)
{
    Cursor vidCursor = getActivity.getContentResolver().query(uri, null, null,
                                                              null, null);
    if (vidCursor.moveToFirst())
    {
        int column_index =
        vidCursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        Uri filePathUri = Uri.parse(vidCursor .getString(column_index));
        String video_name =  filePathUri.getLastPathSegment().toString();
        String file_path=filePathUri.getPath();
        Log.i("TAG", video_name + "\b" file_path);
    }
}

1

यह समाधान हर मामले के लिए काम करता है:

कुछ मामलों में URL से पथ प्राप्त करना बहुत कठिन है। फिर आपको मार्ग की आवश्यकता क्यों है? फाइल को दूसरी जगह कॉपी करने के लिए? आपको पथ की आवश्यकता नहीं है

public void SavePhotoUri (Uri imageuri, String Filename){

    File FilePath = context.getDir(Environment.DIRECTORY_PICTURES,Context.MODE_PRIVATE);
    try {
        Bitmap selectedImage = MediaStore.Images.Media.getBitmap(context.getContentResolver(), imageuri);
        String destinationImagePath = FilePath + "/" + Filename;
        FileOutputStream destination = new FileOutputStream(destinationImagePath);
        selectedImage.compress(Bitmap.CompressFormat.JPEG, 100, destination);
        destination.close();
    }
    catch (Exception e) {
        Log.e("error", e.toString());
    }
}

0

मेरे लिए इस पोस्ट से निश्चित कोड के लिए पूरी तरह से काम कर रहा है :

  public static String getRealPathImageFromUri(Uri uri) {
        String fileName =null;
        if (uri.getScheme().equals("content")) {
            try (Cursor cursor = MyApplication.getInstance().getContentResolver().query(uri, null, null, null, null)) {
                if (cursor.moveToFirst()) {
                    fileName = cursor.getString(cursor.getColumnIndexOrThrow(ediaStore.Images.Media.DATA));
                }
            } catch (IllegalArgumentException e) {
                Log.e(mTag, "Get path failed", e);
            }
        }
        return fileName;
    }

0

एक ऐड-ऑन के रूप में, यदि आपको यह देखने की आवश्यकता है कि इनपुट स्ट्रीम खोलने का प्रयास करने से पहले कोई फ़ाइल मौजूद है, तो आप डॉक्यूमेंटेशन कंट्रोल का उपयोग कर सकते हैं।

(कोटलिन कोड)

var iStream = null
if(DocumentsContract.isDocumentUri(context,myUri)) {
   val pfd: ParcelFileDescriptor? = context.contentResolver.openFileDescriptor(
            myUri, "r") ?: return null
   iStream = ParcelFileDescriptor.AutoCloseInputStream(pfd)
}

0

चूँकि उपरोक्त उत्तर मेरे लिए कारगर नहीं थे, इसलिए यहाँ समाधान है जो मेरे लिए काम करता है:

दोनों के लिए> 19 और <= 19 एपीआई स्तर।

यह विधि सभी मामलों को फ़ाइलपीठ से प्राप्त करने के लिए शामिल करती है

/**
 * Get a file path from a Uri. This will get the the path for Storage Access
 * Framework Documents, as well as the _data field for the MediaStore and
 * other file-based ContentProviders.
 *
 * @param context The activity.
 * @param uri The Uri to query.
 * @author paulburke
 */
public static String getPath(final Context context, final Uri uri) {

    // DocumentProvider
    if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && 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];
            }else{
                Toast.makeText(context, "Could not get file path. Please try again", Toast.LENGTH_SHORT).show();
            }
        }
        // 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;
            } else {
                contentUri = MediaStore.Files.getContentUri("external");
            }

            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 getDataColumn(context, uri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;
}

0

किसी भी प्रकार की फ़ाइल पथ का उपयोग करने के लिए:

/*
 * Copyright (C) 2007-2008 OpenIntents.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.yourpackage;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;
import android.webkit.MimeTypeMap;

import java.io.File;
import java.io.FileFilter;
import java.text.DecimalFormat;
import java.util.Comparator;
import java.util.List;

/**
 * @author Peli
 * @author paulburke (ipaulpro)
 * @version 2013-12-11
 */
public class FileUtils {
    private FileUtils() {
    } //private constructor to enforce Singleton pattern

    /**
     * TAG for log messages.
     */
    static final String TAG = "FileUtils";
    private static final boolean DEBUG = true; // Set to true to enable logging

    public static final String MIME_TYPE_AUDIO = "audio/*";
    public static final String MIME_TYPE_TEXT = "text/*";
    public static final String MIME_TYPE_IMAGE = "image/*";
    public static final String MIME_TYPE_VIDEO = "video/*";
    public static final String MIME_TYPE_APP = "application/*";

    public static final String HIDDEN_PREFIX = ".";

    /**
     * Gets the extension of a file name, like ".png" or ".jpg".
     *
     * @param uri
     * @return Extension including the dot("."); "" if there is no extension;
     * null if uri was null.
     */
    public static String getExtension(String uri) {
        if (uri == null) {
            return null;
        }

        int dot = uri.lastIndexOf(".");
        if (dot >= 0) {
            return uri.substring(dot);
        } else {
            // No extension.
            return "";
        }
    }

    /**
     * @return Whether the URI is a local one.
     */
    public static boolean isLocal(String url) {
        if (url != null && !url.startsWith("http://") && !url.startsWith("https://")) {
            return true;
        }
        return false;
    }

    /**
     * @return True if Uri is a MediaStore Uri.
     * @author paulburke
     */
    public static boolean isMediaUri(Uri uri) {
        return "media".equalsIgnoreCase(uri.getAuthority());
    }

    /**
     * Convert File into Uri.
     *
     * @param file
     * @return uri
     */
    public static Uri getUri(File file) {
        if (file != null) {
            return Uri.fromFile(file);
        }
        return null;
    }

    /**
     * Returns the path only (without file name).
     *
     * @param file
     * @return
     */
    public static File getPathWithoutFilename(File file) {
        if (file != null) {
            if (file.isDirectory()) {
                // no file to be split off. Return everything
                return file;
            } else {
                String filename = file.getName();
                String filepath = file.getAbsolutePath();

                // Construct path without file name.
                String pathwithoutname = filepath.substring(0,
                        filepath.length() - filename.length());
                if (pathwithoutname.endsWith("/")) {
                    pathwithoutname = pathwithoutname.substring(0, pathwithoutname.length() - 1);
                }
                return new File(pathwithoutname);
            }
        }
        return null;
    }

    /**
     * @return The MIME type for the given file.
     */
    public static String getMimeType(File file) {

        String extension = getExtension(file.getName());

        if (extension.length() > 0)
            return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.substring(1));

        return "application/octet-stream";
    }

    /**
     * @return The MIME type for the give Uri.
     */
    public static String getMimeType(Context context, Uri uri) {
        File file = new File(getPath(context, uri));
        return getMimeType(file);
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is {@link LocalStorageProvider}.
     * @author paulburke
     */
    public static boolean isLocalStorageDocument(Uri uri) {
        return LocalStorageProvider.AUTHORITY.equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     * @author paulburke
     */
    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.
     * @author paulburke
     */
    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.
     * @author paulburke
     */
    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());
    }

    /**
     * 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.
     * @author paulburke
     */
    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()) {
                if (DEBUG)
                    DatabaseUtils.dumpCursor(cursor);

                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * Get a file path from a Uri. This will quickGet the the path for Storage Access
     * Framework Documents, as well as the _data field for the MediaStore and
     * other file-based ContentProviders.<br>
     * <br>
     * Callers should check whether the path is local before assuming it
     * represents a local file.
     *
     * @param context The context.
     * @param uri     The Uri to query.
     * @author paulburke
     * @see #isLocal(String)
     * @see #getFile(Context, Uri)
     */
    public static String getPath(final Context context, final Uri uri) {

        if (DEBUG)
            Log.d(TAG + " File -",
                    "Authority: " + uri.getAuthority() +
                            ", Fragment: " + uri.getFragment() +
                            ", Port: " + uri.getPort() +
                            ", Query: " + uri.getQuery() +
                            ", Scheme: " + uri.getScheme() +
                            ", Host: " + uri.getHost() +
                            ", Segments: " + uri.getPathSegments().toString()
            );
        // DocumentProvider
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) {
            // LocalStorageProvider
            if (isLocalStorageDocument(uri)) {
                // The path is the id
                return DocumentsContract.getDocumentId(uri);
            }
            // ExternalStorageProvider
            else 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];
//                }
                return Environment.getExternalStorageDirectory() + "/" + split[1];

                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {
                try {
                    final String id = DocumentsContract.getDocumentId(uri);
                    Log.d(TAG, "getPath: id= " + id);
                    final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                    return getDataColumn(context, contentUri, null, null);
                }catch (Exception e){
                    e.printStackTrace();
                    List<String> segments = uri.getPathSegments();
                    if(segments.size() > 1) {
                        String rawPath = segments.get(1);
                        if(!rawPath.startsWith("/")){
                            return rawPath.substring(rawPath.indexOf("/"));
                        }else {
                            return rawPath;
                        }
                    }
                }
            }
            // 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;
    }

    /**
     * Convert Uri into File, if possible.
     *
     * @return file A local file that the Uri was pointing to, or null if the
     * Uri is unsupported or pointed to a remote resource.
     * @author paulburke
     * @see #getPath(Context, Uri)
     */
    public static File getFile(Context context, Uri uri) {
        if (uri != null) {
            String path = getPath(context, uri);
            if (path != null && isLocal(path)) {
                return new File(path);
            }
        }
        return null;
    }

    /**
     * Get the file size in a human-readable string.
     *
     * @param size
     * @return
     * @author paulburke
     */
    public static String getReadableFileSize(int size) {
        final int BYTES_IN_KILOBYTES = 1024;
        final DecimalFormat dec = new DecimalFormat("###.#");
        final String KILOBYTES = " KB";
        final String MEGABYTES = " MB";
        final String GIGABYTES = " GB";
        float fileSize = 0;
        String suffix = KILOBYTES;

        if (size > BYTES_IN_KILOBYTES) {
            fileSize = size / BYTES_IN_KILOBYTES;
            if (fileSize > BYTES_IN_KILOBYTES) {
                fileSize = fileSize / BYTES_IN_KILOBYTES;
                if (fileSize > BYTES_IN_KILOBYTES) {
                    fileSize = fileSize / BYTES_IN_KILOBYTES;
                    suffix = GIGABYTES;
                } else {
                    suffix = MEGABYTES;
                }
            }
        }
        return String.valueOf(dec.format(fileSize) + suffix);
    }

    /**
     * Attempt to retrieve the thumbnail of given File from the MediaStore. This
     * should not be called on the UI thread.
     *
     * @param context
     * @param file
     * @return
     * @author paulburke
     */
    public static Bitmap getThumbnail(Context context, File file) {
        return getThumbnail(context, getUri(file), getMimeType(file));
    }

    /**
     * Attempt to retrieve the thumbnail of given Uri from the MediaStore. This
     * should not be called on the UI thread.
     *
     * @param context
     * @param uri
     * @return
     * @author paulburke
     */
    public static Bitmap getThumbnail(Context context, Uri uri) {
        return getThumbnail(context, uri, getMimeType(context, uri));
    }

    /**
     * Attempt to retrieve the thumbnail of given Uri from the MediaStore. This
     * should not be called on the UI thread.
     *
     * @param context
     * @param uri
     * @param mimeType
     * @return
     * @author paulburke
     */
    public static Bitmap getThumbnail(Context context, Uri uri, String mimeType) {
        if (DEBUG)
            Log.d(TAG, "Attempting to quickGet thumbnail");

        if (!isMediaUri(uri)) {
            Log.e(TAG, "You can only retrieve thumbnails for images and videos.");
            return null;
        }

        Bitmap bm = null;
        if (uri != null) {
            final ContentResolver resolver = context.getContentResolver();
            Cursor cursor = null;
            try {
                cursor = resolver.query(uri, null, null, null, null);
                if (cursor.moveToFirst()) {
                    final int id = cursor.getInt(0);
                    if (DEBUG)
                        Log.d(TAG, "Got thumb ID: " + id);

                    if (mimeType.contains("video")) {
                        bm = MediaStore.Video.Thumbnails.getThumbnail(
                                resolver,
                                id,
                                MediaStore.Video.Thumbnails.MINI_KIND,
                                null);
                    } else if (mimeType.contains(FileUtils.MIME_TYPE_IMAGE)) {
                        bm = MediaStore.Images.Thumbnails.getThumbnail(
                                resolver,
                                id,
                                MediaStore.Images.Thumbnails.MINI_KIND,
                                null);
                    }
                }
            } catch (Exception e) {
                if (DEBUG)
                    Log.e(TAG, "getThumbnail", e);
            } finally {
                if (cursor != null)
                    cursor.close();
            }
        }
        return bm;
    }

    /**
     * File and folder comparator. TODO Expose sorting option method
     *
     * @author paulburke
     */
    public static Comparator<File> sComparator = new Comparator<File>() {
        @Override
        public int compare(File f1, File f2) {
            // Sort alphabetically by lower case, which is much cleaner
            return f1.getName().toLowerCase().compareTo(
                    f2.getName().toLowerCase());
        }
    };

    /**
     * File (not directories) filter.
     *
     * @author paulburke
     */
    public static FileFilter sFileFilter = new FileFilter() {
        @Override
        public boolean accept(File file) {
            final String fileName = file.getName();
            // Return files only (not directories) and skip hidden files
            return file.isFile() && !fileName.startsWith(HIDDEN_PREFIX);
        }
    };

    /**
     * Folder (directories) filter.
     *
     * @author paulburke
     */
    public static FileFilter sDirFilter = new FileFilter() {
        @Override
        public boolean accept(File file) {
            final String fileName = file.getName();
            // Return directories only and skip hidden directories
            return file.isDirectory() && !fileName.startsWith(HIDDEN_PREFIX);
        }
    };

    /**
     * Get the Intent for selecting content to be used in an Intent Chooser.
     *
     * @return The intent for opening a file with Intent.createChooser()
     * @author paulburke
     */
    public static Intent createGetContentIntent() {
        // Implicitly allow the user to select a particular kind of data
        final Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        // The MIME data type filter
        intent.setType("*/*");
        // Only return URIs that can be opened with ContentResolver
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        return intent;
    }
}

LocalStorageProvider
Zain

अंत में, एक विधि जो काम करती है! (इस कोड से मैं सिर्फ LocalStorageProvider निकाला गया)
स्टारवेव

0

नीचे दिए गए तरीके की जाँच भयानक काम कर रहा है Oreo 8.1 ।।

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO ManualMT-generated method stub
    switch (requestCode) {
        case PICKFILE_RESULT_CODE:
            if (resultCode == RESULT_OK) {

                try {
                    FilePath = data.getData().getPath();
                    Uri selectedImageUri = data.getData();

                    if (selectedImageUri.toString().contains("storage/emulated")){
                        String[] split = selectedImageUri.toString().split("storage/");
                        FilePath = "storage/"+split[1];
                    } else {
                        FilePath = ImageFilePath.getPath(getApplicationContext(), selectedImageUri);
                    }

                    recyclerview.setVisibility(View.VISIBLE);

                    if (FilePath == null) {
                        FilePath = "";
                    }
                    File file = new File(FilePath);
                    reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
                    image_list.add(FilePath);
                    composeImageAdapter.notifyDataSetChanged();
                } catch (Exception e){
                    Toast.makeText(ClusterCreateNote.this , e.toString(),Toast.LENGTH_SHORT).show();
                }
            }
            break;
    }

}

URI पाथ क्लास:

public static 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) {
        String selection = null;
        String[] selectionArgs = null;

        // DocumentProvider
        if (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.wifAppendedId(
                        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];

                Log.e("typetype",type);

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

                selection = "_id=?";
                selectionArgs = new String[]{
                        split[1]
                };

                Log.e("gddhjf",getDataColumn(context, contentUri, selection, selectionArgs));

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        if ("content".equalsIgnoreCase(uri.getScheme())) {


            if (isGooglePhotosUri(uri)) {
                return uri.getLastPathSegment();
            }

            String[] projection = {
                    MediaStore.Images.Media.DATA
            };
            Cursor cursor = null;
            try {
                cursor = context.getContentResolver()
                        .query(uri, projection, selection, selectionArgs, null);
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                if (cursor.moveToFirst()) {
                    return cursor.getString(column_index);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }


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

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

    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    public static boolean isGooglePhotosUri(Uri uri) {
        return
                "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }
}

1
आप डेटा कॉलम का उपयोग कर रहे हैं, यह अब काम नहीं करेगा।
एचबी।

0

मैं एक लाइनर के साथ ऐसा करता हूं:

val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)

जो onActivityResult में दिखता है:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_IMAGE_PICKER ) {
        data?.data?.let { imgUri: Uri ->
            val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, imgUri)
        }
    }
}

किसी कारण से, यह दृष्टिकोण काम नहीं करता है अगर मैं एक छवि का चयन करने के लिए सैमसंग गैलरी ऐप का उपयोग करता हूं
केएमसी

अजीब। मैं एक सैमसंग गैलेक्सी S10 पर विकास कर रहा था।
जोएल ब्रोस्ट्रॉम

0

विशेष रूप से एपीआई स्तर 29 एंड्रॉइड क्यू के बाद चीजें अब जटिल हैं। इसी तरह आपको सामग्री उरी से फ़ाइल नाम प्राप्त करना चाहिए

        public static String getNameFromContentUri(Context context, Uri contentUri){  
                            Cursor returnCursor = context.getContentResolver().query(contentUri, null, null, null, null);
                            int nameColumnIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                            returnCursor.moveToFirst();
                            String fileName = returnCursor.getString(nameColumnIndex);
                            return fileName;}

और यह है कि आप सभी Android संस्करणों के लिए सामग्री उड़ी का पूरा मार्ग कैसे प्राप्त करें

public static String getFullPathFromContentUri(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if ("com.android.externalstorage.documents".equals(uri.getAuthority())) {
                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];
                }

                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {

                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 ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                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]
                };

                   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 column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

private 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 column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

0

यह मेरे लिए पूरी तरह से काम करता है यदि आपका सिस्टम संस्करण 19 से ऊपर है, तो आशा है कि यह आपकी मदद कर सकता है।

  @TargetApi(Build.VERSION_CODES.KITKAT)
    public static String getPath(final Context context, final Uri uri) {
        final boolean isOverKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
        // DocumentProvider
        if (isOverKitKat && 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;
    }

-2

Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);


यह प्रश्न का उत्तर प्रदान नहीं करता है। एक बार आपके पास पर्याप्त प्रतिष्ठा होने पर आप किसी भी पोस्ट पर टिप्पणी करने में सक्षम होंगे ; इसके बजाय, ऐसे उत्तर प्रदान करें जिन्हें पूछने वाले से स्पष्टीकरण की आवश्यकता न हो । - समीक्षा से
ישו אוהב אותך

"मैं छवि को एक बिटमैप में लोड करना चाहता हूं, बिना इसे कहीं कॉपी किए बिना।" , मुझे लगता है कि यह उत्तर प्रश्न का उत्तर प्रदान करता है!
Drastaro
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.