【问题标题】:Get File from Google drive using Intent使用 Intent 从 Google 驱动器获取文件
【发布时间】:2018-12-07 13:19:28
【问题描述】:

我正在尝试从我的应用上传文档。

一切正常,但是当我从驱动器中选择文件时。

data=Intent { act=android.intent.action.VIEW dat=content://com.google.android.apps.docs.storage.legacy/enc=ckpgt5KcEEF_JYniJQafRV_5pEnu_D5UAI1WF-Lu6h2Z_Vw4
     (has extras) }}

任何人都知道如何处理这个文件吗?

我已经处理了所有文件和图像,只面临谷歌驱动文件的问题。

我在意图数据 Uri 中得到了这个 content://com.google.android.apps.docs.storage.legacy/enc=ckpgt5KcEEF_JYniJQafRV_5pEnu_D5UAI1WF-Lu6h2Z_Vw4

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    当通过文件选择器选择时,处理由 Google-Drive 文件接收的Uri

    如前所述,它接收 Virtual File Uri

    我发现这个示例代码简单易懂。 给定的代码示例对我有用。希望它适用于您的情况。

    1.所以检测到这个Uri被google drive接收了。

    public static File getFileFromUri(final Context context, final Uri uri) throws Exception {
    
    if (isGoogleDrive(uri)) // check if file selected from google drive
    { 
      return saveFileIntoExternalStorageByUri(context, uri);
    }else 
        // do your other calculation for the other files and return that file
       return null;
    }
    
    
    public static boolean isGoogleDrive(Uri uri)
    {
     return "com.google.android.apps.docs.storage.legacy".equals(uri.getAuthority());
    }
    

    2.如果是,则将uri存储到外部路径(此处您可以根据需要更改它的根目录)并创建带有该uri的文件。

     public static File saveFileIntoExternalStorageByUri(Context context, Uri uri) throws 
    
    Exception {
            InputStream inputStream = context.getContentResolver().openInputStream(uri);
            int originalSize = inputStream.available();
    
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
            String fileName = getFileName(context, uri);
            File file = makeEmptyFileIntoExternalStorageWithTitle(fileName);
            bis = new BufferedInputStream(inputStream);
            bos = new BufferedOutputStream(new FileOutputStream(
                    file, false));
    
            byte[] buf = new byte[originalSize];
            bis.read(buf);
            do {
                bos.write(buf);
            } while (bis.read(buf) != -1);
    
            bos.flush();
            bos.close();
            bis.close();
    
            return file;
    
        }
    
    public static String getFileName(Context context, Uri uri) 
    {
      String result = null;
      if (uri.getScheme().equals("content")) {
      Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
      try {
           if (cursor != null && cursor.moveToFirst()) {
            result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
           }
          } finally {
                    cursor.close();
                }
            }
            if (result == null) {
                result = uri.getPath();
                int cut = result.lastIndexOf('/');
                if (cut != -1) {
                    result = result.substring(cut + 1);
                }
            }
            return result;
    }
    
    
    public static File makeEmptyFileIntoExternalStorageWithTitle(String title) {
            String root =  Environment.getExternalStorageDirectory().getAbsolutePath();
            return new File(root, title);
        }
    

    注意:这里的虚拟文件是从 Intent getData() 中检索并用于context.getContentResolver().openInputStream(intent.getData()),这将返回一个InputStream。从谷歌驱动器获取选定文件的句柄。

    for more info go through this link

    【讨论】:

    • DropBox中选择怎么样?
    【解决方案2】:

    我认为您从 google drive 获得 Virtual File Uri

    阅读更多关于Virtual Files

    来自文档

    虚拟文件

    • Android 7.0 将虚拟文件的概念添加到存储访问框架中。虚拟文件功能允许您的 DocumentsProvider 返回文档 URIs,即使它们没有直接的 bytecode 表示形式,也可以与 ACTION_VIEW 意图一起使用。 Android 7.0 还允许您为用户文件(虚拟或其他)提供替代格式

    现在的问题是如何检查 Uri 是否为 VirtualFile

    You can find sample code from DOCS Open virtual files

    首先检查Uri 是否为VirtualFile

    private boolean isVirtualFile(Uri uri) {
        if (!DocumentsContract.isDocumentUri(this, uri)) {
            return false;
        }
    
        Cursor cursor = getContentResolver().query(
            uri,
            new String[] { DocumentsContract.Document.COLUMN_FLAGS },
            null, null, null);
    
        int flags = 0;
        if (cursor.moveToFirst()) {
            flags = cursor.getInt(0);
        }
        cursor.close();
    
        return (flags & DocumentsContract.Document.FLAG_VIRTUAL_DOCUMENT) != 0;
    }
    

    以下代码sn-p显示了如何检查虚拟文件是否可以表示为图像,如果可以,则从虚拟文件中获取输入流

    private InputStream getInputStreamForVirtualFile(Uri uri, String mimeTypeFilter)
        throws IOException {
    
        ContentResolver resolver = getContentResolver();
    
        String[] openableMimeTypes = resolver.getStreamTypes(uri, mimeTypeFilter);
    
        if (openableMimeTypes == null ||
            openableMimeTypes.length < 1) {
            throw new FileNotFoundException();
        }
    
        return resolver
            .openTypedAssetFileDescriptor(uri, openableMimeTypes[0], null)
            .createInputStream();
    }
    

    有关虚拟文件的更多信息,您可以阅读以下文章

    【讨论】:

    • <表示减号“
    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2021-04-26
    • 2015-01-22
    • 2017-11-27
    相关资源
    最近更新 更多