【发布时间】:2016-08-11 07:13:31
【问题描述】:
- 目标:使用 Intent 选择文件
- 用途:文件上传
问题:如何从 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
}
从 Intent 返回的典型 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 和 inputStream。这符合我的目的,但是
如何从内容提供者那里获取 filePath 而不是使用 输入流?
【问题讨论】:
-
你的
Uri uri = intent.getData();是什么? -
对问题进行了编辑。 @pskink
-
所以只有
file://方案的必须是物理文件,其他Uris可以是纯虚拟的:你必须使用InputStream读取它们
标签: android android-intent android-contentresolver