使用KitKat存储访问框架后,打开Goog​​le Drive文件内容URI

我正在使用Android 4.4的存储访问框架,并打开文件select器。

除了从Google Drive中select文件时,一切都可以正常工作,我只能弄清楚如何将其作为inputstream打开,但是我想要一个java File对象。

正在返回的内容uri看起来像这样:content://com.google.android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279

其他类似的问题,但没有一个工作的解决scheme,让我得到的文件名,文件大小和内容:

  • 从URI获取真正的path,Android KitKat新的存储访问框架
  • KitKat上的Android图库为Intent.ACTION_GET_CONTENT返回不同的Uri

我也研究过Paul Burke的FileChooser( https://github.com/iPaulPro/aFileChooser ),这是这个问题列表中最常见的问题。

如何从这个内容中获得文件?

我目前的解决方法是从inputstream写出一个临时文件。

谢谢!

Solutions Collecting From Web of "使用KitKat存储访问框架后,打开Goog​​le Drive文件内容URI"

好。 我发现正确的方法是将来自其他post的inputstream与来自contentresolver的一些数据结合使用。

这里的参考是很难findAndroid文档: 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) 

希望这可以帮助别人。

此代码解决了我的问题,当我试图从谷歌驱动器select图像,应用程序崩溃,

  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(); }