2012-06-17 13 views
20

Przejrzałem wszystkie podobne pytania tutaj, ale nie mogę do końca życia zrozumieć, co robię źle.Uruchamianie intencji dla pliku i typu MIME?

Napisałem aplikację, która próbuje uruchomić różne pliki, sortując przeglądarkę plików. Po kliknięciu pliku, próbuje uruchomić program na podstawie skojarzonego typu MIME lub wyświetla okno dialogowe "Wybierz aplikację do uruchomienia".

Oto kod używam do uruchomienia:

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

nie to i generuje błąd:

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

Teraz, jeśli mogę zainstalować OI File Manager na przykład, otwiera zamiast tego zgłaszany błąd, a następnie, jeśli kliknę ten sam plik wewnątrz niego, uruchamia odpowiednie okna dialogowe.

Zauważyłem, że typ MIME dla tego konkretnego pliku kończy się niepowodzeniem, ale inne typy MIME, takie jak .zip, zwracają wartości.

Czy brakuje mi czegoś, co gdy typ MIME ma wartość null, wywołuje okno dialogowe, które pozwala użytkownikowi wybrać?

Próbowałem innych wariantów uruchamiania aplikacji, w tym nie ustawiania typu MIME i tylko przy użyciu .setData bez powodzenia.

Czynność, którą chcę wykonać, to kliknięcie pliku przez użytkownika, jeśli jest on powiązany z aplikacją, która uruchamia się w aplikacji, a jeśli nie, użytkownik uzyskuje okno dialogowe "Pełna operacja przy użyciu" z listą aplikacji.

Dzięki za radę.

+0

co nadchodzi w ciągu MIME? wklej go tutaj –

+0

Wygląda na to, że jeśli jest to coś, co ma skojarzony plik, to jest poprawny typ MIME, ale jeśli jest to coś, co nie jest związane z aplikacją, przechodzi przez zero .. – stonedonkey

Odpowiedz

44

Well dzięki Otwarte intencyjne facetów, brakowało mi odpowiedzieć za pierwszym razem ich kodu w swoim menedżerze plików, oto co skończyło się z:

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

Jeśli używasz typu MIME "*/*" kiedy nie można go ustalić z systemu (jest to null), uruchamia odpowiednie okno dialogowe wybranej aplikacji.

+7

OSTRZEŻENIE! - W jpgs typ mime to jpeg, a NIE jpg. Jeśli użyjesz swojego kodu, jeśli wyciągniesz rozszerzenie JPG, nie ustawisz poprawnie typu MIME, w wyniku czego nie będziesz mógł oglądać obrazu. Podczas ustawiania typu MIME dla obrazów jpg należy pamiętać o zamianie jpg na jpeg. – AndroidDev

+0

dzięki jego pomocy, ale rzeczywisty plik nie wybiera po ustawieniu intent.setDataAndType (dane, typ); nie udało się przesłać pliku. –

+1

Ponadto, MimeTypeMap.getFileExtensionFromUrl nie może dobrze obsługiwać apostrofów: zwróci pusty ciąg znaków dla "World'sHello.docx", ale zwróci dokument "WorldzHello.docx". Zobacz Regex tutaj: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

Można użyć zamiary generycznych do otwierania plików, jak ten fragment kodu, który jest proponowany here:

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

Ale zwykle widać, że Aplikacja sprawdza rozszerzenia pliku w zagnieżdżona czy wreszcie próby otwarcia pliku z " text/plain "typ:

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

można zobaczyć pełny kod this question lub w tym open source project. Mam nadzieję, że ci to pomoże.

+0

Próbowałem obu tych i żadnych wyników w wynik szukam. Pierwszy przykład generuje ten sam wyjątek. Druga próbuje uruchomić tylko aplikacje, które rozumieją tekst/zwykły jako typ mime, więc to też nie zadziała. Dzięki. – stonedonkey

Powiązane problemy