当前位置: 首页 > 知识库问答 >
问题:

使用KitKat存储访问框架后打开Google驱动器文件内容URI

乌甫
2023-03-14

我正在使用android 4.4的存储访问框架并打开文件选择器。

除了从GoogleDrive中选择一个文件外,其他一切都可以正常工作,我只能知道如何将其作为输入流打开,但我希望得到一个java文件对象。

返回的内容uri如下所示:content://com.google.android.apps.docs.storage/document/acc=4;doc=2279

其他问题类似,但没有一个有效的解决方案,允许我获取文件名、文件大小和内容:

  • 从URI获取真实路径,Android KitKat新存储访问框架

我还调查了Paul Burke的文件选择器(https://github.com/iPaulPro/aFileChooser)这是问题清单上最常见的问题。

如何从该内容uri获取文件?

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

谢谢!

共有3个答案

公孙慎之
2023-03-14

这段代码解决了我的问题,当我试图从谷歌驱动器中选择图像时,应用程序崩溃了,

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

    }
冷英博
2023-03-14

在获取文件名、文件大小和输入流后,将其添加到@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;
        }
    }
仰雅昶
2023-03-14

好啊我发现正确的方法是将来自其他帖子的输入流与来自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”来为我的应用程序获取状态文件夹中的数据。