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()。具体步骤如下:
- 在你的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); } }
- 实现
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
相关产品推荐
相关产品推荐

