Android'de bir Amaç aracılığıyla her tür dosyayı seçin


98

Her tür dosyayı döndürebilen uygulamalar için bir intentchooser başlatmak istiyorum

Şu anda kullanıyorum (dosya eki için Android e-posta kaynak kodundan kopyaladım)

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

Ancak Galaxy S2 cihazımda yalnızca "Galeri" ve "Müzik çalar" görünüyor. Bu cihazda bir dosya gezgini var ve listede görünmesini istiyorum. Ayrıca kamera uygulamasının listede gösterilmesini istiyorum, böylece kullanıcı bir resim çekebilir ve bunu uygulamam aracılığıyla gönderebilir. Astro dosya yöneticisini kurarsam, bu amaca da yanıt verecektir. Müşterilerim yalnızca Galaxy SII sahipler ve zaten temel ancak yeterli bir dosya yöneticisine sahip oldukları için onları Astro dosya yöneticisini yüklemeye zorlamak istemiyorum.

Bunu nasıl başarabileceğime dair bir fikriniz var mı? Bir dosya seçmek için böyle bir menüde varsayılan dosya yöneticisinin göründüğünden oldukça eminim, ancak hangi uygulamada hatırlayamıyorum.


Bir resim çekmek ve ardından bir dosya seçmek için çok farklı bir koda ihtiyacınız olacak. Aslında çoğu dosya gezgininin bir dosya döndürebileceğini düşünmüyorum , ancak yanılıyor olabilirim.
dtech

Öncelikle ne tür dosyalara erişmeniz gerektiğini belirtebilir misiniz?
subrussn90

1
@dtech: Dosya gezgininin dosyayı döndürmesini beklemiyorum, sadece yoluna ihtiyacım var.
ErGo_404

@ subrussn90: Kullanıcının her tür dosyayı seçmesine izin vermem gerekiyor. PDF'ler, .doc, .zip, HERHANGİ bir tür dosya olabilir.
ErGo_404

SD kartta belirtilen dosyanın Uri'sini almanız yeterli mi ???
subrussn90

Yanıtlar:


89

Kamera için değil diğer dosyalar için ..

Cihazıma ES File Exploreryükledim ve bu sadece benim durumumda çalışıyor ..

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

5
Harici bir dosya gezgini ile çalışıyor (ES Dosya Gezgini veya Astro Dosya Yöneticisi gibi, ancak Samsung dosya gezgini ile çalışmıyor. Bu eyleme yanıt vermek için doğru amaç filtrelerini uygulamadıkları garip görünüyor.
ErGo_404

@Lukap - Açık kaynak android dosya yöneticisini kullanın ve uygulamanızla entegre edin, böylece herhangi bir üçüncü taraf uygulamasına ihtiyacınız kalmaz.
user370305

2
seçilen dosyayı nasıl alabilirim? Sanırım yol bu, ama nasıl?
Francisco Corrales Morales

1
@FranciscoCorralesMorales - in onActivityResult()- Dosyayı alabilirsiniz Uri.
user370305

1
PICKFILE_RESULT_CODEolmalıdır PICKFILE_REQUEST_CODE.
Aron Lorincz

50

Samsung dosya gezgini yalnızca özel eyleme ( com.sec.android.app.myfiles.PICK_DATA ) değil, aynı zamanda kategori bölümü (Amaç. CATEGORY_DEFAULT ) ve mime türünün de ekstra olarak aktarılması gerekir.

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

Bu eylemi birden çok dosyayı açmak için de kullanabilirsiniz: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE Her neyse, işte Samsung ve diğer cihazlarda çalışan çözümüm:

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

Bu çözüm benim için iyi çalışıyor ve belki başkası için yararlı olabilir.


SIntent'in başlatıldığında hiçbir türden dosyayı kabul etmemesi dışında, neredeyse benim için çalışıyor. Klasörlere göz atabilirim, ama hepsi bu.
Radu

Sorun şu ki, niyetin mimeType: "file / *" olması gerekirken, Samsung sIntent "* / *" gerektiriyor - * / *
Radu

1
Peki ya diğer 11k Android cihaz.
Oliver Dixon

1
Bu amaç için URI'yi nasıl ayarlayabilirsin lütfen bana yardım edebilir misin?
PriyankaChauhan

1
Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA") söz konusu olduğunda, String'e fazladan "FOLDERPATH" veya "START_FOLDER"
koymayı deneyebilirsiniz

42

bu galakside benim için çalışıyor, gösteri kişileri, cihaza yüklenen dosya yöneticileri, galeri, müzik çalar

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

burada onActivityResultfaaliyetin yolunu alın .

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

}

6
URI'yi util.file dosyasına dönüştürmek nasıl?
Anand Savjani


3
bir klasör nasıl seçilir?
hornet2319

9

Bu bana en iyi sonucu veriyor:

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

OnActivityResultCode @Islam Khaled
Kishan Donga

1
Üçüncü bir seçenek için ayrıca org.openintents.action.PICK_FILE'ye bakın. openintents.org/action/org-openintents-action-pick-file Kodunuz ayrıca bir Samsung telefonundaki herkesin kullandığını ve (hala) Samsung dosya yöneticisine sahip olduğunu varsayar. Geri dönüş olarak Samsung ile intent.resolveActivity kullanmak daha sağlam olacaktır.
Marcus Wolschon

1

Samsung dosya gezgininin özel bir eylem kullandığı ortaya çıktı. Bu nedenle, Samsung uygulamalarından bir dosya ararken Samsung dosya gezginini görebiliyordum, ancak benimkinden değil.

Eylem "com.sec.android.app.myfiles.PICK_DATA" şeklindedir

Her iki amacı da filtreleyen etkinlikleri görüntüleyen özel bir Etkinlik Seçici oluşturdum.


Merhaba, bunu biraz daha açıklar mısınız? Samsung galaxy telefonları için Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); ama bir hataya neden oluyor
steliosf

Şu anda emin değilim ama daha sonra kontrol edebilirim. Bence Etkinlik Bulunamadı istisnası. Çalışan bir çözümünüz var mı? Neredeyse her şeyi denedim ve düzeltmeyi başaramadım
steliosf

Bu niyet benim için Galaxy SII'de işe yaradı. Bir GT-B5510 (Galaxy Y Pro) üzerinde denedim ve işe yaramadı. Tüm Samsung cihazlarını hedeflemek istiyorsanız bunun güvenilir olmadığını düşünüyorum. Uygulamama bir açık kaynak dosya yöneticisini entegre ettim, ancak bu kadar temel bir ihtiyaç için ağır bir çözüm.
ErGo_404

Bu amaç için URI'yi nasıl ayarlayabilirsin lütfen bana yardım edebilir misin?
PriyankaChauhan

0

Bunu bilmek istiyorsanız, küçük ve kullanımı kolay bir dosya seçici sağlayan aFileDialog adında bir açık kaynak kitaplığı vardır .

Android için başka bir dosya seçicinin kitaplıklarından farkı, aFileDialog'un size dosya seçiciyi İletişim Kutusu ve Etkinlik olarak açma seçeneği sunmasıdır.

Ayrıca klasör seçmenize, dosyalar oluşturmanıza, normal ifadeler kullanarak dosyaları filtrelemenize ve onay iletişim kutularını göstermenize olanak tanır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.