মিডিয়াস্টোর থেকে ইউআরআই থেকে ফাইলের নাম এবং পথ পান


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 টি ডিভাইসে পরীক্ষিত। অ্যান্ড্রয়েড ৪.১.২ বাদে সকলের কাছে বাতিল দেয়। সমস্ত নতুন অ্যান্ড্রয়েডগুলিতে বাতিল হয়।
টিনা

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

অ্যান্ড্রয়েড দেব উত্স


3
@ প্রাক্তন: এটি আমার পক্ষে কার্যকর হয়নি। আমি যখন ফাইল ব্রাউজারে কোনও ফাইল ক্লিক করি তখন এটি কার্যকর হয়, তবে আমি যখন কোনও ইমেল সংযুক্তিতে ক্লিক করি তখনও আমি content://...জিনিসটি পাই । আমি ভাগ্য ছাড়াই এখানে সমস্ত পরামর্শ চেষ্টা করেছিলাম। কোন ধারণা কেন?
লুইস এ। ফ্লোরিট

@ লুইস আমাকেও আমি একই সমস্যাটি
পেয়েছি

1
@ প্রেরক আপনি কার্সার বন্ধ করতে হবে।
ইথারটন

: আপনি এই সাহায্য করতে পারি stackoverflow.com/questions/27103529/...
Chlebta

@ প্রাক্তন আমি এই সমাধানটি চেষ্টা করেছিলাম এটি কার্যকর হয়নি, সম্ভবত সময়কালে কিছু পরিবর্তন হয়েছিল changed এই প্রশ্ন থেকে পল বার্কের সমাধান stackoverflow.com/questions/20067508/… তবে কাজ করেছে।
অ্যান্ডিজেড 30'15

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

@ ইডি 9090 এই সমস্যাটি সমাধান করার কোনও সমাধান আছে কি? আমি প্রায় 2 দিন এই সমস্যাটিতে আটকে আছি :(
আলী নওয়াজ

2
ভাল আপনি অ্যান্ড্রয়েড ইউআরএল জন্য উপাদান চয়নকারী এর মতো কিছু লাইব্রেরি চেষ্টা করতে পারেন: github.com/nbsp-team/MaterialFilePicker এটি সমাধানের আরও বেশি কাছাকাছি নিয়ে যেতে পারে যদি আপনি কোনও সমাধান পান তবে নীচে পোস্ট করুন ..
আলী নওয়াজ

4
হয়ও কাজ করে না: java.lang.UnsupportedOperationException: অসমর্থিত উরি সামগ্রী: //com.android.externstores.documents/tree/primary%3ADCIM%2FCamera... অ্যান্ড্রয়েড দল জীবনকে এত কঠিন করে তোলে
লিওন

96

ফাইল সিস্টেমে ইউরি সন্ধান করার চেষ্টা করবেন না, এটি ডাটাবেসে জিনিসগুলি ধীরে ধীরে ধীরে ধীরে দেখা যায়।

আপনি কারখানায় কোনও ফাইল দেওয়ার মতো কারখানায় ইনপুট স্ট্রিম দিয়ে আপনি ইউরির থেকে বিটম্যাপ পেতে পারেন:

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

5
আসলে এটিই একমাত্র সঠিক প্রতিক্রিয়া। কেউই ফাইলের নাম সম্পর্কে সত্যিই চিন্তা করে না। আমাদের যা প্রয়োজন তা হ'ল বিষয়বস্তু। আসল ফাইলটি অ্যাপ্লিকেশনটির ব্যক্তিগত ফোল্ডারে, ইন্টারনেট, স্ক্লাইটে থাকতে পারে বা খাঁটিভাবে ভার্চুয়াল হতে পারে এবং ফ্লাইতে উত্পন্ন হতে পারে।
দুরিলকা

18
সুনির্দিষ্ট প্রশ্নটি ফাইলের নাম এবং পথের জন্য। হ্যাঁ, ওপি ফাইলটি থেকে একটি বিটম্যাপ আনতে চাইছে, তবে পথটি সন্ধানকারী সবার ক্ষেত্রে এটি সত্য নয়। কখনও কখনও আমাদের আসল ফাইল সামগ্রী প্রয়োজন।
Huperniketes

3
@ ডুরিলকা, একটি উদাহরণ: ফাইলটি যদি কোনও ভিডিও হয় এবং আপনি একটি থাম্বনেইল চান তবে "থাম্বনেইলটিলসক্রিটভিডিও থম্বনেল" ফাংশনটি কেবল স্ট্রিংয়ের একটি পথ দিয়ে বলা যেতে পারে, ইনপুট স্ট্রিমগুলির কোনও প্রকার গ্রহণ করে না।
এলায়ান্টে

1
আমি প্রথমে চেক করব ভিডিওর জন্য সামগ্রী সরবরাহকারী মেটাডেটার পাশাপাশি থাম্বনেইল সরবরাহ করে কিনা। অ্যান্ড্রয়েড সব সম্পর্কে "কেউ যদি ইতিমধ্যে এটি করে থাকে তবে নিজেকে এটি প্রয়োগ করবেন না"। প্রতিটি উচ্চাভিলাষী অ্যাপ্লিকেশন কীভাবে নিজের ফটো ক্যাপচারিং তৈরি করার চেষ্টা করে তা সত্যিই আমাকে শৌখিন করে।
durilka

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
এটি কি ফাইল: // এবং সামগ্রী: // ইউআরআই এবং এর বিপরীতে রূপান্তর করতে পারে? আমি আমার প্রকল্পের কোডটি অন্তর্ভুক্ত করার চেষ্টা করেছি, তবে এটি বলছে অ্যাপ্লিকেশনবজেক্টটি সমাধান করা যায় না।
ব্যবহারকারী280109

5
অ্যাপ্লিকেশনবজেক্টে এটি সমস্যা, আপনি আমাকে কিছু কোড দিতে পারেন?
নিকোলে নিকিফোরচুক

ওহ, ঠিক আছে, চিন্তা করবেন না, আমি কাজ করেছি, চিয়ার্সের মতো আরও কয়েকটি উদাহরণ কোড পেয়েছি।
ব্যবহারকারী280109

2
এটি সর্বোত্তম উত্তর হিসাবে প্রাপ্য, এটি আরও ব্যাপক এবং আমার যে কোনও সমস্যা ছিল তা সমাধান করেছে।
আন্দ্রেয়াস রুডলফ

আপনি যখন ইতিমধ্যে স্ট্রিং ফেরত পেয়েছেন তখন লাস্টপ্যাথসেজমেন্ট () কে টু স্ট্রিং () কল করছেন কেন?
droid8421

15

ভাল বিদ্যমান উত্তরগুলি, যার মধ্যে কয়েকটি আমি নিজেরাই প্রকাশ করতাম:

আমাকে ইউআরআই থেকে পথ পেতে হবে এবং পাথগুলি থেকে ইউআরআই পেতে হবে, এবং গুগলের পক্ষে একই সমস্যা রয়েছে এমন প্রত্যেকের জন্য পার্থক্য বলতে খুব কঠিন সময় এসেছে (যেমন, 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;
}

দ্বিতীয়টি (যা আমি ভিডিওগুলির জন্য করি তবে মিডিয়াস্টোর.ভিডিওর জন্য অডিও বা ফাইল বা মিডিয়াস্টোর.অডিও (ইত্যাদি) প্রতিস্থাপনের মাধ্যমে অন্যান্য ধরণের সঞ্চিত সামগ্রীর জন্যও ব্যবহার করা যেতে পারে):

/**
 * 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

এই উত্তরগুলির কোনওটিই আমার পক্ষে সব ক্ষেত্রে কার্যকর হয়নি। আমাকে এই বিষয়টিতে সরাসরি গুগলের ডকুমেন্টেশন https://developer.android.com/guide/topics/providers/docament-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));
হর্ষিল পানসারে

আমি ওরিও স্টক অ্যান্ড্রয়েড ব্যবহার করছি এবং এটি কোনও কারণে এটিতে কাজ করে না
হর্ষিল পানসারে

ইউআরআই থেকে পিডিএফ ফাইলের ফাইল ফাইল পাথ কীভাবে পাবেন আপনি আমাকে সহায়তা করতে পারেন

@ হারশিলপান্সারে, আপনি কীভাবে এটি অ্যান্ড্রয়েড ওরিওর জন্য কাজ করতে পেরেছেন? আমি এটিতে 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

যারা কিটকেটে যাওয়ার পরে সমস্যা আছে তাদের জন্য সমাধান:

"এটি অফিশিয়াল কন্টেন্টপ্রোভাডার পদ্ধতিতে ফিরে গিয়ে মিডিয়াপ্রোভাইডার, ডাউনলোডসপ্রোভাডার এবং এক্সটার্নাল স্টোরেজপ্রোভাইডারের ফাইল ফাইল পাবে" https://stackoverflow.com/a/20559175/690777


এটি নিখুঁত উত্তর বলে মনে হচ্ছে
AndroidPlayer2

3

গ্যালারী থেকে একটি ছবি পাওয়ার পরে, কেবল অ্যান্ড্রয়েড ৪.৪ (কিটকাট) এর জন্য কেবল নীচের পদ্ধতিতে ইউআরআই পাস করুন :

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

এটা চেষ্টা কর

তবুও, যদি আপনি আসল পথটি পেতে সমস্যা পান তবে আপনি আমার উত্তরগুলি চেষ্টা করতে পারেন। উপরের উত্তরগুলি আমাকে সাহায্য করে না।

ব্যাখ্যা : - এই পদ্ধতিটি ইউআরআই পায় এবং তারপরে আপনার অ্যান্ড্রয়েড ডিভাইসের এপিআই স্তরটি পরীক্ষা করে তারপরে এপিআই স্তর অনুযায়ী এটি আসল পথ তৈরি করবে। আসল পাথ পদ্ধতি উত্পন্ন করার কোডটি এপিআই স্তর অনুসারে আলাদা is

  1. ইউআরআই থেকে আসল পথ পাওয়ার পদ্ধতি

    @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: / স্টোরেজ / মেমুলেটেড/0 / ভিডিও / সেভেনজার্স_ইনফিনিটি_ওয়ার_কে_8 কে-7680x4320.jpg


1
সঙ্গে আমার ফিজিক্যাল ডিভাইস এপিআই স্তর 25 আয় মারাত্মক EXCEPTION আদেশের সঙ্গে String wholeID = DocumentsContract.getDocumentId(uri);আমি পাবেন:java.lang.RuntimeException: Failure delivering result
Aliton মধ্যে Oliveira

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.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

অতীতে অ্যান্ড্রয়েড কিউয়ের জন্য কোনও উপায় , যখন মিডিয়াস্টোর.আইমেজ.মিডিয়া.ডাটা আর পাওয়া যাবে না? এই ক্ষেত্রটি অ্যান্ড্রয়েড কিউতে অবচয় করা হয়েছে:

এই ধ্রুবকটি এপিআই স্তরের 29-এ অবনতিযুক্ত ছিল Apps অ্যাপগুলিতে সরাসরি এই পাথ অ্যাক্সেস করার জন্য ফাইল সিস্টেম অনুমতি থাকতে পারে না। সরাসরি এই পাথটি খোলার চেষ্টা করার পরিবর্তে, অ্যাপ্লিকেশনগুলিকে অ্যাক্সেস পাওয়ার জন্য সামগ্রীResolver # ওপেনফাইলডেস্কিটার (উরি, স্ট্রিং) ব্যবহার করা উচিত।

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

--- সম্পাদিত

যতদূর আমি অতীতের অ্যান্ড্রয়েড কি সম্পর্কে জানতে পারি তার একমাত্র উপায় হ'ল RELATIVE_PATH এ রিলে

স্টোরেজ ডিভাইসের মধ্যে এই মিডিয়া আইটেমটির আপেক্ষিক পথ যেখানে এটি বজায় রয়েছে। উদাহরণস্বরূপ, / স্টোরেজ/0000-0000/ DCIM/ অবকাশ / আইএমজি 1024. জেপিজিতে সংরক্ষিত একটি আইটেমের DCIM / অবকাশ / এর পথ থাকবে।

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


অ্যান্ড্রয়েড কিউ-তে থাকা সমস্ত ফাইলের কি আপেক্ষিক পথ রয়েছে বা আমাদের কী সেগুলি যুক্ত করা দরকার, যদি ফাইলটি ডিভাইসে ইতিমধ্যে উপস্থিত থাকে তবে এর আপেক্ষিক পথটি পাওয়া যাবে?
1234567

1
@ 1234567 লিঙ্কে বর্ণিত বর্ণনা অনুযায়ী আপনি যদি এটিকে শূন্য হিসাবে পাস করেন তবে সিস্টেমটি এটি সঠিকভাবে সেট আপ করবে। যদি ফাইলটি ইতিমধ্যে উপস্থিত থাকে তবে মিডিয়া স্ক্যানারের ক্ষেত্রটি যুক্ত করা উচিত।
মালাচিয়াজ

টার্গেট এপিআই হিসাবে আপনার অ্যান্ড্রয়েড কি দরকার এবং সম্ভবত স্কোপড স্টোরেজ চালু করুন
মালাচিয়াজ

1

@ পার্স্পিয়ার্সির সামান্য পরিবর্তিত সংস্করণ - এটি ফেলে না এবং কিছু ভুল হলে কেবল নালায় ফেরায় :

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 থেকে পথ পাওয়া খুব শক্ত get তাহলে আপনার পথের দরকার কী? অন্য জায়গায় ফাইল কপি করতে? আপনার পথের দরকার নেই।

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 API স্তরের জন্য।

এই পদ্ধতিতে uri থেকে ফাইলপথ পেতে সমস্ত ক্ষেত্রে আচ্ছাদিত

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

লোকালস্টোরাজপ্রোভাডার সমাধান করতে পারে না
জয়ন

অবশেষে, একটি পদ্ধতি যা কাজ করে! (এই কোড থেকে আমি স্রেফ লোকালস্টোরেজপ্রভাইডারটি সরিয়ে ফেলেছি)
স্টারওয়েভ

0

নীচের পদ্ধতিটি দেখুন ওরেও 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;
    }

}

ইউআরআই পাথ শ্রেণি:

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)

ক্রিয়াকলাপের ফলাফলগুলিতে যা দেখতে লাগে:

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

কোনও কারণে, আমি কোনও চিত্র নির্বাচন করতে স্যামসুং গ্যালারী অ্যাপ্লিকেশন ব্যবহার করলে এই পদ্ধতির কাজ হবে না
কেএমসি

রহস্যময়। আমি একটি স্যামসং গ্যালাক্সি এস 10-তে বিকাশ করছিলাম।
জোয়েল ব্রস্ট্রমেম

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

এবং এইভাবে আপনি সমস্ত অ্যান্ড্রয়েড সংস্করণগুলির জন্য সামগ্রী উরির পুরো পথ পাবেন

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



"আমি ছবিটি কোথাও অনুলিপি না করে বিটম্যাপে লোড করতে চাই।" , আমি মনে করি এই উত্তরটি প্রশ্নের উত্তর সরবরাহ করে!
ড্রাস্টারো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.