如何从带有文件名的SD卡获取文件的实际路径?

时间:2015-02-23 14:59:07

标签: java android

我在sdcard" firmware.PTI"中有一个文件。我正在从我的应用程序浏览此文件。以下是我正在使用的代码。

 @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文件,那么它就会崩溃。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您必须检查getRealPathFromURI方法返回的内容,因为如果nullcontentUrinull未以path开头,则可能会返回file:// {1}}。

除此之外,在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;
    }