ফাইল রূপান্তর করুন: অ্যান্ড্রয়েডে ইউরি থেকে ফাইল


400

সবচেয়ে সহজ উপায় A থেকে রূপান্তর করতে কি file: android.net.Uriএকটি থেকে Fileঅ্যান্ড্রয়েড কি?

নিম্নলিখিত চেষ্টা করেও কাজ করে না:

 final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
 Uri uri = Uri.fromFile(file);
 File auxFile = new File(uri.toString());
 assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());

এই আমার সমাধান !! এটি ভালই কাজ করে! stackoverflow.com/questions/2789276/...
cesards


অ্যাসেটএকুয়ালস কী করে?
হুযাইফা আসিফ

Uri.fromFile প্রসঙ্গটি কেবল আমার উপর কাজ করছে না :(
বে

উত্তর:


780

আপনি যা চান তা হ'ল ...

new File(uri.getPath());

... এবং না...

new File(uri.toString());

উল্লেখ্য: uri.toString() আয় বিন্যাস অনুযায়ী পংক্তিরূপে: "file:///mnt/sdcard/myPicture.jpg", যেহেতু uri.getPath()আয় বিন্যাস অনুযায়ী পংক্তিরূপে: "/mnt/sdcard/myPicture.jpg"


4
এই দুটির মধ্যে পার্থক্য কী? কি করে toString?
মের্লিন মরগান-গ্রাহাম

86
url.toString()নিম্নলিখিত বিন্যাসে একটি স্ট্রিং প্রদান করুন: "ফাইল: ///mnt/sdcard/myPicture.jpg", যেখানে url.getPath()নিম্নলিখিত বিন্যাসে একটি স্ট্রিং প্রদান করে: "/mnt/sdcard/myPicture.jpg", অর্থাত্ স্কিম ছাড়াই প্রাক- স্থির করেছি।
আদিল হুসেন

44
যদি কোনো URI একটি Images.Media.EXTERNAL_CONTENT_URI (যেমন গ্যালারি জন্য Intent.ACTION_PICK থেকে) থেকে হিসেবে কীভাবে এটি দেখার প্রয়োজন হবে stackoverflow.com/q/6935497/42619
পাখি

2
@ চ্লেবটা খুব সহজেই চিত্রভিউতে ফাইল (এমনকি URL গুলি) লোড করার জন্য পিকাসো নামক একটি লাইব্রেরিটি পরীক্ষা করে দেখুন ।
বিরাট সিংহ

18
আমি open failed: ENOENT (No such file or directory)যখন দিয়ে এই ফাইলটি খোলার চেষ্টা করি তখন বেশিরভাগ সময় আমি পাই । এছাড়াও, উদাহরণস্বরূপ যদি উরি কোনও চিত্রের বিষয়বস্তু উরি হয় তবে এটি অবশ্যই কাজ করে না।
ক্লু

50

দীর্ঘ সময় অনুসন্ধানের পরে এটি আমার পক্ষে কাজ করেছে:

File file = new File(getPath(uri));


public String getPath(Uri uri) 
    {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        if (cursor == null) return null;
        int column_index =             cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String s=cursor.getString(column_index);
        cursor.close();
        return s;
    }

6
managedQueryএখন অবচয় করা হয়েছে। getContentResolver().query(...)পরিবর্তে ব্যবহার করুন, যা এপিআই 11+ এ কাজ করে। এপিআই ১১ এর চেয়ে পুরানো ডিভাইসের জন্য শর্তসাপেক্ষ যুক্ত করুন
কাইল ফ্যালকনার ২

2
এটি কোনও কারণে আমার কাছে বাতিল হয়ে যায়। এবং আমার অ্যান্ড্রয়েড ইউরি এমন কিছু ফেরত দেয়: {সামগ্রী: //com.android.provider.media.documents/docament/image%3A2741}
Android.Net.UriInvoker

এটি কোনও ভাল সমাধান নয় কারণ এটি সমস্ত প্ল্যাটফর্ম জুড়ে কাজ করবে না। কিছু ডিভাইস এমনকি এই কলামটি পপুলেট করে না, আমি পূর্ববর্তী উত্তরে @ কমনওয়ারের পরামর্শ অনুসারে সামগ্রী সরবরাহকারীকে এটি হ্যান্ডেল করার পরামর্শ দিই
লিরান কোহেন

3
এটি কেবল চিত্র টাইপ ফাইলের জন্য, অন্যদের কী হবে?
প্রতিভা সরভে

2
নিশ্চিত করুন আপনি Intent.ACTION_PICK এবং Intent.ACTION_GET_CONTENT থেকে আপনার URI পেয়ে থাকেন, কারণ পরে কোন MediaStore.Images.Media.DATA হয়েছে
Denys Lobur

34

ব্যবহার

InputStream inputStream = getContentResolver().openInputStream(uri);    

সরাসরি এবং ফাইলটি অনুলিপি করুন। আরও দেখুন:

https://developer.android.com/guide/topics/providers/document-provider.html


1
এটি অনেক বেশি upvated করা উচিত। অ্যান্ড্রয়েড.নেট.উরি থেকে পথটি সমাধান করতে আপনি ডিফল্টরূপে দেখতে পাবেন বলে মনে হচ্ছে কন্টেন্টসোলভার।
মাইক মাকারভ

আমি আরেকটি আপ যোগ করতে চাই, তবে দেখা যাচ্ছে যে আমি কেবল একবারই করতে পারি!
Xenolion

27

সম্পাদনা: দুঃখিত, আমার আগে আরও ভাল করে পরীক্ষা করা উচিত ছিল। এই কাজ করা উচিত:

new File(new URI(androidURI.toString()));

ইউআরআই হল java.net.URI।


2
আহ, তবে প্রশ্নটি উরি, ইউআরআই নয়। লোকেরা এর জন্য নজরদারি করতে হবে :)
Muz

1
@ মুজ, আমি বিশ্বাস করি উত্তরটি সঠিক। androidURIএকটি android.net.Uri হয়। java.net.URI (যা অ্যান্ড্রয়েডে বিদ্যমান) কেবল রূপান্তর প্রক্রিয়ার অংশ হিসাবে ব্যবহৃত হয়।
ম্যাথু ফ্ল্যাশেন

2
আমরা কেবল এটি করতে পারি না: নতুন ফাইল (uri.getPath ());
বার্ট বার্গ

14
এই মাত্র ছোঁড়ার: IllegalArgumentException: কোনো URI মধ্যে প্রত্যাশিত ফাইল স্কীম: বিষয়বস্তু: // মিডিয়া / বহিরাগত / ছবি / মিডিয়া / 80038
তারিখে Jacek Kwiecień

7
java.lang.IllegalArgumentException: Expected file scheme in URI: content://com.shajeel.daily_monitoring.localstorage.documents.localstorage.documents/document/%2Fstorage%2Femulated%2F0%2FBook1.xlsxএই পদ্ধতিটি ব্যবহার করার পরে আমি ব্যতিক্রম পাচ্ছি ।
শজিল আফজাল

15

সবচেয়ে ভালো সমাধান

একটি সাধারণ ফাইলআপিল ক্লাস তৈরি করুন এবং ফাইলটি তৈরি, অনুলিপি এবং নাম পরিবর্তন করতে ব্যবহার করুন

আমি ব্যবহারের am uri.toString()এবং uri.getPath()না কিন্তু আমার জন্য হবে। অবশেষে আমি এই সমাধানটি খুঁজে পেয়েছি।

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileUtil {
    private static final int EOF = -1;
    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

    private FileUtil() {

    }

    public static File from(Context context, Uri uri) throws IOException {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        String fileName = getFileName(context, uri);
        String[] splitName = splitFileName(fileName);
        File tempFile = File.createTempFile(splitName[0], splitName[1]);
        tempFile = rename(tempFile, fileName);
        tempFile.deleteOnExit();
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(tempFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if (inputStream != null) {
            copy(inputStream, out);
            inputStream.close();
        }

        if (out != null) {
            out.close();
        }
        return tempFile;
    }

    private static String[] splitFileName(String fileName) {
        String name = fileName;
        String extension = "";
        int i = fileName.lastIndexOf(".");
        if (i != -1) {
            name = fileName.substring(0, i);
            extension = fileName.substring(i);
        }

        return new String[]{name, extension};
    }

    private static String getFileName(Context context, Uri uri) {
        String result = null;
        if (uri.getScheme().equals("content")) {
            Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
            try {
                if (cursor != null && cursor.moveToFirst()) {
                    result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
        }
        if (result == null) {
            result = uri.getPath();
            int cut = result.lastIndexOf(File.separator);
            if (cut != -1) {
                result = result.substring(cut + 1);
            }
        }
        return result;
    }

    private static File rename(File file, String newName) {
        File newFile = new File(file.getParent(), newName);
        if (!newFile.equals(file)) {
            if (newFile.exists() && newFile.delete()) {
                Log.d("FileUtil", "Delete old " + newName + " file");
            }
            if (file.renameTo(newFile)) {
                Log.d("FileUtil", "Rename file to " + newName);
            }
        }
        return newFile;
    }

    private static long copy(InputStream input, OutputStream output) throws IOException {
        long count = 0;
        int n;
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        while (EOF != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }
}

আপনার কোডে ফাইল ইউটিল ক্লাসটি ব্যবহার করুন

try {
         File file = FileUtil.from(MainActivity.this,fileUri);
         Log.d("file", "File...:::: uti - "+file .getPath()+" file -" + file + " : " + file .exists());

  } catch (IOException e) {
          e.printStackTrace();
  }

এটি কাজ করা হয়েছে তবে যখন আমি গ্যালারী থেকে চিত্রটি নির্বাচন করি তখন এটির লাইনে ত্রুটি নিক্ষেপ করা হয়: ইনপুটস্ট্রিম ইনপুটস্ট্রিম = প্রসঙ্গ .getContentResolver ()। ওপেন ইনপুটস্ট্রিম (ইউরি);
ওয়াহিদ আকবরী

এটি খুব ভালভাবে কাজ করেছে তবে এটি কিছু অ্যান্ড্রয়েড ডিভাইসে ফাইলনটফাউন্ডএক্সসেপশন ছুড়ে দেয়।
বিশ্বজিৎ 76

এটি ক্যামেরার সাথে কাজ করে না
সুয়াস সৌরভ

ক্যামেরা থেকে পিক ছবির জন্য এই কোড ব্যবহার করুন stackoverflow.com/a/51095098/7008132
vishwajit76

13

এর কোনোটাই আমার পক্ষে কাজ করে না। আমি এটি কার্যনির্বাহী সমাধান হিসাবে পেয়েছি। তবে আমার ক্ষেত্রে চিত্রগুলির সাথে সুনির্দিষ্ট

String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();

এটি একটি উত্তর হতে হবে! :) আমি এপিআই 25. এটা পরীক্ষিত
iroiroys

4
নোট করুন যে এই কৌশলটি অ্যান্ড্রয়েড কিউ-তে নিষিদ্ধ করা হয়েছে You
CommonsWare

13

অ্যান্ড্রয়েড + কোটলিন

  1. কোটলিন অ্যান্ড্রয়েড এক্সটেনশনের জন্য নির্ভরতা যুক্ত করুন:

    implementation 'androidx.core:core-ktx:{latestVersion}'

  2. ইউরি থেকে ফাইল পান:

    uri.toFile()

অ্যান্ড্রয়েড + জাভা

কেবল শীর্ষে যান;)


3
এটি কেবল তখনই কাজ করে যদি ইউরি স্কিম সেট করা থাকেfile
ম্যাটপ্যাগ


2

@ কমন্সওয়্যার সমস্ত বিষয় বেশ ভালভাবে ব্যাখ্যা করেছেন। এবং আমাদের প্রস্তাবিত সমাধানটি সত্যই ব্যবহার করা উচিত।

যাইহোক, অনুসন্ধানের সময় কেবলমাত্র আমরা যে তথ্যের উপর নির্ভর করতে পারি তা ContentResolverএখানে উল্লিখিত হিসাবে একটি ফাইলের নাম এবং আকার: ফাইল তথ্য পুনরুদ্ধার | অ্যান্ড্রয়েড বিকাশকারীরা

আপনি দেখতে পেলেন একটি ইন্টারফেস OpenableColumnsরয়েছে যা কেবলমাত্র দুটি ক্ষেত্র রয়েছে: DISPLAY_NAME এবং SIZE।

আমার ক্ষেত্রে আমার একটি জেপিইজি চিত্র সম্পর্কে এক্সআইএফ তথ্য পুনরুদ্ধার করা উচিত ছিল এবং সার্ভারে প্রেরণের আগে যদি প্রয়োজন হয় তবে এটি ঘোরানো হয়েছিল। যে আমি ব্যবহার করে একটি অস্থায়ী ফাইল মধ্যে একটি ফাইল বিষয়বস্তু কপি করার জন্য ContentResolverএবংopenInputStream()


1

আমি এটি নিম্নলিখিত উপায়ে তৈরি করেছি:

try {
    readImageInformation(new File(contentUri.getPath()));

} catch (IOException e) {
    readImageInformation(new File(getRealPathFromURI(context,
                contentUri)));
}

public static String getRealPathFromURI(Context context, Uri contentUri) {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor 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);
}

তাই মূলত আমি প্রথমে একটি ফাইল ব্যবহার করার চেষ্টা করি অর্থাৎ ক্যামেরা তোলা ছবি এবং এসডি কার্ডে সেভ করা। এটি চিত্র দ্বারা প্রত্যাবর্তনের জন্য কাজ করবে না: ইনটেন্ট ফটোপিকেরআইন্টেন্ট = নতুন ইন্টেন্ট (ইনটেন্ট। এ্যাকশন_পিক); সেক্ষেত্রে getRealPathFromURI()ফাংশন দ্বারা উরিকে আসল পথে রূপান্তরিত করা দরকার । সুতরাং উপসংহারটি এই যে এটি নির্ভর করে যে আপনি কোন ধরণের উরি ফাইলে রূপান্তর করতে চান।


1

যদি আপনার কাছে এমন একটি থাকে Uriযা DocumentContractআপনি তখন ব্যবহার করতে চান তবে আপনি সম্ভবত ব্যবহার করতে চান না File। আপনি যদি কোটলিনে DocumentFileথাকেন তবে পুরানো বিশ্বের যে জিনিসগুলি আপনি ব্যবহার করবেন তা করতে ব্যবহার করুন Fileএবং ContentResolverস্ট্রিমগুলি পেতে ব্যবহার করুন ।

বাকি সমস্ত কিছু ভঙ্গ করার গ্যারান্টিযুক্ত।


0

এই ক্ষেত্রে, বিশেষত অ্যান্ড্রয়েডে, বাইটগুলির জন্য যাওয়ার উপায়টি সাধারণত দ্রুত হয়।

এটির সাহায্যে, আমি এটি ক্লাস স্থাপনের মাধ্যমে সমাধান করেছি FileHelperযা স্ট্রিমের মাধ্যমে এবং ক্লাসের মাধ্যমে / থেকে ফাইল পাঠানো / লেখার বাইটগুলি নিয়ে কাজ করার দায়িত্ব দেওয়া হয়েছেUriHelper করার দায়িত্ব দেওয়া হয় যা উরির অনুমতি এবং অনুমতি নির্ধারণের জন্য দায়িত্ব দেওয়া হয়।

যতদূর এটি সাধারণভাবে জানা ছিল, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset) আপনার প্রয়োজনীয় বাইটগুলি চান স্ট্রিং স্থানান্তর করতে আমাদের সহায়তা করতে পারে।

ইউরিহেল্পার এবং ফাইলহেল্পারকে আপনাকে কীভাবে উরির দ্বারা উল্লিখিত একটি ছবি একটি ফাইলে অনুলিপি করতে দেয়, আপনি রান করতে পারেন:

FileHelper.getInstance().copy(UriHelper.getInstance().toFile(uri_of_a_picture)
                        , FileHelper.getInstance().createExternalFile(null, UriHelper.getInstance().generateFileNameBasedOnTimeStamp()
                                + UriHelper.getInstance().getFileName(uri_of_a_picture, context), context)
                );

আমার উরিহেল্পার সম্পর্কে:

public class UriHelper {
private static UriHelper INSTANCE = new UriHelper();

public static UriHelper getInstance() {
    return INSTANCE;
}

@SuppressLint("SimpleDateFormat")
public String generateFileNameBasedOnTimeStamp() {
    return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
}

/**
 * if uri.getScheme.equals("content"), open it with a content resolver.
 * if the uri.Scheme.equals("file"), open it using normal file methods.
 */
//

public File toFile(Uri uri) {
    if (uri == null) return null;
    Logger.d(">>> uri path:" + uri.getPath());
    Logger.d(">>> uri string:" + uri.toString());
    return new File(uri.getPath());
}

public DocumentFile toDocumentFile(Uri uri) {
    if (uri == null) return null;
    Logger.d(">>> uri path:" + uri.getPath());
    Logger.d(">>> uri string:" + uri.toString());
    return DocumentFile.fromFile(new File(uri.getPath()));
}

public Uri toUri(File file) {
    if (file == null) return null;
    Logger.d(">>> file path:" + file.getAbsolutePath());
    return Uri.fromFile(file); //returns an immutable URI reference representing the file
}

public String getPath(Uri uri, Context context) {
    if (uri == null) return null;
    if (uri.getScheme() == null) return null;
    Logger.d(">>> uri path:" + uri.getPath());
    Logger.d(">>> uri string:" + uri.toString());
    String path;
    if (uri.getScheme().equals("content")) {
        //Cursor cursor = context.getContentResolver().query(uri, new String[] {MediaStore.Images.ImageColumns.DATA}, null, null, null);
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        if (cursor == null) {
            Logger.e("!!! cursor is null");
            return null;
        }
        if (cursor.getCount() >= 0) {
            Logger.d("... the numbers of rows:" + cursor.getCount()
                        + "and the numbers of columns:" + cursor.getColumnCount());
            if (cursor.isBeforeFirst()) {
                while (cursor.moveToNext()) {
                    StringBuilder stringBuilder = new StringBuilder();
                    for (int i = 0; i<cursor.getColumnCount(); i++) {
                        stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
                        stringBuilder.append("\n");
                    }
                    Logger.d(stringBuilder.toString());
                }
            } else {
                cursor.moveToFirst();
                do {
                    StringBuilder stringBuilder = new StringBuilder();
                    for (int i = 0; i<cursor.getColumnCount(); i++) {
                        stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
                        stringBuilder.append("\n");
                    }
                    Logger.d(stringBuilder.toString());
                } while (cursor.moveToNext());
            }
            path = uri.getPath();
            cursor.close();
            Logger.d("... content scheme:" + uri.getScheme() + "  and return:" + path);
            return path;
        } else {
            path = uri.getPath();
            Logger.d("... content scheme:" + uri.getScheme()
                    + " but the numbers of rows in the cursor is < 0:" + cursor.getCount()
                    + "  and return:" + path);
            return path;
        }
    } else {
        path = uri.getPath();
        Logger.d("... not content scheme:" + uri.getScheme() + "  and return:" + path);
        return path;
    }
}

public String getFileName(Uri uri, Context context) {
    if (uri == null) return null;
    if (uri.getScheme() == null) return null;
    Logger.d(">>> uri path:" + uri.getPath());
    Logger.d(">>> uri string:" + uri.toString());
    String path;
    if (uri.getScheme().equals("content")) {
        //Cursor cursor = context.getContentResolver().query(uri, new String[] {MediaStore.Images.ImageColumns.DATA}, null, null, null);
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        if (cursor == null) {
            Logger.e("!!! cursor is null");
            return null;
        }
        if (cursor.getCount() >= 0) {
            Logger.d("... the numbers of rows:" + cursor.getCount()
                    + "and the numbers of columns:" + cursor.getColumnCount());
            if (cursor.isBeforeFirst()) {
                while (cursor.moveToNext()) {
                    StringBuilder stringBuilder = new StringBuilder();
                    for (int i = 0; i<cursor.getColumnCount(); i++) {
                        stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
                        stringBuilder.append("\n");
                    }
                    Logger.d(stringBuilder.toString());
                }
            } else {
                cursor.moveToFirst();
                do {
                    StringBuilder stringBuilder = new StringBuilder();
                    for (int i = 0; i<cursor.getColumnCount(); i++) {
                        stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
                        stringBuilder.append("\n");
                    }
                    Logger.d(stringBuilder.toString());
                } while (cursor.moveToNext());
            }
            cursor.moveToFirst();
            path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME));
            cursor.close();
            Logger.d("... content scheme:" + uri.getScheme() + "  and return:" + path);
            return path;
        } else {
            path = uri.getLastPathSegment();
            Logger.d("... content scheme:" + uri.getScheme()
                    + " but the numbers of rows in the cursor is < 0:" + cursor.getCount()
                    + "  and return:" + path);
            return path;
        }
    } else {
        path = uri.getLastPathSegment();
        Logger.d("... not content scheme:" + uri.getScheme() + "  and return:" + path);
        return path;
    }
}

}

আমার ফাইলহেল্পার সম্পর্কে:

public class FileHelper {
private static final String DEFAULT_DIR_NAME = "AmoFromTaiwan";
private static final int DEFAULT_BUFFER_SIZE = 1024;
private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private static final int EOF = -1;
private static FileHelper INSTANCE = new FileHelper();

public static FileHelper getInstance() {
    return INSTANCE;
}

private boolean isExternalStorageWritable(Context context) {
    /*
    String state = Environment.getExternalStorageState();
    return Environment.MEDIA_MOUNTED.equals(state);
    */
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            Logger.e("!!! checkSelfPermission() not granted");
            return false;
        }
    } else { //permission is automatically granted on sdk<23 upon installation
        return true;
    }
}

private boolean isExternalStorageReadable(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            Logger.e("!!! checkSelfPermission() not granted");
            return false;
        }
    } else { //permission is automatically granted on sdk<23 upon installation
        return true;
    }
}

@SuppressLint("SimpleDateFormat")
private String generateFileNameBasedOnTimeStamp() {
    return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
}

public File createExternalFile(String dir_name, String file_name, Context context) {
    String dir_path;
    String file_path;
    File dir ;
    File file;
    if (!isExternalStorageWritable(context)) {
        Logger.e("!!! external storage not writable");
        return null;
    }
    if (dir_name == null) {
        dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
    } else {
        dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
    }
    Logger.d("... going to access an external dir:" + dir_path);
    dir = new File(dir_path);
    if (!dir.exists()) {
        Logger.d("... going to mkdirs:" + dir_path);
        if (!dir.mkdirs()) {
            Logger.e("!!! failed to mkdirs");
            return null;
        }
    }
    if (file_name == null) {
        file_path = dir_path + File.separator + generateFileNameBasedOnTimeStamp();
    } else {
        file_path = dir_path + File.separator + file_name;
    }
    Logger.d("... going to return an external dir:" + file_path);
    file = new File(file_path);
    if (file.exists()) {
        Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
        if (!file.delete()) {
            Logger.e("!!! failed to delete file");
            return null;
        }
    }
    return file;
}

public File createInternalFile(String dir_name, String file_name, Context context) {
    String dir_path;
    String file_path;
    File dir ;
    File file;
    if (dir_name == null) {
        dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
    } else {
        dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
    }
    dir_path = dir.getAbsolutePath();
    Logger.d("... going to access an internal dir:" + dir_path);
    if (!dir.exists()) {
        Logger.d("... going to mkdirs:" + dir_path);
        if (!dir.mkdirs()) {
            Logger.e("!!! mkdirs failed");
            return null;
        }
    }
    if (file_name == null) {
        file = new File(dir, generateFileNameBasedOnTimeStamp());
    } else {
        file = new File(dir, file_name);
    }
    file_path = file.getAbsolutePath();
    Logger.d("... going to return an internal dir:" + file_path);
    if (file.exists()) {
        Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
        if (!file.delete()) {
            Logger.e("!!! failed to delete file");
            return null;
        }
    }
    return file;
}

public File getExternalFile(String dir_name, String file_name, Context context) {
    String dir_path;
    String file_path;
    File file;
    if (!isExternalStorageWritable(context)) {
        Logger.e("!!! external storage not writable");
        return null;
    }
    if (dir_name == null) {
        dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
    } else {
        dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
    }
    if (file_name == null) {
        file_path = dir_path;
    } else {
        file_path = dir_path + File.separator + file_name;
    }
    Logger.d("... going to return an external file:" + file_path);
    file = new File(file_path);
    if (file.exists()) {
        Logger.d("... file exists:" + file.getAbsolutePath());
    } else {
        Logger.e("!!! file does't exist:" + file.getAbsolutePath());
    }
    return file;
}

public File getInternalFile(String dir_name, String file_name, Context context) {
    String file_path;
    File dir ;
    File file;
    if (dir_name == null) {
        dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
    } else {
        dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
    }
    if (file_name == null) {
        file = new File(dir.getAbsolutePath());
    } else {
        file = new File(dir, file_name);
    }
    file_path = file.getAbsolutePath();
    Logger.d("... going to return an internal dir:" + file_path);
    if (file.exists()) {
        Logger.d("... file exists:" + file.getAbsolutePath());
    } else {
        Logger.e("!!! file does't exist:" + file.getAbsolutePath());
    }
    return file;
}

private byte[] readBytesFromFile(File file) {
    Logger.d(">>> path:" + file.getAbsolutePath());
    FileInputStream fis;
    long file_length;
    byte[] buffer;
    int offset = 0;
    int next = 0;
    if (!file.exists()) {
        Logger.e("!!! file doesn't exists");
        return null;
    }
    if (file.length() > Integer.MAX_VALUE) {
        Logger.e("!!! file length is out of max of int");
        return null;
    } else {
        file_length = file.length();
    }
    try {
        fis = new FileInputStream(file);
        //buffer = new byte[(int) file_length];
        buffer = new byte[(int) file.length()];
        long time_start = System.currentTimeMillis();
        while (true) {
            Logger.d("... now next:" + next + " and offset:" + offset);
            if (System.currentTimeMillis() - time_start > 1000) {
                Logger.e("!!! left due to time out");
                break;
            }
            next = fis.read(buffer, offset, (buffer.length-offset));
            if (next < 0 || offset >= buffer.length) {
                Logger.d("... completed to read");
                break;
            }
            offset += next;
        }
        //if (offset < buffer.length) {
        if (offset < (int) file_length) {
            Logger.e("!!! not complete to read");
            return null;
        }
        fis.close();
        return buffer;
    } catch (IOException e) {
        e.printStackTrace();
        Logger.e("!!! IOException");
        return null;
    }
}

public byte[] readBytesFromFile(File file, boolean is_fis_fos_only) {
    if (file == null) return null;
    if (is_fis_fos_only) {
        return readBytesFromFile(file);
    }
    Logger.d(">>> path:" + file.getAbsolutePath());
    FileInputStream fis;
    BufferedInputStream bis;
    ByteArrayOutputStream bos;
    byte[] buf = new byte[(int) file.length()];
    int num_read;
    if (!file.exists()) {
        Logger.e("!!! file doesn't exists");
        return null;
    }
    try {
        fis = new FileInputStream(file);
        bis = new BufferedInputStream(fis);
        bos = new ByteArrayOutputStream();
        long time_start = System.currentTimeMillis();
        while (true) {
            if (System.currentTimeMillis() - time_start > 1000) {
                Logger.e("!!! left due to time out");
                break;
            }
            num_read = bis.read(buf, 0, buf.length); //1024 bytes per call
            if (num_read < 0) break;
            bos.write(buf, 0, num_read);
        }
        buf = bos.toByteArray();
        fis.close();
        bis.close();
        bos.close();
        return buf;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Logger.e("!!! FileNotFoundException");
        return null;
    } catch (IOException e) {
        e.printStackTrace();
        Logger.e("!!! IOException");
        return null;
    }
}

/**
 * streams (InputStream and OutputStream) transfer binary data
 * if to write a string to a stream, must first convert it to bytes, or in other words encode it
 */
public boolean writeStringToFile(File file, String string, Charset charset) {
    if (file == null) return false;
    if (string == null) return false;
    return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
}

public boolean writeBytesToFile(File file, byte[] data) {
    if (file == null) return false;
    if (data == null) return false;
    FileOutputStream fos;
    BufferedOutputStream bos;
    try {
        fos = new FileOutputStream(file);
        bos = new BufferedOutputStream(fos);
        bos.write(data, 0, data.length);
        bos.flush();
        bos.close();
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
        Logger.e("!!! IOException");
        return false;
    }
    return true;
}

/**
 * io blocks until some input/output is available.
 */
public boolean copy(File source, File destination) {
    if (source == null || destination == null) return false;
    Logger.d(">>> source:" + source.getAbsolutePath() + ", destination:" + destination.getAbsolutePath());
    try {
        FileInputStream fis = new FileInputStream(source);
        FileOutputStream fos = new FileOutputStream(destination);
        byte[] buffer = new byte[(int) source.length()];
        int len;
        while (EOF != (len = fis.read(buffer))) {
            fos.write(buffer, 0, len);
        }
        if (true) { //debug
            byte[] copies = readBytesFromFile(destination);
            if (copies != null) {
                int copy_len = copies.length;
                Logger.d("... stream read and write done for " + copy_len + " bytes");
            }
        }
        return destination.length() != 0;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

public void list(final String path, final String end, final List<File> files) {
    Logger.d(">>> path:" + path + ", end:" + end);
    File file = new File(path);
    if (file.isDirectory()) {
        for (File child : file.listFiles()){
            list(child.getAbsolutePath(), end, files);
        }
    } else if (file.isFile()) {
        if (end.equals("")) {
            files.add(file);
        } else {
            if (file.getName().endsWith(end)) files.add(file);
        }
    }
}

public String[] splitFileName(File file, String split) {
    String path;
    String ext;
    int lastIndexOfSplit = file.getAbsolutePath().lastIndexOf(split);
    if (lastIndexOfSplit < 0) {
        path = file.getAbsolutePath();
        ext = "";
    } else {
        path = file.getAbsolutePath().substring(0, lastIndexOfSplit);
        ext = file.getAbsolutePath().substring(lastIndexOfSplit);
    }
    return new String[] {path, ext};
}

public File rename(File old_file, String new_name) {
    if (old_file == null || new_name == null) return null;
    Logger.d(">>> old file path:" + old_file.getAbsolutePath() + ", new file name:" + new_name);
    File new_file = new File(old_file, new_name);
    if (!old_file.equals(new_file)) {
        if (new_file.exists()) { //if find out previous file/dir at new path name exists
            if (new_file.delete()) {
                Logger.d("... succeeded to delete previous file at new abstract path name:" + new_file.getAbsolutePath());
            } else {
                Logger.e("!!! failed to delete previous file at new abstract path name");
                return null;
            }
        }
        if (old_file.renameTo(new_file)) {
            Logger.d("... succeeded to rename old file to new abstract path name:" + new_file.getAbsolutePath());
        } else {
            Logger.e("!!! failed to rename old file to new abstract path name");
        }
    } else {
        Logger.d("... new and old file have the equal abstract path name:" + new_file.getAbsolutePath());
    }
    return new_file;
}

public boolean remove(final String path, final String end) {
    Logger.d(">>> path:" + path + ", end:" + end);
    File file = new File(path);
    boolean result = false;
    if (file.isDirectory()) {
        for (File child : file.listFiles()){
            result = remove(child.getAbsolutePath(), end);
        }
    } else if (file.isFile()) {
        if (end.equals("")) {
            result = file.delete();
        } else {
            if (file.getName().endsWith(end)) result = file.delete();
        }
    } else {
        Logger.e("!!! child is not file or directory");
    }
    return result;
}

@TargetApi(Build.VERSION_CODES.O)
public byte[] readNIOBytesFromFile(String path) throws IOException {
    Logger.d(">>> path:" + path);
    if (!Files.exists(Paths.get(path), LinkOption.NOFOLLOW_LINKS)) {
        Logger.e("!!! file doesn't exists");
        return null;
    } else {
        return Files.readAllBytes(Paths.get(path));
    }
}

@TargetApi(Build.VERSION_CODES.O)
public File writeNIOBytesToFile(String dir, String name, byte[] data) {
    Logger.d(">>> dir:" + dir + ", name:" + name);
    Path path_dir;
    Path path_file;
    try {
        if (!Files.exists(Paths.get(dir), LinkOption.NOFOLLOW_LINKS)) {
            Logger.d("... make a dir");
            path_dir = Files.createDirectories(Paths.get(dir));
            if (path_dir == null) {
                Logger.e("!!! failed to make a dir");
                return null;
            }
        }
        path_file = Files.write(Paths.get(name), data);
        return path_file.toFile();
    } catch (IOException e) {
        e.printStackTrace();
        Logger.e("!!! IOException");
        return null;
    }
}

@TargetApi(Build.VERSION_CODES.O)
public void listNIO(final String dir, final String end, final List<File> files) throws IOException {
    Logger.d(">>> dir:" + dir + ", end:" + end);
    Files.walkFileTree(Paths.get(dir), new FileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
            Logger.d("... file:" + dir.getFileName());
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
            Logger.d("... file:" + file.getFileName());
            if (end.equals("")) {
                files.add(file.toFile());
            } else {
                if (file.endsWith(end)) files.add(file.toFile());
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) {
            Logger.d("... file:" + file.getFileName());
            if (end.equals("")) {
                files.add(file.toFile());
            } else {
                if (file.endsWith(end)) files.add(file.toFile());
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
            Logger.d("... file:" + dir.getFileName());
            return FileVisitResult.CONTINUE;
        }
    });
}

/**
 * recursion
 */
private int factorial (int x) {
    if (x > 1) return (x*(factorial(x-1)));
    else if (x == 1) return x;
    else return 0;
}

}


-1

লোকেরা যা এখানে চিত্রগুলির সমাধানের সন্ধান করছে তা এখানে।

private Bitmap getBitmapFromUri(Uri contentUri) {
        String path = null;
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null);
        if (cursor.moveToFirst()) {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            path = cursor.getString(columnIndex);
        }
        cursor.close();
        Bitmap bitmap = BitmapFactory.decodeFile(path);
        return bitmap;
    }

-1

ফাইলের চিত্রটিওউপলোড = নতুন ফাইল (নতুন ইউআরআই (androidURI.toString ())); আপনি যদি বাহ্যিক স্টোরেজে এই ফাইল তৈরি করে থাকেন তবে তা কাজ করে।

উদাহরণস্বরূপ ফাইল: /// স্টোরেজ / এমুলেটেড / 0 / (কিছু ডিরেক্টরি এবং ফাইলের নাম)


-1

পাবলিক স্ট্রিং getRealPathFromURI (উরি ইউরি) {

    String result;
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    if (cursor == null) {
        result = uri.getPath();
        cursor.close();
        return result;
    }
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    result = cursor.getString(idx);
    cursor.close();
    return result;
}

তারপরে ইউআরআই থেকে ফাইল পেতে ব্যবহার করে:

        File finalFile = newFile(getRealPathFromURI(uri));

- আশা আপনাকে সহায়তা করতে পারে ----


1
নোট করুন যে এই কৌশলটি অ্যান্ড্রয়েড কিউ-তে নিষিদ্ধ করা হয়েছে You
CommonsWare

-1

নিম্নলিখিত কোড দ্বারা, আমি অ্যাডোব অ্যাপ্লিকেশন ভাগ করে নেওয়া পিডিএফ ফাইলটিকে একটি স্ট্রিম হিসাবে পেতে এবং অ্যান্ড্রয়েড অ্যাপ্লিকেশন পথে সংরক্ষণ করতে সক্ষম হয়েছি

Android.Net.Uri fileuri =
    (Android.Net.Uri)Intent.GetParcelableExtra(Intent.ExtraStream);

    fileuri i am getting as {content://com.adobe.reader.fileprovider/root_external/
                                        data/data/com.adobe.reader/files/Downloads/sample.pdf}

    string filePath = fileuri.Path;

   filePath I am gettings as root_external/data/data/com.adobe.reader/files/Download/sample.pdf

      using (var stream = ContentResolver.OpenInputStream(fileuri))
      {
       byte[] fileByteArray = ToByteArray(stream); //only once you can read bytes from stream second time onwards it has zero bytes

       string fileDestinationPath ="<path of your destination> "
       convertByteArrayToPDF(fileByteArray, fileDestinationPath);//here pdf copied to your destination path
       }
     public static byte[] ToByteArray(Stream stream)
        {
            var bytes = new List<byte>();

            int b;
            while ((b = stream.ReadByte()) != -1)
                bytes.Add((byte)b);

            return bytes.ToArray();
        }

      public static string convertByteArrayToPDF(byte[] pdfByteArray, string filePath)
        {

            try
            {
                Java.IO.File data = new Java.IO.File(filePath);
                Java.IO.OutputStream outPut = new Java.IO.FileOutputStream(data);
                outPut.Write(pdfByteArray);
                return data.AbsolutePath;

            }
            catch (System.Exception ex)
            {
                return string.Empty;
            }
        }

-2

ইমেজ ইউরি ফাইল করতে রূপান্তর করার জন্য @ জ্যাসেক কুইসিএইউ উত্তরটিতে এক্সটেনশন বেস

fun Uri.toImageFile(context: Context): File? {
    val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
    val cursor = context.contentResolver.query(this, filePathColumn, null, null, null)
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            val columnIndex = cursor.getColumnIndex(filePathColumn[0])
            val filePath = cursor.getString(columnIndex)
            cursor.close()
            return File(filePath)
        }
        cursor.close()
    }
    return null
}

আমরা যদি ব্যবহার File(uri.getPath())করি তবে এটি কার্যকর হবে না

এখানে চিত্র বর্ণনা লিখুন

যদি আমরা অ্যান্ড্রয়েড-কেটিএক্স থেকে এক্সটেনশন ব্যবহার করি তবে এটি এখনও খুব বেশি কার্যকর হয় না কারণ https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt


2
নোট করুন যে এই কৌশলটি অ্যান্ড্রয়েড কিউ-তে নিষিদ্ধ করা হয়েছে You আপনি আর DATAকলামটি অ্যাক্সেস করতে পারবেন না (এবং এটি প্রথম স্থানে একটি অবিশ্বাস্য পদ্ধতি ছিল)।
CommonsWare

-2

যোগ onActivityResult, পেয়ে DOCX, অথবা পিডিএফ ফাইল

var imageUriPath = ""
imageUriPath =
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val split = (imageUri.path ? : "").split(":") //split the path.
    split[1]
  } else {
    imageUri.path ? : ""
  }
val file = File(imageUriPath)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.