কীভাবে ইউআরআই থেকে ফাইলের নাম আহরণ করতে হবে ইন্টেন্ট থেকে ফিরে এসেছিল? ACTION_GET_CONTENT?


105

আমি ফাইল সিস্টেম থেকে একটি ফাইল বাছাই করতে আমার তৃতীয় পক্ষের ফাইল ম্যানেজারটি ব্যবহার করছি (আমার ক্ষেত্রে পিডিএফ)।

এইভাবে আমি ক্রিয়াকলাপটি চালু করি:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);

String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);

startActivityForResult(chooser, ActivityRequests.BROWSE);

এটি আমার মধ্যে রয়েছে onActivityResult:

Uri uri = data.getData();
if (uri != null) {
    if (uri.toString().startsWith("file:")) {
        fileName = uri.getPath();
    } else { // uri.startsWith("content:")

        Cursor c = getContentResolver().query(uri, null, null, null, null);

        if (c != null && c.moveToFirst()) {

            int id = c.getColumnIndex(Images.Media.DATA);
            if (id != -1) {
                fileName = c.getString(id);
            }
        }
    }
}

কোড স্নিপেট এখানে উপলভ্য ওপেন ইনটেন্টস ফাইল ম্যানেজার নির্দেশাবলী থেকে ধার করা হয়েছে:
http://www.openintents.org/en/node/829

উদ্দেশ্য উদ্দেশ্য if-elseপিছনে সামঞ্জস্য। আমি আশ্চর্য হই যে ফাইল ফাইলের নাম পাওয়ার এটি যদি সর্বোত্তম উপায় তবে আমি খুঁজে পেয়েছি যে অন্যান্য ফাইল পরিচালকরা সমস্ত ধরণের জিনিস ফেরত দেয়।

উদাহরণস্বরূপ, ডকুমেন্টস টুও নিম্নলিখিতগুলির মতো কিছু ফেরত দেয়:

content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf

যার উপর getContentResolver().query()ফিরে আসে null

বিষয়গুলিকে আরও আকর্ষণীয় করে তুলতে, নামবিহীন ফাইল ম্যানেজার (ক্লায়েন্ট লগ থেকে আমি এই ইউআরআই পেয়েছি) এর মতো কিছু ফিরে পেয়েছে:

/./sdcard/downloads/.bin


ইউআরআই থেকে ফাইলের নাম বের করার কোনও পছন্দসই উপায় আছে বা কোনও একটি স্ট্রিং পার্সিংয়ের অবলম্বন করবে?


সম্ভবত আরও উত্তরের একই প্রশ্ন: স্ট্যাকওভারফ্লো /
রামি

উত্তর:


170

বিকাশকারী.অ্যান্ড্রয়েড.কম এর জন্য চমৎকার উদাহরণ কোড রয়েছে: https://developer.android.com/guide/topics/providers/docament-provider.html

কেবলমাত্র ফাইলের নাম বের করার জন্য একটি কনডেন্সড সংস্করণ ("এটি" একটি কার্যকলাপ হিসাবে ধরে নেওয়া):

public String getFileName(Uri uri) {
  String result = null;
  if (uri.getScheme().equals("content")) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    try {
      if (cursor != null && cursor.moveToFirst()) {
        result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
      }
    } finally {
      cursor.close();
    }
  }
  if (result == null) {
    result = uri.getPath();
    int cut = result.lastIndexOf('/');
    if (cut != -1) {
      result = result.substring(cut + 1);
    }
  }
  return result;
}

ক্ষেত্রে যখন আপনি ক্যামেরা থেকে ফাইলের MIMETYPE অথবা FILENAME পড়া প্রচেষ্টা, প্রথমত আপনি MediaScanner যে রূপান্তর করবে অবহিত করতে হবে কোনো URI থেকে আপনার তৈরি করা ফাইলের file://জন্য content://onScanCompleted(String path, Uri uri)পদ্ধতি stackoverflow.com/a/5815005/2163045
murt

10
new String[]{OpenableColumns.DISPLAY_NAME}ক্যোয়ারিতে দ্বিতীয় প্যারামিটার হিসাবে যুক্ত করা আরও দক্ষ অনুরোধের জন্য কলামগুলি ফিল্টার করবে।
জেএম লর্ড

OpenableColumns.DISPLAY_NAMEআমার জন্য কাজ করেনি, আমি MediaStore.Files.FileColumns.TITLEপরিবর্তে ব্যবহার করেছি ।
দিমিত্রি কোপাইটোভ

java.lang.IllegalArgumentException: Invalid column latitudeদুর্ভাগ্যক্রমে কার্সার তৈরি করার সময় এটি ভিডিওগুলির জন্য ক্রাশ হবে । যদিও ছবির জন্য নিখুঁতভাবে কাজ করে!
লুকাস পি।

আপনার ফ্যালব্যাকে, আপনি uri.getLastPathSegment()নিজের পার্সিংয়ের পরিবর্তে কেবল কল করতে পারেন ।
গ্রিশকা

45

আমি এই জাতীয় কিছু ব্যবহার করছি:

String scheme = uri.getScheme();
if (scheme.equals("file")) {
    fileName = uri.getLastPathSegment();
}
else if (scheme.equals("content")) {
    String[] proj = { MediaStore.Images.Media.TITLE };
    Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
    if (cursor != null && cursor.getCount() != 0) {
        int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.TITLE);
        cursor.moveToFirst();
        fileName = cursor.getString(columnIndex);
    }
    if (cursor != null) {
        cursor.close();
    }
}

4
আমি আপনার কোডে কিছু পরীক্ষা চালিয়েছি। ইউআরআই-তে ওআই ফাইল ম্যানেজার দ্বারা ফিরে আসা ইলিজালআরগমেন্টএক্সেপশনটি কলাম 'শিরোনাম' উপস্থিত না থাকায় নিক্ষেপ করা হয়। ডকুমেন্টস দ্বারা ইউআরআই পুনরুদ্ধার করতে টোগো কার্সারটি বাতিল n ইউআরআইতে অজানা ফাইল ম্যানেজার স্কিম দ্বারা ফিরে আসে (স্পষ্টতই) নাল।
ভিক্টর ব্রেয়ান

4
হুঁ, আকর্ষণীয়। হ্যাঁ, স্কিমের জন্য পরীক্ষা করা! = নাল একটি ভাল ধারণা। আসলে আমি মনে করি না টাইটেলটি যা আপনি চান তা। আমি এটি ব্যবহার করছিলাম কারণ অ্যান্ড্রয়েডে নির্দিষ্ট মিডিয়ার ধরণের (যেমন সংগীত বাছাইকারী দ্বারা নির্বাচিত গানগুলির) সামগ্রী যেমন ইউআরআই থাকে: // মিডিয়া / বাহ্যিক / অডিও / মিডিয়া / and / এবং আমি আইডি নম্বরটির চেয়ে আরও প্রাসঙ্গিক কিছু প্রদর্শন করতে চেয়েছিলাম। আপনি কেবল uri.getLastPathSeament () ফাইলের জন্য আমার কোড ব্যবহার করে ব্যবহার করতে পারেন: // ইউআরআই যদি আপনার সামগ্রী যেমন ইউআরআই থাকে: //...somefile.pdf
কেন

4
uri.getLastPathSeament (); - আপনি আমার দিন বাঁচিয়েছেন :)
লুমিস

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

4
হাই, কেন ডি cursorনা close()?
fikr4n

35

ফাইলের তথ্য পুনরুদ্ধার করা থেকে নেওয়া অ্যান্ড্রয়েড বিকাশকারীরা

একটি ফাইলের নাম পুনরুদ্ধার করা।

private String queryName(ContentResolver resolver, Uri uri) {
    Cursor returnCursor =
            resolver.query(uri, null, null, null, null);
    assert returnCursor != null;
    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    returnCursor.moveToFirst();
    String name = returnCursor.getString(nameIndex);
    returnCursor.close();
    return name;
}

4
আমি অনেক দিন ধরে এটি খুঁজছিলাম!
ডাসফিমা

7
ধন্যবাদ. শুভ প্রভু কেন তাদের এত ক্ষুদ্র জিনিস এত বিরক্তিকর করতে হবে?
টাইলারজেমস

4
এটি শুধুমাত্র কন্টেন্ট ফাইলগুলির সাথে কাজ করে। সম্পূর্ণ পদ্ধতির জন্য স্ট্যাকওভারফ্লো.com/a/25005243/6325722 দেখুন
জনি পাঁচ

18

ফাইলের নাম পাওয়ার সহজ উপায়:

val fileName = File(uri.path).name
// or
val fileName = uri.pathSegments.last()

যদি তারা আপনাকে সঠিক নাম না দেয় তবে আপনার ব্যবহার করা উচিত:

fun Uri.getName(context: Context): String {
    val returnCursor = context.contentResolver.query(this, null, null, null, null)
    val nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
    returnCursor.moveToFirst()
    val fileName = returnCursor.getString(nameIndex)
    returnCursor.close()
    return fileName
}

শুধু File(uri.path).nameকাজ করে, আপনাকে ধন্যবাদ!
স্যাম চেন

17

যদি আপনি এটি সংক্ষিপ্ত চান তবে এটি কাজ করা উচিত।

Uri uri= data.getData();
File file= new File(uri.getPath());
file.getName();

4
আমি file.getName () দিয়ে একটি নাম পাচ্ছি তবে এটির প্রকৃত নাম নয়
তুষার ঠাকুর

4
আমার ফাইলের নাম user.jpg তবে আমি প্রতিক্রিয়াতে "6550" পাচ্ছি
তুষার ঠাকুর

4
এটি প্রকৃত ফাইলের নাম দেয় না। আসলে এটি আপনার সংস্থান URL এর শেষ অংশটি ফেরত দেয় return
এমদাদুল সাওন

এটি ফাইল হিসাবে কাজ করে না! বেশিরভাগ ইউআরআইকে আজ মিডিয়াস্টোর দ্বারা ডিকোড করতে হবে। আমি এবং অন্যরা কেন নম্বর পাচ্ছি তার কারণ। কারণ সেগুলি সেই ফাইলগুলির আইডি।
Sud007

এটি 4 বছর আগে দেওয়া একটি প্রতিক্রিয়া ছিল। অ্যান্ড্রয়েড স্পষ্টতই প্রতিটি রিলিজ পরিবর্তন করে।
স্যামুয়েল

7

আমি আমার প্রকল্পে উরি থেকে ফাইলের নাম এবং ফাইলের আকার পেতে কোডের নীচে ব্যবহার করি।

/**
 * Used to get file detail from uri.
 * <p>
 * 1. Used to get file detail (name & size) from uri.
 * 2. Getting file details from uri is different for different uri scheme,
 * 2.a. For "File Uri Scheme" - We will get file from uri & then get its details.
 * 2.b. For "Content Uri Scheme" - We will get the file details by querying content resolver.
 *
 * @param uri Uri.
 * @return file detail.
 */
public static FileDetail getFileDetailFromUri(final Context context, final Uri uri) {
    FileDetail fileDetail = null;
    if (uri != null) {
        fileDetail = new FileDetail();
        // File Scheme.
        if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
            File file = new File(uri.getPath());
            fileDetail.fileName = file.getName();
            fileDetail.fileSize = file.length();
        }
        // Content Scheme.
        else if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
            Cursor returnCursor =
                    context.getContentResolver().query(uri, null, null, null, null);
            if (returnCursor != null && returnCursor.moveToFirst()) {
                int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
                fileDetail.fileName = returnCursor.getString(nameIndex);
                fileDetail.fileSize = returnCursor.getLong(sizeIndex);
                returnCursor.close();
            }
        }
    }
    return fileDetail;
}

/**
 * File Detail.
 * <p>
 * 1. Model used to hold file details.
 */
public static class FileDetail {

    // fileSize.
    public String fileName;

    // fileSize in bytes.
    public long fileSize;

    /**
     * Constructor.
     */
    public FileDetail() {

    }
}

বাহ্যিক বা অভ্যন্তরীণ ডেটা থেকে ফাইলের নাম লোড করে আমার সমস্যা সমাধানে সহায়তা করেছে! খুব দরকারী আপনাকে ধন্যবাদ!
ব্র্যান্ডন

6

সবচেয়ে ঘনীভূত সংস্করণ:

public String getNameFromURI(Uri uri) {
    Cursor c = getContentResolver().query(uri, null, null, null, null);
    c.moveToFirst();
    return c.getString(c.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}

4
কার্সার বন্ধ করতে ভুলবেন না :)
বেকবট

5

কোটলিনের জন্য, আপনি এর মতো কিছু ব্যবহার করতে পারেন:

object FileUtils {

   fun Context.getFileName(uri: Uri): String?
        = when (uri.scheme) {
            ContentResolver.SCHEME_FILE -> File(uri.path).name
            ContentResolver.SCHEME_CONTENT -> getCursorContent(uri)
            else -> null
        }

    private fun Context.getCursorContent(uri: Uri): String? 
        = try {
            contentResolver.query(uri, null, null, null, null)?.let { cursor ->
                cursor.run {
                    if (moveToFirst()) getString(getColumnIndex(OpenableColumns.DISPLAY_NAME))
                    else null
                }.also { cursor.close() }
            }
        } catch (e : Exception) { null }

উত্তম উত্তর, তবে আমার মতে 'কনটেক্সট' নামের একটি ফাইলে এই ফানগুলি (Context.getFileName এবং Context.getCursorContent) সন্নিবেশ করানো ভাল, শব্দ অবজেক্ট ফাইলUtils মুছুন এবং এটি এক্সটেনশন হিসাবে ব্যবহার করুন, উদাহরণস্বরূপ: Val txtFileName = context.getFileName (uri)
আলেক্সি সিমচেনকো

@ লুমিসডি আপনি যে কোনও ফাইলের মধ্যে এই এক্সটেনশনগুলি আমদানি করতে পারেন, আপনার পরামর্শটি সঠিক তবে পদ্ধতিগুলি বিশ্বব্যাপী হলে আমি কেবল ঘৃণা করি। আমি নির্দিষ্ট পদ্ধতিগুলি দেখতে চাই যখন আমি সেগুলি আমদানি করি এবং সর্বদা না। এবং কখনও কখনও আমি একই পদ্ধতির নাম এবং বিভিন্ন উত্স থাকা পছন্দ করি তাই আমি প্রয়োজনীয়
জায়গাগুলি

আপনি এটি এইভাবে আমদানি করতে পারেন: com.example.FileUtils.getFileName আমদানি করুন বা কেবল প্রসঙ্গে লিখুন .getFileName (uri) এবং Alt + এন্টার চাপুন এবং আপনার আইডিই এটি আপনার জন্য করবে :)
তামিম আত্তফি

4
public String getFilename() 
{
/*  Intent intent = getIntent();
    String name = intent.getData().getLastPathSegment();
    return name;*/
    Uri uri=getIntent().getData();
    String fileName = null;
    Context context=getApplicationContext();
    String scheme = uri.getScheme();
    if (scheme.equals("file")) {
        fileName = uri.getLastPathSegment();
    }
    else if (scheme.equals("content")) {
        String[] proj = { MediaStore.Video.Media.TITLE };
        Uri contentUri = null;
        Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);
        if (cursor != null && cursor.getCount() != 0) {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE);
            cursor.moveToFirst();
            fileName = cursor.getString(columnIndex);
        }
    }
    return fileName;
}

এটি আমার ক্ষেত্রে কার্যকর হয়নি, তবে ভাসানথ উত্তরটি করেছিল।
নবজী

3

আপনি যদি এক্সটেনশন সহ ফাইলের নাম রাখতে চান তবে আমি এটি পেতে এটি ফাংশনটি ব্যবহার করি। এটি গুগল ড্রাইভ ফাইল বাছাইয়ের সাথেও কাজ করে

public static String getFileName(Uri uri) {
    String result;

    //if uri is content
    if (uri.getScheme() != null && uri.getScheme().equals("content")) {
        Cursor cursor = global.getInstance().context.getContentResolver().query(uri, null, null, null, null);
        try {
            if (cursor != null && cursor.moveToFirst()) {
                //local filesystem
                int index = cursor.getColumnIndex("_data");
                if(index == -1)
                    //google drive
                    index = cursor.getColumnIndex("_display_name");
                result = cursor.getString(index);
                if(result != null)
                    uri = Uri.parse(result);
                else
                    return null;
            }
        } finally {
            cursor.close();
        }
    }

    result = uri.getPath();

    //get filename + ext of path
    int cut = result.lastIndexOf('/');
    if (cut != -1)
        result = result.substring(cut + 1);
    return result;
}

4
আপনার উত্তরের জন্য ধন্যবাদ, এটি আমাকে সাহায্য করেছে।
সাখাওয়াত হোসেন

2
String Fpath = getPath(this, uri) ;
File file = new File(Fpath);
String filename = file.getName();

4
আপনার কোডটি কী করে আপনি কিছুটা ব্যাখ্যা করতে পারেন? আপনার উত্তর এই ইস্যুতে হোঁচট খাচ্ছে অন্যান্য ব্যবহারকারীদের পক্ষে আরও কার্যকর হবে। ধন্যবাদ
wmk

কিছু কারণে এটি মার্শমেলোতে কাজ করে না। এটি কেবল "অডিও এবং কিছু নম্বর" আউটপুট করে
অ্যালেক্স

1

আমার উত্তরটির সংস্করণটি আসলে @ স্টেফান হস্টেইনের সাথে খুব মিল। আমি অ্যান্ড্রয়েড বিকাশকারী পৃষ্ঠায় উত্তরটি ফাইলের তথ্য পুনরুদ্ধার করে পেয়েছি ; স্টোরেজ অ্যাক্সেস ফ্রেমওয়ার্ক গাইড সাইটের তুলনায় এখানে তথ্য এই নির্দিষ্ট বিষয়ে আরও বেশি ঘনীভূত । ক্যোয়ারী থেকে ফলাফলে কলাম সূচক ফাইল নাম OpenableColumns.DISPLAY_NAME। কলাম সূচকগুলির জন্য অন্য উত্তর / সমাধানগুলির মধ্যে আমার পক্ষে কাজ হয়নি। নীচে নমুনা ফাংশন:

 /**
 * @param uri uri of file.
 * @param contentResolver access to server app.
 * @return the name of the file.
 */
def extractFileName(uri: Uri, contentResolver: ContentResolver): Option[String] = {

    var fileName: Option[String] = None
    if (uri.getScheme.equals("file")) {

        fileName = Option(uri.getLastPathSegment)
    } else if (uri.getScheme.equals("content")) {

        var cursor: Cursor = null
        try {

            // Query the server app to get the file's display name and size.
            cursor = contentResolver.query(uri, null, null, null, null)

            // Get the column indexes of the data in the Cursor,
            // move to the first row in the Cursor, get the data.
            if (cursor != null && cursor.moveToFirst()) {

                val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
                fileName = Option(cursor.getString(nameIndex))
            }

        } finally {

            if (cursor != null) {
                cursor.close()
            }

        }

    }

    fileName
}

1

প্রথমে আপনাকে নিজের URIঅবজেক্টটিকে অবজেক্টে রূপান্তর করতে হবে URLএবং তারপরে Fileকোনও ফাইলের নাম পুনরুদ্ধার করতে অবজেক্টটি ব্যবহার করতে হবে:

try
    {
        URL videoUrl = uri.toURL();
        File tempFile = new File(videoUrl.getFile());
        String fileName = tempFile.getName();
    }
    catch (Exception e)
    {

    }

এটা খুব সহজ।


1

এক্সারমিন / সি # এর জন্য স্টিফান হস্টেইন ফাংশন:

public string GetFilenameFromURI(Android.Net.Uri uri)
        {
            string result = null;
            if (uri.Scheme == "content")
            {
                using (var cursor = Application.Context.ContentResolver.Query(uri, null, null, null, null))
                {
                    try
                    {
                        if (cursor != null && cursor.MoveToFirst())
                        {
                            result = cursor.GetString(cursor.GetColumnIndex(OpenableColumns.DisplayName));
                        }
                    }
                    finally
                    {
                        cursor.Close();
                    }
                }
            }
            if (result == null)
            {
                result = uri.Path;
                int cut = result.LastIndexOf('/');
                if (cut != -1)
                {
                    result = result.Substring(cut + 1);
                }
            }
            return result;
        }

1

এটি আসলে আমার পক্ষে কাজ করেছিল:

private String uri2filename() {

    String ret;
    String scheme = uri.getScheme();

    if (scheme.equals("file")) {
        ret = uri.getLastPathSegment();
    }
    else if (scheme.equals("content")) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            ret = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
        }
   }
   return ret;
}

0

দয়া করে এটি চেষ্টা করুন:

  private String displayName(Uri uri) {

             Cursor mCursor =
                     getApplicationContext().getContentResolver().query(uri, null, null, null, null);
             int indexedname = mCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
             mCursor.moveToFirst();
             String filename = mCursor.getString(indexedname);
             mCursor.close();
             return filename;
 }

0

সমস্ত উত্তর সংমিশ্রণ

এখানে উপস্থিত সমস্ত উত্তর পড়ার পরে আমি এখানে পৌঁছেছি এবং সাথে সাথে কিছু এয়ারগ্রাম তাদের এসডিকে কী করেছে - আমি ইউথলিটি যা আমি গিথুবকে প্রকাশ করেছি:

https://github.com/mankum93/UriUtilsAndroid/tree/master/app/src/main/java/com/androiduriutils

ব্যবহার

কলিং হিসাবে সহজ UriUtils.getDisplayNameSize(),। এটি সামগ্রীর নাম এবং আকার উভয়ই সরবরাহ করে।

দ্রষ্টব্য: কেবল একটি সামগ্রী: // উরি দিয়ে কাজ করে

এখানে কোডের এক ঝলক দেওয়া হয়েছে:

/**
 * References:
 * - https://www.programcreek.com/java-api-examples/?code=MLNO/airgram/airgram-master/TMessagesProj/src/main/java/ir/hamzad/telegram/MediaController.java
 * - /programming/5568874/how-to-extract-the-file-name-from-uri-returned-from-intent-action-get-content
 *
 * @author Manish@bit.ly/2HjxA0C
 * Created on: 03-07-2020
 */
public final class UriUtils {


    public static final int CONTENT_SIZE_INVALID = -1;

    /**
     * @param context context
     * @param contentUri content Uri, i.e, of the scheme <code>content://</code>
     * @return The Display name and size for content. In case of non-determination, display name
     * would be null and content size would be {@link #CONTENT_SIZE_INVALID}
     */
    @NonNull
    public static DisplayNameAndSize getDisplayNameSize(@NonNull Context context, @NonNull Uri contentUri){

        final String scheme = contentUri.getScheme();
        if(scheme == null || !scheme.equals(ContentResolver.SCHEME_CONTENT)){
            throw new RuntimeException("Only scheme content:// is accepted");
        }

        final DisplayNameAndSize displayNameAndSize = new DisplayNameAndSize();
        displayNameAndSize.size = CONTENT_SIZE_INVALID;

        String[] projection = new String[]{MediaStore.Images.Media.DATA, OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE};
        Cursor cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
        try {
            if (cursor != null && cursor.moveToFirst()) {

                // Try extracting content size

                int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
                if (sizeIndex != -1) {
                    displayNameAndSize.size = cursor.getLong(sizeIndex);
                }

                // Try extracting display name
                String name = null;

                // Strategy: The column name is NOT guaranteed to be indexed by DISPLAY_NAME
                // so, we try two methods
                int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                if (nameIndex != -1) {
                    name = cursor.getString(nameIndex);
                }

                if (nameIndex == -1 || name == null) {
                    nameIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
                    if (nameIndex != -1) {
                        name = cursor.getString(nameIndex);
                    }
                }
                displayNameAndSize.displayName = name;
            }
        }
        finally {
            if(cursor != null){
                cursor.close();
            }
        }

        // We tried querying the ContentResolver...didn't work out
        // Try extracting the last path segment
        if(displayNameAndSize.displayName == null){
            displayNameAndSize.displayName = contentUri.getLastPathSegment();
        }

        return displayNameAndSize;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.