অ্যান্ড্রয়েড ফাইল চয়নকারী [বন্ধ]


115

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




উত্তর:


267

সম্পাদনা ( 02 জানুয়ারী 2012 ):

আমি একটি ছোট ওপেন সোর্স অ্যান্ড্রয়েড লাইব্রেরি প্রজেক্ট তৈরি করেছি যা এই প্রক্রিয়াটিকে প্রবাহিত করে, পাশাপাশি বিল্ট-ইন ফাইল এক্সপ্লোরারও সরবরাহ করে (ব্যবহারকারীর উপস্থিতি না থাকলে)। এটি ব্যবহার করা অত্যন্ত সহজ, কোডের কয়েকটি লাইনের প্রয়োজন।

আপনি এটি গিটহাব এ খুঁজে পেতে পারেন: aFileChooser


মূল

আপনি যদি চান যে ব্যবহারকারী সিস্টেমে কোনও ফাইল চয়ন করতে সক্ষম হন, আপনার নিজের ফাইল ম্যানেজারটি অন্তর্ভুক্ত করতে হবে, বা ব্যবহারকারীকে একটি ডাউনলোড করার পরামর্শ দিতে হবে। আমি বিশ্বাস করি যে আপনি সবচেয়ে ভাল করতে পারেন তা হ'ল "ওপেনযোগ্য" বিষয়বস্তুর সন্ধান করা Intent.createChooser():

private static final int FILE_SELECT_CODE = 0;

private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("*/*"); 
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select a File to Upload"),
                FILE_SELECT_CODE);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog
        Toast.makeText(this, "Please install a File Manager.", 
                Toast.LENGTH_SHORT).show();
    }
}

তারপর আপনি নির্বাচিত ফাইল জন্য শুনবে Uriমধ্যে onActivityResult()যেমন:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case FILE_SELECT_CODE:
        if (resultCode == RESULT_OK) {
            // Get the Uri of the selected file 
            Uri uri = data.getData();
            Log.d(TAG, "File Uri: " + uri.toString());
            // Get the path
            String path = FileUtils.getPath(this, uri);
            Log.d(TAG, "File Path: " + path);
            // Get the file instance
            // File file = new File(path);
            // Initiate the upload
        }
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

getPath()আমার পদ্ধতি FileUtils.javaহয়:

public static String getPath(Context context, Uri uri) throws URISyntaxException {
    if ("content".equalsIgnoreCase(uri.getScheme())) {
        String[] projection = { "_data" };
        Cursor cursor = null;

        try {
            cursor = context.getContentResolver().query(uri, projection, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow("_data");
            if (cursor.moveToFirst()) {
                return cursor.getString(column_index);
            }
        } catch (Exception e) {
            // Eat it
        }
    }
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;
} 

1
আমি এমনকি তাদের বাজারে অ্যাপ্লিকেশন পরিচালনার জন্য এতদূর যেতে চাই।
কুর্তিস নুসবাউম

2
কিন্তু আমি FileUtils খুঁজে পাচ্ছি না ....
বিয়ার

2
@ বিকাউ নোটের জন্য ধন্যবাদ। আপনার ন্যাজ আমাকে অলস হওয়া বন্ধ করতে এবং কিছু ছোটখাটো পরিবর্তন করতে সহায়তা করেছে। :-) আমি সবেমাত্র লাইব্রেরিতে একটি আপডেটকে ধাক্কা দিয়েছি যাতে লাইসেন্স অন্তর্ভুক্ত থাকে।
পল বার্ক

22
এই উত্তরটি এইভাবে ইউরি বিবেচনা করে না: "সামগ্রী: //com.android.provider.media.documents/docament/image: 62"।
wangqi060934

2
@ ওয়াংকী060934: আপনি কীভাবে এই জাতীয় ইউরি দিয়ে কাজ করবেন? কার্যকারিতা অর্জন করতে দয়া করে আপনার অভিজ্ঞতা ভাগ করুন
মেহুল জোয়েসার

-3

আমি এই উদ্দেশ্যে অ্যান্ড এক্সপ্লোরার ব্যবহার করেছি এবং আমার সমাধানটি একটি ডায়ালগের পপআপ এবং তারপরে মিসেস অ্যাপ্লিকেশনটি ইনস্টল করার জন্য বাজারে পুনঃনির্দেশ:

আমার স্টার্টক্রিয়েশন বাহ্যিক ফাইল / ডিরেক্টরি চয়নকারীকে কল করার চেষ্টা করছে। এটিতে যদি কল শোটি ইনস্টল করা হয় তবে রেজাল্টমেসেজ ফাংশনটি শো হয়।

private void startCreation(){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_PICK);
    Uri startDir = Uri.fromFile(new File("/sdcard"));

    intent.setDataAndType(startDir,
            "vnd.android.cursor.dir/lysesoft.andexplorer.file");
    intent.putExtra("browser_filter_extension_whitelist", "*.csv");
    intent.putExtra("explorer_title", getText(R.string.andex_file_selection_title));
    intent.putExtra("browser_title_background_color",
            getText(R.string.browser_title_background_color));
    intent.putExtra("browser_title_foreground_color",
            getText(R.string.browser_title_foreground_color));
    intent.putExtra("browser_list_background_color",
            getText(R.string.browser_list_background_color));
    intent.putExtra("browser_list_fontscale", "120%");
    intent.putExtra("browser_list_layout", "2");

    try{
         ApplicationInfo info = getPackageManager()
                                 .getApplicationInfo("lysesoft.andexplorer", 0 );

            startActivityForResult(intent, PICK_REQUEST_CODE);
    } catch( PackageManager.NameNotFoundException e ){
        showInstallResultMessage(R.string.error_install_andexplorer);
    } catch (Exception e) {
        Log.w(TAG, e.getMessage());
    }
}

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

private void showInstallResultMessage(int msg_id) {
    AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.setMessage(getText(msg_id));
    dialog.setButton(getText(R.string.button_ok),
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
    dialog.setButton2(getText(R.string.button_install),
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("market://details?id=lysesoft.andexplorer"));
                    startActivity(intent);
                    finish();
                }
            });
    dialog.show();
}

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