2012-12-17 119 views
2

我想打開任何使用Intents的任意文件。但是,對於已安裝可打開應用程序的應用程序的文件類型,我得到ActivityNotFoundException。在下面的源代碼中,當file指向一個PNG文件時,我得到「完成操作使用」對話框。但是,當我試圖打開一個MP3時,我得到了異常。當我打開Astro並點擊相同的mp3文件時,我會看到顯示已安裝MP3播放器的「Complete action using」對話框。如何從我的代碼中獲得相同的對話框?當我從調試器檢查它們時,文件位置,擴展名和MIME類型都看起來正確。正確的意圖打開任意文件類型的操作

 String url = file.toURL().toString(); 
     String extension = MimeTypeMap.getFileExtensionFromUrl(url); 
     String type = typeMap.getMimeTypeFromExtension(extension); 
     mimeType.setText(type); 
     boolean fileExists = file.exists(); 
     Intent viewIntent = new Intent(Intent.ACTION_VIEW); 
     viewIntent.setData(Uri.fromFile(file)); 
     viewIntent.setType(type); 
     MainActivity.this.startActivity(viewIntent); 

答案是Intent.setTypeIntent.setData是互斥的。呼叫一個清除另一個。所以打電話setDataAndType是修復。

回答

2

試試這個:

 Intent newIntent = new Intent(); 
     newIntent.setDataAndType(Uri.parse("file://"+filePath),mimeType); 
     newIntent.setAction(Intent.ACTION_VIEW); 
     try { 

      startActivity(newIntent); 

     } catch (android.content.ActivityNotFoundException e) { 
      Toast.makeText(getApplicationContext(), "No handler for this type of file.", 4000).show(); 
     } 
+0

也許我失去了一些東西,但是這看起來是完全一樣的東西我已經在做。 –

+0

你可以發佈異常日誌嗎? –

+1

你的答案確實有效。不同之處在於你在調用'setData'和'setType'時分別調用'setDataAndType'。事實證明,這兩者是相互排斥的,即主張一方將清除另一方。它就在文檔中,也是:) –