Wählen Sie jede Art von Datei über eine Absicht in Android

95

Ich möchte einen Intentchooser für Apps starten, die jede Art von Datei zurückgeben können

Derzeit verwende ich (den ich aus dem Android-E-Mail-Quellcode für Dateianhänge kopiert habe)

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

Auf meinem Galaxy S2 werden jedoch nur "Galerie" und "Musik-Player" angezeigt. Auf diesem Gerät befindet sich ein Datei-Explorer, der in der Liste angezeigt werden soll. Ich möchte auch, dass die Kamera-App in der Liste angezeigt wird, damit der Benutzer ein Bild aufnehmen und es über meine App senden kann. Wenn ich den Astro-Dateimanager installiere, reagiert er auch auf diese Absicht. Meine Kunden sind nur Besitzer von Galaxy SII und ich möchte sie nicht zwingen, den Astro-Dateimanager zu installieren, da sie bereits über einen einfachen, aber ausreichenden Dateimanager verfügen.

Irgendeine Idee, wie ich das erreichen könnte? Ich bin mir ziemlich sicher, dass der Standard-Dateimanager bereits in einem solchen Menü angezeigt wurde, um eine Datei auszuwählen, aber ich kann mich nicht erinnern, in welcher App.

ErGo_404
quelle
Sie benötigen einen ganz anderen Code, um ein Bild aufzunehmen, als um eine Datei auszuwählen. Ich glaube nicht , eigentlich die meisten Datei Forscher können zurückkehren , eine Datei, aber ich könnte falsch sein.
dtech
Können Sie angeben, auf welche Art von Dateien Sie hauptsächlich zugreifen müssen?
subrussn90
1
@dtech: Ich erwarte nicht, dass der Datei-Explorer die Datei zurückgibt, ich brauche nur den Pfad.
ErGo_404
@ subrussn90: Ich muss den Benutzer jede Art von Datei auswählen lassen. Es kann sich um pdfs, .doc, .zip oder eine beliebige Art von Datei handeln.
ErGo_404
reicht es aus, dass du den Uri der angegebenen Datei auf der SD-Karte bekommst ???
subrussn90

Antworten:

88

Nicht für die Kamera, sondern für andere Dateien.

Auf meinem Gerät habe ich ES File Explorerinstalliert und das funktioniert einfach in meinem Fall ..

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
user370305
quelle
5
Es funktioniert mit einem externen Datei-Explorer (wie ES File Explorer oder Astro File Manager, aber nicht mit dem Samsung-Datei-Explorer. Es scheint seltsam, dass sie nicht die richtigen Absichtsfilter implementiert haben, um auf diese Aktion zu reagieren.
ErGo_404
@Lukap - Verwenden Sie den Open Source Android-Dateimanager und integrieren Sie ihn in Ihre Anwendung. Dann benötigen Sie keine Drittanbieteranwendung.
user370305
2
Wie kann ich die ausgewählte Datei erhalten? Ich denke, es ist der Weg, aber wie?
Francisco Corrales Morales
1
@FranciscoCorralesMorales - in onActivityResult()- Sie können Urivon der Datei erhalten.
user370305
1
PICKFILE_RESULT_CODEsollte sein PICKFILE_REQUEST_CODE.
Aron Lorincz
50

Der Samsung-Datei-Explorer benötigt nicht nur benutzerdefinierte Aktionen ( com.sec.android.app.myfiles.PICK_DATA ), sondern auch Kategorieteile (Intent. CATEGORY_DEFAULT ) und MIME-Typ sollten als Extra übergeben werden.

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

Sie können diese Aktion auch zum Öffnen mehrerer Dateien verwenden: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE Hier ist meine Lösung, die auf Samsung und anderen Geräten funktioniert:

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

Diese Lösung funktioniert gut für mich und ist möglicherweise für jemand anderen nützlich.

Chupik
quelle
Es funktioniert fast für mich, außer dass sIntent beim Start keine Datei jeglichen Typs akzeptiert. Ich kann Ordner durchsuchen, aber das war's.
Radu
Das Problem ist, dass die Absicht mimeType haben muss: "file / *", während das Samsung sIntent "* / *" benötigt - ohne die Leerzeichen zwischen * / *
Radu
1
Was ist mit den anderen 11k Android-Geräten?
Oliver Dixon
1
Wie können Sie mir bitte helfen, wenn Sie den URI für diese Absicht festlegen?
PriyankaChauhan
1
Im Falle von Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA") können Sie versuchen, String extra "FOLDERPATH" oder "START_FOLDER"
Chupik
41

Diese Arbeit für mich auf Galaxie beachten Sie seine Show-Kontakte, Dateimanager auf Gerät, Galerie, Musik-Player installiert

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

Hier erhalten Sie einen Weg in die onActivityResultAktivität.

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

}
Alireza
quelle
6
Wie konvertiere ich Uri in util.File?
Anand Savjani
Ich bin mir nicht sicher, ob ich java.io.File erhalten soll, kann aber geöffnet werden mit: developer.android.com/reference/android/content/… Wie man einen einfachen Namen erhält, erfahren
Sie
3
Wie wähle ich einen Ordner aus?
Hornet2319
6

Das gibt mir das beste Ergebnis:

    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);
    }
Islam Khaled
quelle
Können Sie Ihren onActivityResultCode @Islam Khaled
Kishan Donga
1
Siehe auch org.openintents.action.PICK_FILE für eine dritte Option. openintents.org/action/org-openintents-action-pick-file Ihr Code geht auch davon aus, dass jeder auf einem Samsung-Telefon den Samsung-Dateimanager verwendet und (noch) hat. Die Verwendung von intent.resolveActivity mit Samsung als Fallback wäre robuster.
Marcus Wolschon
1

Es stellt sich heraus, dass der Samsung-Datei-Explorer eine benutzerdefinierte Aktion verwendet. Aus diesem Grund konnte ich den Samsung-Datei-Explorer sehen, wenn ich nach einer Datei aus den Samsung-Apps suchte, aber nicht aus meiner.

Die Aktion lautet "com.sec.android.app.myfiles.PICK_DATA".

Ich habe eine benutzerdefinierte Aktivitätsauswahl erstellt, die Aktivitäten anzeigt, die beide Absichten filtern.

ErGo_404
quelle
Hallo, kannst du das etwas näher erläutern? Für Samsung Galaxy Telefone verwende ich Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); aber es verursacht einen Fehler
steliosf
Ich bin mir momentan nicht sicher, aber ich kann es später überprüfen. Ich denke, es ist die Ausnahme "Aktivität nicht gefunden". Haben Sie eine funktionierende Lösung? Ich habe fast alles versucht und es nicht geschafft, es zu reparieren
steliosf
Diese Absicht hat für mich auf dem Galaxy SII funktioniert. Versuchte es auf einem GT-B5510 (Galaxy Y Pro) und es hat nicht funktioniert. Ich denke, es ist einfach nicht zuverlässig, wenn Sie alle Samsung-Geräte ansprechen möchten. Am Ende habe ich einen Open Source-Dateimanager in meine Anwendung integriert, aber es ist eine schwere Lösung für solch ein Grundbedürfnis.
ErGo_404
Wie können Sie mir bitte helfen, wenn Sie den URI für diese Absicht festlegen?
PriyankaChauhan
0

Wenn Sie dies wissen möchten, gibt es eine Open-Source-Bibliothek namens aFileDialog , die klein und einfach zu verwenden ist und eine Dateiauswahl bietet.

Der Unterschied zu den Bibliotheken einer anderen Dateiauswahl für Android besteht darin, dass Sie mit aFileDialog die Option haben, die Dateiauswahl als Dialog und als Aktivität zu öffnen.

Außerdem können Sie Ordner auswählen, Dateien erstellen, Dateien mit regulären Ausdrücken filtern und Bestätigungsdialoge anzeigen.

danigonlinea
quelle
0

Die anderen Antworten sind nicht falsch. Jetzt gibt es jedoch mehr Optionen zum Öffnen von Dateien. Wenn Sie beispielsweise möchten, dass die App langfristig dauerhaft auf eine Datei zugreift, können Sie sie ACTION_OPEN_DOCUMENTstattdessen verwenden. Weitere Informationen finden Sie in der offiziellen Dokumentation: Öffnen Sie Dateien mit dem Storage Access Framework . Beziehen Sie sich auch auf diese Antwort .

Miloš Černilovský
quelle