android - 使用 Intent 从 Google Drive 获取文件

标签 android android-intent

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

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

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

最佳答案

处理通过文件选择器选择 Google 云端硬盘文件时收到的 Uri

如前所述,它接收虚拟文件 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

关于android - 使用 Intent 从 Google Drive 获取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53670406/

相关文章:

android - 如何在完成时从最近的应用程序列表中删除 Activity ?

android - 从对话框 fragment 启动 Activity

Android 查看用 DownloadManager 下载的图片

java - 如果应用程序打开,Android Firebase 通知

android - 允许用户点击广告解锁功能

android - 为什么不在 Activity 中使用 "newInstance"模式?

android - 与第 3 方 Activity 共享文件或内容

Android:子 Activity 在 onActivityResult 中返回 NULL Intent 对象

android - 如何跟踪人们从哪里来到我的谷歌游戏市场游戏页面

android - 如何将数据从 android 服务(从 onStart 或 OnCreate)传递到 android Activity