代码之家  ›  专栏  ›  技术社区  ›  sushildlh

使用Intent从googledrive获取文件

  •  1
  • sushildlh  · 技术社区  · 7 年前

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

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

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

    我明白了 content://com.google.android.apps.docs.storage.legacy/enc=ckpgt5KcEEF_JYniJQafRV_5pEnu_D5UAI1WF-Lu6h2Z_Vw4 在意图数据Uri中。

    2 回复  |  直到 7 年前
        1
  •  12
  •   Dan Is Fiddling By Firelight Leniency    5 年前

    手柄 Uri

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

    给定的代码示例对我有用。希望它在您的情况下有效。

    1.因此,检测google drive是否接收到此Uri。

    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的文件。

     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()) ,这将返回一个 InputStream

    for more info go through this link

        2
  •  4
  •   Community Mohan Dere    5 年前

    我想你越来越难了 Virtual File Uri

    阅读更多关于 Virtual Files

    来自文档

    虚拟文件

    • Android 7.0将虚拟文件的概念添加到存储访问框架中。虚拟文件功能允许您的 DocumentsProvider URIs 这可以与动作视图意图一起使用,即使它们没有直接的 bytecode 代表性。Android 7.0还允许您为用户文件提供其他格式,包括虚拟文件或其他文件

    Uri 是否具有虚拟性

    You can find sample code from DOCS Open virtual files

    首先检查一下 是否具有虚拟性

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

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

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