Android dosya seçici [kapalı]


115

Bir dosya yükleyici yapmak istiyorum. Ve bu yüzden bir dosya seçiciye ihtiyacım var ama bunu kendi başıma yazmak istemiyorum. OI dosya yöneticisini buluyorum ve bana uygun olduğunu düşünüyorum. Ancak kullanıcıyı OI dosya yöneticisini yüklemeye nasıl zorlayabilirim? Yapamazsam, uygulamama bir dosya yöneticisi eklemenin daha iyi bir yolu var mı? Teşekkürler




Yanıtlar:


267

DÜZENLEME ( 02 Ocak 2012 ):

Bu süreci düzene sokan ve aynı zamanda yerleşik bir dosya gezgini sağlayan küçük bir açık kaynak Android Kitaplık Projesi oluşturdum (kullanıcının mevcut olmaması durumunda). Yalnızca birkaç satır kod gerektiren kullanımı son derece basittir.

Bunu GitHub: aFileChooser'da bulabilirsiniz .


ORİJİNAL

Kullanıcının sistemdeki herhangi bir dosyayı seçebilmesini istiyorsanız, kendi dosya yöneticinizi eklemeniz veya kullanıcıya bir dosyayı indirmesini önermeniz gerekir. Yapabileceğinizin en iyisinin şuna Intent.createChooser()benzer bir "açılabilir" içerik aramak olduğuna inanıyorum :

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

Seçili dosya var için Ardından dinleyeceğini Uride onActivityResult()şöyle:

@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()Benim yöntem FileUtils.javageçerli:

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
Hatta onları piyasadaki uygulamaya yönlendirecek kadar ileri gittim.
Kurtis Nusbaum

2
Ama FileUtils'i bulamıyorum ....
Ayı

2
@Bicou Not için teşekkürler. Dürtün tembelliği bırakıp bazı küçük değişiklikler yapmama yardımcı oldu. :-) Kütüphaneye lisansı içeren bir güncelleme gönderdim.
Paul Burke 04

23
Bu yanıt, uri'yi şu şekilde dikkate almaz: "content: //com.android.providers.media.documents/document/image: 62".
wangqi060934

2
@ wangqi060934: Böyle bir uri ile çalışmayı nasıl başardınız? işlevselliği elde etmek için lütfen deneyiminizi paylaşın
Mehul Joisar

-3

Bu amaçla AndExplorer'ı kullandım ve çözümüm bir iletişim kutusu açılır ve ardından eksik uygulamayı yüklemek için pazara yönlendirilir:

StartCreation'ım harici dosya / dizin seçiciyi çağırmaya çalışıyor. Eksikse, installResultMessage işlevini gösterin.

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

Bu yöntem sadece bir iletişim kutusu alır ve kullanıcı harici uygulamayı pazardan yüklemek isterse

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

Öyleyse, uygulama kullanıcılarınızın gereksinimlerinden biri ... AndExplorer'ı yüklemek mi ?!
Phantômaxx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.