我正在使用android 4.4的存储访问框架并打开文件选择器。
除了从GoogleDrive中选择一个文件外,其他一切都可以正常工作,我只能知道如何将其作为输入流打开,但我希望得到一个java文件对象。
返回的内容uri如下所示:content://com.google.android.apps.docs.storage/document/acc=4;doc=2279
其他问题类似,但没有一个有效的解决方案,允许我获取文件名、文件大小和内容:
我还调查了Paul Burke的文件选择器(https://github.com/iPaulPro/aFileChooser)这是问题清单上最常见的问题。
如何从该内容uri获取文件?
我目前的解决方法是从inputstream中写出一个临时文件。
谢谢!
这段代码解决了我的问题,当我试图从谷歌驱动器中选择图像时,应用程序崩溃了,
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();
}
在获取文件名、文件大小和输入流后,将其添加到@Keith Entzeroth answer,这是获取文件的方法
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;
}
}
好啊我发现正确的方法是将来自其他帖子的输入流与来自contentresolver的一些数据结合使用。
以下是难以找到的android文档供参考:https://developer.android.com/training/secure-file-sharing/retrieve-info.html
获取mimetype、文件名和文件大小的相关代码:
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)
希望这对其他人有帮助。
我是Android上存储访问框架的新手。 谢谢
基于@Nvico很棒的答案,我能够将文件上传到谷歌驱动器,问题是答案上的代码每次都会创建一个新文件,有没有办法给定一个已经创建的文件ID来直接更新其内容(使用文件:更新api)而不创建一个新的? 目前我的解决方案是使用文件:删除api每次我想更新文件以删除旧文件,然后使用@Nvico代码创建一个新文件
问题内容: 我无法在Google Container Engine中使用“应用程序默认凭据”。这些文档说,它们是为App Engine和Compute Engine设计的,但是有人告诉我,它们应该透明地传递给在Container Engine上运行的容器。 这是失败的代码: 失败的错误: 期望Application Default Credentials与Container Engine一起使用是
在Android4.4(KitKat)的新图库访问之前,我通过以下方法在SD卡上获得了我的真实路径: 现在,intent.action_get_content返回不同的数据: 我怎样才能获得SD卡上的真实路径?
我正在尝试打开一个现有文件,或者在外部使用SAF创建一个新文件,而用户不需要安装除我的apk之外的任何其他文件。 在我的Android10像素3上,ACTION_OPEN_DOCUMENT_TREE抛出一个异常,指示没有活动来处理这个(我想知道为什么会这样?)。 ACTION_OPEN_DOCUMENT和ACTION_CREATE_DOCUMENT似乎很合适。 但是,如果我: > 使用ACTION
我在一个应用程序上工作,我想访问“/存储/仿真/0/Android/媒体/com.whatsapp/WhatsApp/Media/.Statuses”来为我的应用程序获取状态文件夹中的数据。