Pilih jenis file apa pun melalui Intent di Android

95

Saya ingin memulai sebuah intentchooser untuk aplikasi yang dapat mengembalikan segala jenis file

Saat ini saya menggunakan (yang saya salin dari kode sumber email Android untuk lampiran file)

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

Tapi itu hanya menampilkan "Galeri" dan "Pemutar musik" di Galaxy S2 saya. Ada file explorer di perangkat ini dan saya ingin file itu muncul dalam daftar. Saya juga ingin aplikasi kamera ditampilkan dalam daftar, sehingga pengguna dapat mengambil gambar dan mengirimkannya melalui aplikasi saya. Jika saya menginstal file manager Astro, itu akan menanggapi maksud itu juga. Pelanggan saya adalah pemilik Galaxy SII saja dan saya tidak ingin memaksa mereka menginstal file manager Astro karena mereka sudah memiliki file manager dasar tetapi cukup.

Ada ide tentang bagaimana saya bisa mencapai ini? Saya cukup yakin bahwa saya sudah melihat pengelola file default muncul di menu seperti itu untuk memilih file, tetapi saya tidak ingat di aplikasi mana.

ErGo_404
sumber
Anda akan membutuhkan kode yang sangat berbeda untuk memotret kemudian memilih file. Saya sebenarnya tidak berpikir sebagian besar penjelajah file dapat mengembalikan file, tetapi saya mungkin salah.
dtech
dapatkah Anda menentukan jenis file apa yang terutama perlu Anda akses?
subrussn90
1
@dtech: Saya tidak berharap file explorer mengembalikan file, saya hanya perlu pathnya.
ErGo_404
@ subrussn90: Saya harus membiarkan pengguna memilih file apa pun. Ini bisa berupa pdf, .doc, .zip, APAPUN jenis file.
ErGo_404
apakah cukup bahwa Anda mendapatkan Uri dari file yang ditentukan pada kartu sd ???
subrussn90

Jawaban:

88

Bukan untuk kamera tapi untuk file lain ..

Di perangkat saya, saya telah ES File Explorermenginstal dan Ini hanya berfungsi dalam kasus saya ..

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
pengguna370305
sumber
5
Ia bekerja dengan file explorer eksternal (seperti ES File Explorer atau Astro File Manager, tetapi tidak dengan file explorer Samsung. Tampaknya aneh bahwa mereka tidak menerapkan filter maksud yang benar untuk menanggapi tindakan itu.
ErGo_404
@Lukap - Gunakan pengelola file android open source dan integrasikan dengan aplikasi Anda, maka Anda tidak memerlukan aplikasi pihak ketiga.
pengguna370305
2
bagaimana saya bisa mendapatkan file yang dipilih? Saya kira itu jalannya, tapi bagaimana caranya?
Francisco Corrales Morales
1
@FranciscoCorralesMorales - dalam onActivityResult()- Anda bisa mendapatkan UriFile.
pengguna370305
1
PICKFILE_RESULT_CODEseharusnya PICKFILE_REQUEST_CODE.
Aron Lorincz
50

File explorer Samsung tidak hanya membutuhkan tindakan kustom ( com.sec.android.app.myfiles.PICK_DATA ), tetapi juga bagian kategori (Intent. CATEGORY_DEFAULT ) dan jenis mime harus diteruskan sebagai ekstra.

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

Anda juga dapat menggunakan tindakan ini untuk membuka banyak file: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE Bagaimanapun, inilah solusi saya yang berfungsi pada Samsung dan perangkat lain:

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

Solusi ini bekerja dengan baik untuk saya, dan mungkin akan berguna untuk orang lain.

Chupik
sumber
Ini hampir berhasil untuk saya, kecuali fakta bahwa sIntent, saat diluncurkan, tidak menerima file jenis apa pun. Saya bisa menelusuri folder, tapi hanya itu.
Radu
Masalahnya adalah maksudnya harus memiliki mimeType: "file / *", sedangkan Samsung sIntent membutuhkan "* / *" - tanpa spasi antara * / *
Radu
1
Bagaimana dengan 11k perangkat Android lainnya.
Oliver Dixon
1
Bagaimana menyetel URI untuk maksud ini, bisakah Anda membantu saya?
PriyankaChauhan
1
Dalam kasus Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA") Anda dapat mencoba menambahkan String ekstra "FOLDERPATH" atau "START_FOLDER"
Chupik
41

ini berfungsi untuk saya di galaxy note, kontak acaranya, pengelola file yang diinstal pada perangkat, galeri, pemutar musik

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

di sini dapatkan jalur onActivityResultaktivitas.

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

}
alireza.dll
sumber
6
Bagaimana cara mengubah get uri menjadi util.File?
Anand Savjani
Tidak yakin tentang mendapatkan java.io.File, tetapi dapat dibuka dengan: developer.android.com/reference/android/content/… Cara mendapatkan nama sederhana ada di sini: stackoverflow.com/a/23270545/755313
demaksee
3
bagaimana cara memilih folder?
hornet2319
6

Ini memberi saya hasil terbaik:

    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
sumber
Dapatkah Anda membagikan onActivityResultCode Anda @Islam Khaled
Kishan Donga
1
Lihat juga org.openintents.action.PICK_FILE untuk opsi ketiga. openintents.org/action/org-openintents-action-pick-file Kode Anda juga mengasumsikan bahwa setiap orang di ponsel Samsung menggunakan dan (masih) memiliki manajer file Samsung. Menggunakan intent.resolveActivity dengan Samsung sebagai fallback akan lebih kuat.
Marcus Wolschon
1

Ternyata penjelajah file Samsung menggunakan tindakan kustom. Inilah sebabnya mengapa saya dapat melihat penjelajah file Samsung ketika mencari file dari aplikasi samsung, tetapi tidak dari milik saya.

Tindakannya adalah "com.sec.android.app.myfiles.PICK_DATA"

Saya membuat Activity Picker khusus yang menampilkan aktivitas yang memfilter kedua maksud.

ErGo_404
sumber
Hai, bisakah Anda menjelaskannya sedikit lagi? Untuk ponsel samsung galaxy saya menggunakan Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); tetapi menyebabkan kesalahan
steliosf
Saya tidak yakin sekarang, tapi saya bisa memeriksanya nanti. Saya pikir itu adalah pengecualian Aktivitas Tidak Ditemukan. Apakah Anda punya solusi yang berfungsi? Saya hampir mencoba segalanya dan tidak berhasil memperbaikinya
steliosf
Niat ini telah berhasil untuk saya di Galaxy SII. Sudah mencobanya pada GT-B5510 (Galaxy Y Pro) dan tidak berhasil. Saya pikir itu tidak dapat diandalkan jika Anda ingin menargetkan semua perangkat Samsung. Saya akhirnya mengintegrasikan pengelola file sumber terbuka ke dalam aplikasi saya, tetapi ini adalah solusi berat untuk kebutuhan dasar seperti itu.
ErGo_404
Bagaimana menyetel URI untuk maksud ini, bisakah Anda membantu saya?
PriyankaChauhan
0

Jika Anda ingin mengetahui hal ini, terdapat pustaka sumber terbuka yang disebut aFileDialog yang kecil dan mudah digunakan yang menyediakan pemilih file.

Perbedaan dengan pustaka pemilih file lain untuk Android adalah aFileDialog memberi Anda opsi untuk membuka pemilih file sebagai Dialog dan sebagai Aktivitas.

Ini juga memungkinkan Anda untuk memilih folder, membuat file, memfilter file menggunakan ekspresi reguler dan menampilkan dialog konfirmasi.

danigonlinea
sumber
0

Jawaban lainnya tidak salah. Namun, sekarang ada lebih banyak opsi untuk membuka file. Misalnya, jika Anda ingin aplikasi memiliki akses permanen dan jangka panjang ke sebuah file, Anda dapat menggunakan ACTION_OPEN_DOCUMENT. Lihat dokumentasi resmi: Buka file menggunakan kerangka akses penyimpanan . Lihat juga jawaban ini .

Miloš Černilovský
sumber