2015-02-23 130 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