首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用意图从Google驱动器获取文件

使用意图从Google驱动器获取文件
EN

Stack Overflow用户
提问于 2018-12-07 13:19:28
回答 2查看 3.3K关注 0票数 5

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

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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-13 12:44:33

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

如前所述,它接收虚拟文件Uri

我发现这个示例代码简单易懂。给出的代码示例适用于我-- .hope --它适用于您的情况。

1.检测该Uri是由google驱动器接收的。

代码语言:javascript
复制
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将存储到外部路径(在这里,它的根目录u可以根据您的需要更改它),并创建带有uri的文件。

代码语言:javascript
复制
 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);
    }

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

要获得更多信息,请浏览此链接。

票数 14
EN

Stack Overflow用户

发布于 2018-12-10 14:04:56

我想你是从google驱动器上得到Virtual File Uri

阅读更多关于虚拟文件的信息

来自DOCS

虚拟文件

  • Android7.0将虚拟文件的概念添加到存储访问框架中。虚拟文件特性允许DocumentsProvider返回可以与ACTION_VIEW意图一起使用的文档URIs,即使它们没有直接的bytecode表示。Android7.0还允许您为用户文件提供替代格式,无论是虚拟的还是其他的

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

您可以从DOCS打开虚拟文件中找到示例代码

首先检查Uri是否为VirtualFile

代码语言:javascript
复制
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;
}

下面的代码片段演示如何检查虚拟文件是否可以表示为图像,如果可以,则从虚拟文件中获取输入流。

代码语言:javascript
复制
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();
}

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53670406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档