2011-02-10 17 views
8

Po pierwsze, przepraszam, jeśli zostało to zadane, ale nie mogę go znaleźć. Pobierane dokumenty w mojej aplikacji pochodzą ze zdalnego źródła. Po pobraniu dokumentu chcę go otworzyć dla użytkownika. Co chcę wiedzieć, to jak mogę sprawdzić, czy mają aplikację do obsługi Pdf lub Tiff i uruchomić go w domyślnej aplikacji dla nich?Android: Otwórz zapisany plik w domyślnej aplikacji z mojej aplikacji

Dziękuję.

edit

tutaj jest częścią rozwiązania:

Intent viewDoc = new Intent(Intent.ACTION_VIEW); 
viewDoc.setDataAndType(
    Uri.fromFile(getFileStreamPath("test.pdf")), 
    "application/pdf"); 

PackageManager pm = getPackageManager(); 
List<ResolveInfo> apps = 
    pm.queryIntentActivities(viewDoc, PackageManager.MATCH_DEFAULT_ONLY); 

if (apps.size() > 0) 
    startActivity(viewDoc); 

Odpowiedz

7

Krok 1: Utwórz ACTION_VIEWIntent korzystając setDataAndType() dostarczenie Uri do pobranego pliku (np Uri.fromFile()) i typ MIME treści (np. application/pdf).

Stamtąd masz dwie opcje:

Krok 2a: Wpisz PackageManager i queryIntentActivities() z tym Intent. Jeśli zwróci listę o zerowej długości, oznacza to, że nie ma żadnych kandydatów, i dlatego może wyłączyć dowolne przyciski, opcje menu lub cokolwiek, co doprowadziłoby do wywołania startActivity() na tym .

lub

Krok 2b: Wystarczy zadzwonić startActivity() gdy użytkownik chce go zobaczyć i złapać wyjątek, który występuje, gdy brak jest obsługiwane aplikacje zainstalowane. Jest to prostsze niż powyższe # 2a, ale nie całkiem przyjazne dla użytkownika.

+0

Jeśli mam bajt [] pliku, ta metoda będzie nadal działać, jeśli nie chcę zrobić ve to na dysk? –

+0

@Tom Fobear: Nie masz wyboru, musisz tylko zapisać go na dysku, w miejscu, które może być odczytane przez inną aplikację. Oznacza to albo zapisanie jej w pamięci zewnętrznej, albo zapisanie jej jako pliku 'MODE_WORLD_READABLE' w lokalnym pliku plików aplikacji lub zapisanie go jako zwykłego pliku (deny-all) w lokalnym magazynie plików aplikacji i przy użyciu dostawcy treści aby udostępnić go innym aplikacjom. – CommonsWare

+0

Wystąpił problem. Na moim urządzeniu było wiele aplikacji, które twierdziły, że obsługują mój zamiar za pomocą metody PackageManager. Dowiedziałem się, że pliki zostały zapisane poprawnie. Na przykład, po pobraniu programu Adobe Reader mogłem wyświetlać pliki PDF, które uruchomiłem z mojej działalności. Czy istnieje lepsza metoda sprawdzania dobrych aplikacji poza możliwością wyboru kodowania? Dziękuję Ci. –

1

Poniższy kod może pomóc

kod

dla pliku
napisać ten kod, aby uzyskać adres URL pliku w funkcji głównej

File myFile = new File("your any type of file url"); 
FileOpen.openFile(mContext, myFile); 

kod, aby otworzyć domyślny program obecny w słuchawce tworzyć inna klasa

public class FileOpen { 
    public static void openFile(Context context, File url) throws IOException { 
     // Create URI 
     File file=url; 
     Uri uri = Uri.fromFile(file); 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     // Check what kind of file you are trying to open, by comparing the url with extensions. 
     // When the if condition is matched, plugin sets the correct intent (mime) type, 
     // so Android knew what application to use to open the file 
     if (url.toString().contains(".doc") || url.toString().contains(".docx")) { 
      // Word document 
      intent.setDataAndType(uri, "application/msword"); 
     } else if(url.toString().contains(".pdf")) { 
      // PDF file 
      intent.setDataAndType(uri, "application/pdf"); 
     } else if(url.toString().contains(".ppt") || url.toString().contains(".pptx")) { 
      // Powerpoint file 
      intent.setDataAndType(uri, "application/vnd.ms-powerpoint"); 
     } else if(url.toString().contains(".xls") || url.toString().contains(".xlsx")) { 
      // Excel file 
      intent.setDataAndType(uri, "application/vnd.ms-excel"); 
     } else if(url.toString().contains(".zip") || url.toString().contains(".rar")) { 
      // WAV audio file 
      intent.setDataAndType(uri, "application/x-wav"); 
     } else if(url.toString().contains(".rtf")) { 
      // RTF file 
      intent.setDataAndType(uri, "application/rtf"); 
     } else if(url.toString().contains(".wav") || url.toString().contains(".mp3")) { 
      // WAV audio file 
      intent.setDataAndType(uri, "audio/x-wav"); 
     } else if(url.toString().contains(".gif")) { 
      // GIF file 
      intent.setDataAndType(uri, "image/gif"); 
     } else if(url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) { 
      // JPG file 
      intent.setDataAndType(uri, "image/jpeg"); 
     } else if(url.toString().contains(".txt")) { 
      // Text file 
      intent.setDataAndType(uri, "text/plain"); 
     } else if(url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) { 
      // Video files 
      intent.setDataAndType(uri, "video/*"); 
     } else { 
      //if you want you can also define the intent type for any other file 

      //additionally use else clause below, to manage other unknown extensions 
      //in this case, Android will show all applications installed on the device 
      //so you can choose which application to use 
      intent.setDataAndType(uri, "*/*"); 
     } 

     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } 
} 
also u can write this if condition 
*** if(url.getPath().endsWith(".jpg") || url.getPath().endsWith(".jpeg")|| url.getPath().endsWith(".png")*** 
{ 
      intent.setDataAndType(uri,"image/*"); 
}* 
+0

Plz poinformował mnie, czy zadziałało, czy nie ... Dziękuję –

Powiązane problemy