2011-02-10 16 views
8

Prima di tutto, scusa se è stato chiesto ma non riesco a trovarlo. Sto scaricando i documenti nella mia app da una risorsa remota. Una volta scaricato il documento, voglio aprirlo per l'utente. Quello che voglio sapere è come posso verificare se hanno un'applicazione per gestire Pdf o Tiff e avviarla nell'applicazione predefinita per loro?Android: Apri il file salvato nell'app predefinita dalla mia app

Grazie.

modificare

qui è parte della soluzione:

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

risposta

7

Passo # 1: Creare un ACTION_VIEWIntent, utilizzando setDataAndType() per fornire un Uri al file scaricato (ad esempio, Uri.fromFile()) e il tipo MIME del contenuto (ad esempio, application/pdf).

Da lì, si hanno due opzioni:

Passo 2a: Utilizzare PackageManager e queryIntentActivities() con quella Intent. Se restituisce un elenco di lunghezza zero, sai che non ci sono candidati, e quindi può disabilitare qualsiasi pulsante, scelta di menu, o qualsiasi altra cosa che porterebbe a chiamare startActivity() su quello Intent.

o

Passo 2b: Basta chiamare startActivity() quando l'utente vuole vederlo, e intercettare l'eccezione che si verifica quando non ci sono app supportate installate. Questo è più semplice di # 2a sopra, ma non abbastanza user-friendly.

+0

Se ho un byte [] del file questo metodo funziona ancora se non desidero ce l'ho sul disco? –

+0

@Tom Fobear: non hai altra scelta che salvarlo su disco, in un posto che può essere letto dall'altra applicazione. Ciò significa memorizzarlo nella memoria esterna o archiviarlo come un file 'MODE_WORLD_READABLE' nell'archivio locale dell'app-app, oppure archiviarlo come un normale file (deny-all) nell'archivio locale dell'app-app e utilizzare un content provider per renderlo disponibile ad altre app. – CommonsWare

+0

Si è verificato un problema. Sul mio dispositivo c'erano più app che affermavano di supportare il mio intento utilizzando il metodo PackageManager. Ho scoperto che i file stavano salvando correttamente. Ad esempio, una volta scaricato il lettore Adobe ho potuto visualizzare i pdf che ho lanciato dalla mia attività. Esiste un metodo più legittimo per controllare le buone app oltre a quelle possibili per l'hardcoding? Grazie. –

1

Il codice seguente potrebbe aiutare

codice

per il file
scrivere questo codice per ottenere l'url del file in funzione principale

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

codice per aprire applicazione predefinita presente nel portatile creare un'altra classe

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 fammi sapere se ha funzionato o no ... Grazie –

Problemi correlati