26

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

一切正常,除了从 Google Drive 中选择文件时,我只能弄清楚如何将其作为输入流打开,但我想获得一个 java File 对象。

返回的内容 uri 如下所示: content://com.google.android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279

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

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

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

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

谢谢!

4

3 回答 3

39

好的。我发现正确的方法是将来自其他帖子的输入流与来自 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)

希望这对其他人有帮助。

于 2014-08-07T21:21:09.470 回答
3

Adding to @Keith Entzeroth answer , after getting fileName, fileSize and Input Stream , this is way to get the file

 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;
        }
    }
于 2020-08-14T05:59:01.500 回答
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();

    }
于 2017-09-26T16:20:46.047 回答