You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中通过Google Drive的SEND/SEND_MULTIPLE Intent获取文件数据问题

解决Google Drive发送文件到你的App的问题

嗨,我看到你已经成功让App出现在Drive的分享列表里了,接下来获取文件其实很简单——你之前用getData()是走了弯路,因为ACTION_SEND的文件数据是放在Intent的Extras里,而不是DATA字段,这和ACTION_VIEW的逻辑不一样。

单文件接收(ACTION_SEND)

根据你提供的Intent信息,Google Drive把文件的Uri放在了android.intent.extra.STREAM这个Extra键里,所以你需要用这个键来获取Uri,而不是getData()。具体步骤如下:

  1. 在你的Activity的onCreate()方法中,获取Intent并提取Uri:
Intent receivedIntent = getIntent();
String action = receivedIntent.getAction();
String type = receivedIntent.getType();

if (Intent.ACTION_SEND.equals(action) && type != null) {
    // 获取文件Uri
    Uri fileUri = receivedIntent.getParcelableExtra(Intent.EXTRA_STREAM);
    if (fileUri != null) {
        // 调用方法读取并复制文件
        copyFileFromUri(fileUri);
    }
}
  1. 实现copyFileFromUri()方法,通过ContentResolver读取Uri对应的文件内容:
private void copyFileFromUri(Uri sourceUri) {
    ContentResolver resolver = getContentResolver();
    // 可选:从Uri获取原文件名
    String fileName = null;
    Cursor cursor = resolver.query(sourceUri, null, null, null, null);
    if (cursor != null && cursor.moveToFirst()) {
        fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
        cursor.close();
    }
    // 定义目标文件路径,比如App的内部存储目录
    File targetFile = new File(getFilesDir(), fileName != null ? fileName : "received_file.bin");

    try (InputStream inputStream = resolver.openInputStream(sourceUri);
         OutputStream outputStream = new FileOutputStream(targetFile)) {
        // 复制流数据
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        // 复制成功,这里可以做后续业务处理
    } catch (IOException e) {
        e.printStackTrace();
        // 处理读取或写入异常,比如提示用户操作失败
    }
}

多文件批量接收(ACTION_SEND_MULTIPLE)

当Google Drive批量发送文件时,确实会使用android.intent.action.SEND_MULTIPLE这个Action,此时文件Uri会以ArrayList的形式放在Intent.EXTRA_STREAMS(注意是复数形式)这个Extra键里。处理逻辑类似,只需要遍历所有Uri即可:

if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
    ArrayList<Uri> fileUris = receivedIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAMS);
    if (fileUris != null && !fileUris.isEmpty()) {
        for (Uri uri : fileUris) {
            copyFileFromUri(uri); // 复用单文件的复制方法即可
        }
    }
}

额外注意事项

  • 记得在你的Activity的IntentFilter里添加ACTION_SEND_MULTIPLE的支持,这样批量发送时App才会出现在列表里:
<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:mimeType="application/octet-stream" />
</intent-filter>
  • 做好异常容错:比如Uri为空、读取流失败、文件写入权限不足等情况,要及时捕获并处理,避免App崩溃。
  • 如果你需要支持更多MIME类型,可以在IntentFilter里添加多个<data>标签,或者用*/*接收所有类型(根据你的业务需求调整)。

内容的提问来源于stack exchange,提问作者nmw01223

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:08:12