2015年1月27日

Android - 如何呼叫手機中已安裝的 APP 開啟任意檔案


隨著 3G 網路與智慧型手機的普及,已經越來越多人使用網路將資料傳送到手機查看。
但到底要如何在手機中開啟像 PDF, word 等檔案呢 ?
最簡單的方式... 就是交給系統判斷!由系統判斷這個檔案可以由那些 APP 開啟。
下面就來看看如何請系統幫我們列出可開啟檔案的 APP

實作

  1. 使用 endsWith() 取得檔案副檔名
  2. 設定 intent type ( type 請參照 MIME Type 列表 )
  3. startActivity 切換到開啟檔案的 app
    ※ 注意 ! 如果手機沒有可開啟檔案的程式,則會出現 ActivityNotFoundException

try {
 String filePath = vSDCard.getCanonicalPath() + File.separator + "Download" + File.separator + vlowerFileName;
 Intent intent = new Intent( Intent.ACTION_VIEW );
 File f1 = new File(filePath);
 if(f1.exists()){
  if(vlowerFileName.endsWith("mpg") || vlowerFileName.endsWith("mp4")){
      // 影片
      intent.setDataAndType(Uri.fromFile(f1), "video/*");
  }else if( vlowerFileName.endsWith("mp3") ){
      // 音樂
      intent.setDataAndType(Uri.fromFile(f1), "audio/*");
  }else if( vlowerFileName.endsWith("bmp") || vlowerFileName.endsWith("gif") || vlowerFileName.endsWith("jpg") || vlowerFileName.endsWith("png")){
      // 影像
      intent.setDataAndType(Uri.fromFile(f1), "image/*");
  }else if(vlowerFileName.endsWith("txt")){
      // 文字檔
      intent.setDataAndType (Uri.fromFile(f1), "text/plain");
  }else if( vlowerFileName.endsWith("apk") ){
      // Android APK
      intent.setDataAndType(Uri.fromFile(f1), "application/vnd.android.package-archive");
  }else if(vlowerFileName.endsWith("pdf")){
      //pdf
      intent.setDataAndType (Uri.fromFile(f1), "application/pdf");
  }else if(vlowerFileName.endsWith("docx") || vlowerFileName.endsWith("doc")){
      //doc
      intent.setDataAndType(Uri.fromFile(f1), "application/msword");
  }else if(vlowerFileName.endsWith("xlsx") || vlowerFileName.endsWith("xls")){
      //xls
      intent.setDataAndType (Uri.fromFile(f1), "application/vnd.ms-excel");
  }else if(vlowerFileName.endsWith("pptx") || vlowerFileName.endsWith("ppt")){
      //ppt
      intent.setDataAndType (Uri.fromFile(f1), "application/vnd.ms-powerpoint");
  }else{
      // 其他
      intent.setDataAndType( Uri.fromFile(f1), "application/*" );
  }
  //切換到開啟檔案的app,注意!如果手機沒有可開啟檔案的程式,則會出現ActivityNotFoundException
  startActivity(intent);
 }else{
  Log.i("ruby", f1.getCanonicalPath() + " file isn't exists");
 }
} catch (IOException e) {
 Toast.makeText(MainActivity.this, "找不到檔案", Toast.LENGTH_SHORT).show();
} catch (ActivityNotFoundException e) {
 //手機上沒有任何應用程式可開啟此檔
 Toast.makeText(MainActivity.this, "沒有任何APP可以開啟此檔案", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
 e.printStackTrace();
 Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show();
}

References