问:如何从Uri获得文件路径。请注意,没有特定的文件类型。用户可以从设备上可用的文件选择器列表中选择任何文件。
到目前为止我编码的内容
{
//File Pick Intent
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
try {
(context).startActivityForResult(
Intent.createChooser(intent, "Select a File to Upload"),
PICK_FILE);
}
catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(context, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
// On Activity Result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == PICK_FILE && resultCode == Activity.RESULT_OK) {
Uri uri = intent.getData();
String mimeType = getContentResolver().getType(uri);
Cursor returnCursor = getContentResolver().query(uri,null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
System.out.println("mime: "+ mimeType);
System.out.println("name: " + returnCursor.getString(nameIndex));
System.out.println("size: " + returnCursor.getString(sizeIndex));
// File Input Stream gets me file data
InputStream inputStream = getContentResolver().openInputStream(uri);
// Can create a file using this stream but I am looking for some better dolution that gives me file path instead
}
从意图返回的典型Uris是
1. { dat=content://com.google.android.apps.docs.storage/document/acc=1;doc=107 flg=0x1 }
2. { dat=file:///Removable/MicroSD/docs/doccuments.rar flg=0x3 }
3. { dat=content://media/external/audio/media/1110 }
4. { dat=content://com.android.externalstorage.documents/document/primary:.profig.os flg=0x1 }
现在我有了fileName,MimeType,fileSize &这是我的目的,但是
如何从内容提供者获得filePath而不是使用inputStream?
发布于 2016-08-11 07:30:50
您已经使用了正确的解决方案。通过获取文件路径,您可能会尝试直接读取文件,但是由于沙箱,在大多数情况下它都会失败。例如,如果文件位于另一个应用程序的app目录中。通过使用内容提供程序,其他应用程序可以向某些uris授予读取权限,这些uris允许您读取文件。
而且,在编写内容提供程序时,没有人强迫您导出文件路径。在内部,你必须处理它们,但从外部看,只有uris才重要。因此,作为提供者的使用者,您可以也不应该对文件路径做出任何假设。
https://stackoverflow.com/questions/38889645
复制相似问题