我正在使用Android 4.4的存储访问框架并打开文件选择器。
除了从Google云端硬盘中选择文件外,一切正常,我只能弄清楚如何将其作为输入流打开,但我想获得一个java文件对象。
返回的内容uri如下所示:content://com.google.android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279
其他类似的问题,但没有一个可以让我获取文件名,文件大小和内容的工作解决方案:
我还研究了Paul Burke的FileChooser(https://github.com/iPaulPro/aFileChooser),这是该问题列表中最常见的问题。
如何从该内容获取文件?
我目前的解决方法是从输入流写出一个临时文件。
谢谢!
答案 0 :(得分:34)
确定。我发现正确的方法是使用来自其他帖子的输入流以及来自contentresolver的一些数据。
这里有参考,很难找到Android文档:https://developer.android.com/training/secure-file-sharing/retrieve-info.html
获取mimetype,filename和filesize的相关代码:
Uri returnUri = returnIntent.getData();
String mimeType = getContentResolver().getType(returnUri);
Cursor returnCursor =
getContentResolver().query(returnUri, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
TextView nameView = (TextView) findViewById(R.id.filename_text);
TextView sizeView = (TextView) findViewById(R.id.filesize_text);
nameView.setText(returnCursor.getString(nameIndex));
sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));
获取文件内容:
getContentResolver().openInputStream(uri)
希望这有助于其他人。
答案 1 :(得分:2)
添加到@Keith Entzeroth答案中,获得 fileName , fileSize 和 Input Stream 后,这是获取文件的方法
public static File getFile(final Context context, final Uri uri) {
Log.e(TAG,"inside getFile==");
ContentResolver contentResolver = context.getContentResolver();
try {
String mimeType = contentResolver.getType(uri);
Cursor returnCursor =
contentResolver.query(uri, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
String fileName = returnCursor.getString(nameIndex);
String fileSize = Long.toString(returnCursor.getLong(sizeIndex));
InputStream inputStream = contentResolver.openInputStream(uri);
File tempFile = File.createTempFile(fileName, "");
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copyStream(inputStream,out);
return tempFile;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
答案 2 :(得分:0)
此代码解决了我的问题,当我尝试从谷歌驱动器中选择图片时,应用程序崩溃了,
private void setImagePath(Intent data) throws Exception {
String wholeID="";
Uri selectedImage = data.getData();
if(Build.VERSION.SDK_INT<=Build.VERSION_CODES.JELLY_BEAN_MR2){
wholeID=getUriPreKitkat(selectedImage);
}else {
wholeID = DocumentsContract.getDocumentId(selectedImage);
}
// Split at colon, use second item in the array
Log.i("debug","uri google drive "+wholeID);
String id = wholeID.split(":")[1];
String[] column = {MediaStore.Images.Media.DATA};
// where id is equal to
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = getActivity().getContentResolver().
query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, new String[]{id}, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
}