Scegli qualsiasi tipo di file tramite un Intent in Android


95

Vorrei avviare un intentchooser per le app che possono restituire qualsiasi tipo di file

Attualmente utilizzo (che ho copiato dal codice sorgente dell'email di Android per l'allegato)

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);

Ma mostra solo "Galleria" e "Lettore musicale" sul mio Galaxy S2. C'è un file explorer su questo dispositivo e vorrei che appaia nell'elenco. Vorrei anche che l'app della fotocamera fosse visualizzata nell'elenco, in modo che l'utente possa scattare una foto e inviarla tramite la mia app. Se installo il file manager Astro, risponderà anche a quell'intento. I miei clienti sono solo proprietari di Galaxy SII e non voglio costringerli a installare il file manager Astro dato che hanno già un file manager di base ma sufficiente.

Qualche idea su come avrei potuto ottenere questo risultato? Sono abbastanza sicuro di aver già visto il file manager predefinito apparire in un tale menu per scegliere un file, ma non ricordo in quale app.


Avrai bisogno di un codice molto diverso per scattare una foto e poi scegliere un file. In realtà non penso che la maggior parte degli esploratori di file possa restituire un file, ma potrei sbagliarmi.
dtech

puoi specificare quale tipo di file devi accedere principalmente?
subrussn90

1
@dtech: non mi aspetto che il file explorer restituisca il file, ho solo bisogno del suo percorso.
ErGo_404

@ subrussn90: devo consentire all'utente di scegliere qualsiasi tipo di file. Potrebbe essere pdf, .doc, .zip, QUALSIASI tipo di file.
ErGo_404

è sufficiente ottenere l'URI del file specificato sulla scheda SD ???
subrussn90

Risposte:


88

Non per la fotocamera ma per altri file ..

Nel mio dispositivo ho ES File Explorerinstallato e questa cosa semplicemente funziona nel mio caso ..

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);

5
Funziona con un esploratore di file esterno (come ES File Explorer o Astro File Manager, ma non con l'esploratore di file Samsung. Sembra strano che non abbiano implementato i filtri di intenti corretti per rispondere a tale azione.
ErGo_404

@Lukap - Usa il file manager Android open source e integralo con la tua applicazione, quindi non hai bisogno di alcuna applicazione di terze parti.
user370305

2
come posso ottenere il file selezionato? Immagino sia il percorso, ma come?
Francisco Corrales Morales

1
@FranciscoCorralesMorales - in onActivityResult()- Puoi ottenere Uriil file.
user370305

1
PICKFILE_RESULT_CODEdovrebbe essere PICKFILE_REQUEST_CODE.
Aron Lorincz

50

Il file explorer Samsung richiede non solo un'azione personalizzata ( com.sec.android.app.myfiles.PICK_DATA ), ma anche la parte della categoria (Intent. CATEGORY_DEFAULT ) e il tipo MIME dovrebbero essere passati come extra.

Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);

Puoi anche usare questa azione per aprire più file: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE Comunque ecco la mia soluzione che funziona su Samsung e altri dispositivi:

public void openFile(String mimeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(mimeType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // special intent for Samsung file manager
        Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
         // if you want any file type, you can skip next line 
        sIntent.putExtra("CONTENT_TYPE", mimeType); 
        sIntent.addCategory(Intent.CATEGORY_DEFAULT);

        Intent chooserIntent;
        if (getPackageManager().resolveActivity(sIntent, 0) != null){
            // it is device with Samsung file manager
            chooserIntent = Intent.createChooser(sIntent, "Open file");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
        } else {
            chooserIntent = Intent.createChooser(intent, "Open file");
        }

        try {
            startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
        }
    }

Questa soluzione funziona bene per me e forse sarà utile per qualcun altro.


Per me funziona quasi, tranne per il fatto che sIntent, una volta avviato, non accetta file di alcun tipo. Posso sfogliare le cartelle, ma è tutto.
Radu

Il problema è che l'intento deve avere mimeType: "file / *", mentre Samsung sIntent ha bisogno di "* / *" - senza gli spazi tra * / *
Radu

1
E gli altri 11k di dispositivi Android.
Oliver Dixon

1
Come impostare l'URI per questo intento puoi aiutarmi per favore?
PriyankaChauhan

1
In caso di Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA") puoi provare a mettere la stringa extra "FOLDERPATH" o "START_FOLDER"
Chupik

41

questo lavoro per me su Galaxy nota i suoi contatti dello spettacolo, file manager installati sul dispositivo, galleria, lettore musicale

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    startActivityForResult(intent, CODE);
}

qui ottieni il percorso onActivityResultdi attività.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String Fpath = data.getDataString();
    // do somthing...
    super.onActivityResult(requestCode, resultCode, data);

}

6
Come convertire ottenendo uri in util.File?
Anand Savjani

Non sono sicuro di ottenere java.io.File, ma può essere aperto con: developer.android.com/reference/android/content/... Come arrivare semplice nome è qui: stackoverflow.com/a/23270545/755313
demaksee

3
come scegliere una cartella?
hornet2319

6

Questo mi dà il miglior risultato:

    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }

Puoi condividere il tuo onActivityResultCode @Islam Khaled
Kishan Donga

1
Vedi anche org.openintents.action.PICK_FILE per una terza opzione. openintents.org/action/org-openintents-action-pick-file Il codice presume anche che tutti su un telefono Samsung utilizzino e abbiano (ancora) il file manager Samsung. L'utilizzo di intent.resolveActivity con Samsung come riserva sarebbe più robusto.
Marcus Wolschon

1

Risulta che il file explorer di Samsung utilizza un'azione personalizzata. Questo è il motivo per cui ho potuto vedere il file explorer Samsung quando cercavo un file dalle app Samsung, ma non dalla mia.

L'azione è "com.sec.android.app.myfiles.PICK_DATA"

Ho creato un selettore di attività personalizzato che mostra le attività che filtrano entrambi gli intenti.


Ciao, puoi spiegarci un po 'di più? Per i telefoni Samsung Galaxy utilizzo Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); ma provoca un errore
steliosf

Non ne sono sicuro in questo momento, ma posso controllarlo più tardi. Penso che sia l'eccezione Activity Not Found. Hai qualche soluzione funzionante? Ho quasi provato di tutto e non sono riuscito a risolverlo
steliosf

Questo intento ha funzionato per me sul Galaxy SII. L'ho provato su una GT-B5510 (Galaxy Y Pro) e non ha funzionato. Penso che non sia affidabile se vuoi scegliere come target tutti i dispositivi Samsung. Ho finito per integrare un file manager open source nella mia applicazione, ma è una soluzione pesante per un'esigenza così basilare.
ErGo_404

Come impostare l'URI per questo intento puoi aiutarmi per favore?
PriyankaChauhan

0

Se vuoi sapere questo, esiste una libreria open source chiamata aFileDialog che è piccola e facile da usare che fornisce un selettore di file.

La differenza con le librerie di un altro selettore di file per Android è che aFileDialog ti dà la possibilità di aprire il selettore di file come finestra di dialogo e come attività.

Consente inoltre di selezionare cartelle, creare file, filtrare file utilizzando espressioni regolari e mostrare finestre di dialogo di conferma.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.