Java 如何使用文件名从SD卡获取文件的实际路径?
我在sdcard firmware.PTI中有一个文件。我正在从我的应用程序浏览此文件。下面是我正在使用的代码Java 如何使用文件名从SD卡获取文件的实际路径?,java,android,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
@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文件,那么它就会崩溃。如何解决此问题?您必须检查getRealPathFromURI方法返回的内容,因为如果contentUri为null或path不以file://开头,则该方法可能返回null 除此之外,在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;
}
它正在崩溃。什么时候?在哪个声明上?除了哪一个例外?请把航海日志寄出去。用户选择了哪个应用程序来选择文件?您正在使用此MediaStore.Images.Media.DATA,它用于图像文件。我们没有任何文件吗?@Vid你试过上面的吗?我知道什么是MediaStore.Images.Media.DATA,但我们对内容提供商的_DATA列特别感兴趣。如果MediaStore.Images.Media.DATA适合您,您可能需要在代码中硬编码此字符串。@tato.rodrigo谢谢