Android-Dateiauswahl [geschlossen]

115

Ich möchte einen Datei-Uploader erstellen. Und deshalb brauche ich eine Dateiauswahl, aber ich möchte das nicht selbst schreiben. Ich finde OI File Manager und ich denke, es passt zu mir. Aber wie kann ich den Benutzer zwingen, den OI-Dateimanager zu installieren? Wenn ich nicht kann, gibt es eine bessere Möglichkeit, einen Dateimanager in meine App aufzunehmen? Vielen Dank

Bär
quelle

Antworten:

267

BEARBEITEN ( 02. Januar 2012 ):

Ich habe ein kleines Open-Source-Android-Bibliotheksprojekt erstellt, das diesen Prozess rationalisiert und gleichzeitig einen integrierten Datei-Explorer bereitstellt (falls der Benutzer keinen hat). Es ist extrem einfach zu bedienen und erfordert nur wenige Codezeilen.

Sie finden es bei GitHub: aFileChooser .


ORIGINAL

Wenn Sie möchten, dass der Benutzer eine beliebige Datei im System auswählen kann, müssen Sie Ihren eigenen Dateimanager hinzufügen oder dem Benutzer empfehlen, eine herunterzuladen. Ich glaube, das Beste, was Sie tun können, ist, nach "zu öffnenden" Inhalten zu suchen 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();
    }
}

Sie würden dann hören Sie auf die ausgewählte Datei ist Uriin onActivityResult()etwa so:

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

Die getPath()Methode in meinem FileUtils.javaist:

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;
} 
Paul Burke
quelle
1
Ich würde sogar so weit gehen, sie auch auf die App auf dem Markt zu verweisen.
Kurtis Nusbaum
2
Aber ich kann FileUtils nicht finden ...
Bear
2
@Bicou Danke für den Hinweis. Ihr Schubs hat mir geholfen, nicht mehr faul zu sein und ein paar kleinere Änderungen vorzunehmen. :-) Ich habe gerade ein Update für die Bibliothek veröffentlicht, die die Lizenz enthält.
Paul Burke
22
Diese Antwort berücksichtigt die URL nicht wie folgt: "content: //com.android.providers.media.documents/document/image: 62".
Wangqi060934
2
@ wangqi060934: wie hast du es geschafft mit solchen uri zu arbeiten? Bitte teilen Sie Ihre Erfahrungen, um die Funktionalität zu erreichen
Mehul Joisar
-3

Ich habe AndExplorer für diesen Zweck verwendet und meine Lösung besteht darin, ein Dialogfeld zu öffnen und dann auf den Markt umzuleiten, um die Misssing-Anwendung zu installieren:

Mein startCreation versucht, eine externe Datei- / Verzeichnisauswahl aufzurufen. Wenn es fehlt, rufen Sie die Funktion show installResultMessage auf.

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

Diese Methode ist nur ein Dialog und wenn der Benutzer die externe Anwendung vom Markt installieren möchte

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();
}
andep
quelle
Eine der Anforderungen für Ihre App-Benutzer ist also ... AndExplorer installieren?!
Phantômaxx