2012-06-17 17 views
20

Buradaki tüm benzer soruları inceledim, ama hayatım boyunca yanlış yaptığım şeyi anlayamıyorum.Dosya ve MIME türü için bir amaç başlatılıyor mu?

Çeşitli dosyaları, bir dosya tarayıcısının türünü başlatmaya çalışan bir uygulama yazdım. Bir dosya tıklandığında, ilgili MIME türüne göre programı başlatmaya çalışır veya "Başlatılacak Uygulamayı Seçin" iletişim kutusunu gösterir. İşte

Ben başlatmak için kullanıyorum kodu:

File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position)); 

    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); 

    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); 
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    myIntent.setDataAndType(Uri.fromFile(file),mimetype); 
    startActivity(myIntent); 

Bu başarısız olur ve hata oluşturur: Ben mesela OI Dosya Yöneticisi yüklerseniz Şimdi

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes } 

, bu yerine açılır atılan hata ve aynı dosyayı içinde içinden tıklarsam, ilgili iletişim kutularını başlatır.

O dosya için MIME türünün başarısız olduğunu fark ettim, ancak .zip gibi diğer mime türleri de değer döndürüyor.

MIME türü, kullanıcının seçmesine izin veren bir iletişim kutusunu çağırmak için null olduğunda bir şey eksik mi?

MIME türünü ayarlama ve yalnızca .setData'u kullanarak başarıyı uygulama da dahil olmak üzere, uygulamayı başlatmanın diğer varyasyonlarını denedim.

Olmak istediğim işlem, bir kullanıcı bir uygulamayı tıklarsa, bir uygulama uygulamanın başlattığı bir uygulamala ilişkilendirilmişse, kullanıcı bir uygulama listesiyle "İşlemi tamamla" iletişim kutusunu alır.

Her türlü öneriniz için teşekkürler.

+0

mimetype dizgisinde ne var? Burada yapıştırın –

+0

İlişkili bir dosyaya sahip bir şey doğru MIME türü gibi görünüyor, ancak bir uygulamaya bağlı olmayan bir şey varsa, bu, null aracılığıyla gelir .. – stonedonkey

cevap

44

Çok teşekkürler, cevabı kendi dosya yöneticisi kendi kodu ile ilk kez cevapsız, burada ben ile sona erdi budur:

File file = new File(filePath); 
    MimeTypeMap map = MimeTypeMap.getSingleton(); 
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); 
    String type = map.getMimeTypeFromExtension(ext); 

    if (type == null) 
     type = "*/*"; 

    Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri data = Uri.fromFile(file); 

    intent.setDataAndType(data, type); 

    startActivity(intent); 

Eğer "*/*" zaman bir mim türü kullanırsanız Bunu sistemden belirleyemezsiniz (null) uygun seçme uygulama diyaloğunu başlatır.

+7

UYARI! - jpgs için, mim türü jpeg ve Jpg DEĞİLDİR. Kodunuzu kullanarak jpg uzantısını çıkarırsanız, mime türünü doğru şekilde ayarlamaz ve sonuç olarak görüntüyü göremezsiniz. Jpg görüntüleri için mime türünü ayarlarken jpg'yi jpeg ile değiştirdiğinizden emin olun. – AndroidDev

+0

teşekkürler bana yardım ancak intent.setDataAndType (veri, tür) ayarlandıktan sonra gerçek dosya seçici seçilmedi; dosya yükleme başarısız. –

+1

Ayrıca, MimeTypeMap.getFileExtensionFromUrl, kesme işaretlerini iyi işleyemez: "WorldHello.docx" için boş bir dize döndürecektir, ancak "WorldzHello.docx" için docx döndürecektir. Bakınız Regex Burada: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

Sen here önerilmektedir bu pasajı kodu gibi dosyaları açmak için jenerik niyet kullanabilirsiniz:

private void openFile(File aFile){ 
    try { 
     Intent myIntent = new Intent(android.content.Intent.VIEW_ACTION, 
     new ContentURI("file://" + aFile.getAbsolutePath())); 
     startActivity(myIntent); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
}  

Ama genellikle Uygulamaları "ile dosyayı açmaya iç içe nihayet eğer ve dosyanın uzantısını denetler görüyoruz metin/düz "türü:

Intent generic = new Intent(); 
generic.setAction(android.content.Intent.ACTION_VIEW); 
generic.setDataAndType(Uri.fromFile(file), "text/plain");  
try { 
    startActivity(generic); 
    } catch(ActivityNotFoundException e) { 
    ... 
}  

Sen this question veya bu open source project tam kodunu görebilirsiniz. Umarım bu sana yardımcı olur. Açık Niyet adamlara

+0

Bu ikisi de denedim. sonuç arıyorum. İlk örnek, aynı istisna oluşturur. İkinci seçenek, yalnızca metin/düzeyi bir mime türü olarak anlatan uygulamaları başlatmayı dener; Yine de teşekkürler. – stonedonkey

İlgili konular