Wybierz dowolny plik za pośrednictwem intencji w systemie Android

96

Chciałbym rozpocząć poszukiwanie intencji dla aplikacji, które mogą zwracać dowolny rodzaj pliku

Obecnie używam (który skopiowałem z kodu źródłowego e-maila na Androida do pliku załącznika)

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

Ale pokazuje tylko „Galerię” i „Odtwarzacz muzyki” na moim Galaxy S2. Na tym urządzeniu jest eksplorator plików i chciałbym, aby pojawił się na liście. Chciałbym również, aby aplikacja aparatu była wyświetlana na liście, aby użytkownik mógł zrobić zdjęcie i wysłać je przez moją aplikację. Jeśli zainstaluję menedżera plików Astro, zareaguje również na tę intencję. Moi klienci są tylko właścicielami Galaxy SII i nie chcę zmuszać ich do zainstalowania menedżera plików Astro, biorąc pod uwagę, że mają już podstawowego, ale wystarczającego menedżera plików.

Masz jakiś pomysł, jak mogłem to osiągnąć? Jestem prawie pewien, że widziałem już domyślnego menedżera plików pojawiającego się w takim menu, aby wybrać plik, ale nie pamiętam, w której aplikacji.

ErGo_404
źródło
Będziesz potrzebował zupełnie innego kodu, aby zrobić zdjęcie, a następnie wybrać plik. Nie sądzę, aby większość eksploratorów plików mogła zwrócić plik, ale mogę się mylić.
dtech
czy możesz określić, jakiego rodzaju pliki potrzebujesz przede wszystkim?
subrussn90
1
@dtech: Nie oczekuję, że eksplorator plików zwróci plik, potrzebuję tylko jego ścieżki.
ErGo_404
@ subrussn90: Muszę pozwolić użytkownikowi wybrać dowolny plik. Mogą to być pliki PDF, .doc, .zip, DOWOLNY rodzaj plików.
ErGo_404
czy wystarczy, że otrzymasz Uri podanego pliku na karcie SD ???
subrussn90

Odpowiedzi:

89

Nie dla aparatu, ale dla innych plików ...

W moim urządzeniu ES File Explorerzainstalowałem i to po prostu działa w moim przypadku ..

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
user370305
źródło
5
Działa z zewnętrznym eksploratorem plików (takim jak ES File Explorer lub Astro File Manager, ale nie z eksploratorem plików Samsung. Wydaje się dziwne, że nie zaimplementowali oni odpowiednich filtrów intencji, aby odpowiedzieć na to działanie.
ErGo_404
@Lukap - użyj menedżera plików Android o otwartym kodzie źródłowym i zintegruj go ze swoją aplikacją, a nie potrzebujesz żadnej aplikacji innej firmy.
user370305
2
jak mogę dostać wybrany plik? Myślę, że to ścieżka, ale jak?
Francisco Corrales Morales
1
@FranciscoCorralesMorales - in onActivityResult()- Możesz pobrać Uriplik.
user370305
1
PICKFILE_RESULT_CODEpowinno być PICKFILE_REQUEST_CODE.
Aron Lorincz
50

Eksplorator plików Samsung wymaga nie tylko niestandardowej akcji ( com.sec.android.app.myfiles.PICK_DATA ), ale również część kategorii (Intent. CATEGORY_DEFAULT ) i typ MIME powinny zostać przekazane jako dodatkowe.

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

Możesz również użyć tej akcji do otwarcia wielu plików: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE Tak czy inaczej, oto moje rozwiązanie, które działa na Samsungu i innych urządzeniach:

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

U mnie to rozwiązanie dobrze się sprawdza, a może komuś się przyda.

Chupik
źródło
U mnie prawie działa, z wyjątkiem faktu, że sIntent po uruchomieniu nie przyjmuje żadnego pliku żadnego typu. Mogę przeglądać foldery, ale to wszystko.
Radu
Problem polega na tym, że intencja musi mieć mimeType: "file / *", podczas gdy Samsung sIntent potrzebuje "* / *" - bez spacji między * / *
Radu,
1
A co z pozostałymi 11 tys. Urządzeń z Androidem.
Oliver Dixon
1
Jak ustawić URI dla tego celu, czy możesz mi pomóc?
PriyankaChauhan
1
W przypadku Samsung Intent („com.sec.android.app.myfiles.PICK_DATA”) możesz spróbować dodać ciąg znaków „FOLDERPATH” lub „START_FOLDER”
Chupik
41

to działa dla mnie na galaxy note jego kontakty pokazowe, menedżery plików zainstalowane na urządzeniu, galerię, odtwarzacz muzyki

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

tutaj uzyskaj ścieżkę onActivityResultdziałania.

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

}
alireza
źródło
6
Jak przekonwertować pobieranie URI do pliku util.File?
Anand Savjani
Nie jestem pewien co do pobrania
pliku
3
jak wybrać folder?
hornet2319
7

To daje mi najlepszy wynik:

    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
źródło
Czy możesz udostępnić swoje onActivityResultCode @Islam Khaled
Kishan Donga
1
Zobacz także org.openintents.action.PICK_FILE, aby zapoznać się z trzecią opcją. openintents.org/action/org-openintents-action-pick-file Twój kod zakłada również, że każdy użytkownik telefonu Samsung używa i (nadal) ma menedżera plików Samsung. Używanie metody intent.resolveActivity z Samsungiem jako rozwiązania zastępczego byłoby bardziej niezawodne.
Marcus Wolschon
1

Okazuje się, że eksplorator plików Samsung używa niestandardowej akcji. Dlatego podczas wyszukiwania pliku z aplikacji Samsunga mogłem zobaczyć eksplorator plików Samsunga, ale nie z mojego.

Akcja to „com.sec.android.app.myfiles.PICK_DATA”

Stworzyłem niestandardowy selektor działań, który wyświetla działania filtrujące oba intencje.

ErGo_404
źródło
Cześć, czy możesz to trochę wyjaśnić? W przypadku telefonów Samsung Galaxy używam Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); ale powoduje błąd
steliosf
W tej chwili nie jestem pewien, ale mogę to sprawdzić później. Myślę, że to wyjątek Activity Not Found. Czy masz jakieś działające rozwiązanie? Prawie próbowałem wszystkiego i nie udało mi się tego naprawić
steliosf
Ten zamiar zadziałał dla mnie w Galaxy SII. Wypróbowałem to na GT-B5510 (Galaxy Y Pro) i nie działało. Myślę, że nie jest to niezawodne, jeśli chcesz kierować reklamy na wszystkie urządzenia Samsunga. Skończyło się na integracji menedżera plików typu open source z moją aplikacją, ale jest to ciężkie rozwiązanie dla tak podstawowych potrzeb.
ErGo_404
Jak ustawić URI dla tego celu, czy możesz mi pomóc?
PriyankaChauhan
0

Jeśli chcesz to wiedzieć, istnieje biblioteka open source o nazwie aFileDialog, która jest mała i łatwa w użyciu, która zapewnia selektor plików.

Różnica w porównaniu z bibliotekami innego programu do wybierania plików dla systemu Android polega na tym, że aFileDialog daje możliwość otwarcia selektora plików jako okna dialogowego i działania.

Umożliwia także wybieranie folderów, tworzenie plików, filtrowanie plików za pomocą wyrażeń regularnych i wyświetlanie okien dialogowych z potwierdzeniem.

danigonlinea
źródło