2015-02-23 131 views
0

我在SD卡「firmware.PTI」中有一個文件。而且我正在從我的應用程序瀏覽這個文件。以下是我正在使用的代碼。如何用文件名從SD卡獲取文件的實際路徑?

@Override 
     public void onClick(View v) { 

      int id = v.getId(); 

      switch (id) { 
      case R.id.btn_browse_pti_file: 

       Intent mediaIntent = new Intent(Intent.ACTION_GET_CONTENT); 
       mediaIntent.setType("*/*"); //set mime type as per requirement 
       startActivityForResult(mediaIntent, REQ_CODE_FOR_PTI); 
       break; 
      } 
     } 

     @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 

      if (requestCode == REQ_CODE_FOR_PTI && resultCode == Activity.RESULT_OK) { 
       Uri uriPTI = data.getData(); 
       String path = Utility.getRealPathFromURI(getActivity(), uriPTI); 
       Log.i(CLASSTAG, "PTI file path: "+path); 
       mTvBrowsePath.setText(path); 
      } 
     } 

public static String getRealPathFromURI(Context context, Uri contentUri) { 

     String path = null; 
     if (contentUri != null) 
     { 
      path = contentUri.toString(); 
      if (path.toLowerCase().startsWith("file://")) 
      { 
       // Selected file/directory path is below 
       path = (new File(URI.create(path))).getAbsolutePath(); 
      } 

     } 
     return path; 
    } 

如果我選擇任何其他文件,如JPEG或PNG,它工作正常,並顯示正確的路徑與文件名。但是,如果我選擇任何.PTI文件,那麼它會崩潰。我該如何解決這個問題?

+0

'它正在墜毀'。在哪一刻?在哪個聲明?哪個例外?請張貼logcat。用戶選擇哪個應用程序來選擇文件? – greenapps 2015-02-23 15:15:46

回答

0

你要檢查什麼方法getRealPathFromURI正在恢復,因爲它可能會返回null如果contentUrinull或者pathfile://啓動。

除此之外,這是一個更好的方法來檢查contentUri中的方案。以下是您的方法的更新版本。

public static String getRealPathFromURI(Context context, Uri uri) { 
     if("content".equalsIgnoreCase(uri.getScheme())) { 
      String[] projection = { MediaStore.Images.Media.DATA }; 
      Cursor cursor = null; 

      try { 
       cursor = context.getContentResolver().query(uri, projection, null, null, null); 
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
       if (cursor.moveToFirst()) { 
        return cursor.getString(column_index); 
       } 
      } catch (Exception e) { 
       // Eat it 
       e.printStackTrace(); 
      } finally { 
       if(cursor != null) { 
        cursor.close(); 
       } 
      } 
     } else if("file".equalsIgnoreCase(uri.getScheme())) { 
      return uri.getPath(); 
     } 
     return null; 
    } 
+0

您正在使用此「MediaStore.Images.Media.DATA」,它用於圖像文件。我們沒有任何文件的任何東西? – Vid 2015-02-24 06:31:12

+0

@Vid你有沒有試過以上?我知道'MediaStore.Images.Media.DATA'是什麼,但我們對內容提供者的「_data」列特別感興趣。如果'MediaStore.Images.Media.DATA'適用於您,那麼您可能需要在代碼中對此字符串進行硬編碼。 – 2015-02-24 11:19:13

+0

@ tato.rodrigo謝謝 – Vid 2015-02-24 12:20:54