Android应用接收文件时URI为空及文件读取失败问题咨询
Android通过SEND Intent接收文件时获取正确URI的问题
我已经在Manifest中配置了以下intent-filter,让应用出现在文件管理器的“发送到”列表中:
<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*"/> </intent-filter>
但在SplashActivity的onCreate方法中调用getIntent().getData()时,返回的URI始终为空。查看两种启动场景的Intent信息:
- 标准启动时的Intent:
Intent { act = android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]flg=0x10200000 cmp=ru.mysoft/.SplashActivity bnds=[540,370][804,656] } - 通过文件管理器传文件启动时的Intent:
Intent { act = android.intent.action.SEND typ=*/* flg=0x1b0800001 cmp=ru.mysoft/.SplashActivity clip={*/* U:content://media/external/file/77191} (has extras) }
有两个疑问:
- 应该从Intent中获取什么信息作为URI来创建文件输入流?
- 尝试用路径
//media/external/file/77191创建FileInputStream时,出现java.io.FileNotFoundException异常,这是为什么?
解决方案
1. 正确获取文件URI的方式
对于android.intent.action.SEND类型的Intent,文件URI并不通过getData()返回,而是存储在ClipData中,部分应用也可能通过Intent.EXTRA_STREAM这个额外参数传递。你可以通过以下两种方式获取:
方式一:从ClipData中提取
Intent receivedIntent = getIntent(); if (Intent.ACTION_SEND.equals(receivedIntent.getAction())) { ClipData clipData = receivedIntent.getClipData(); if (clipData != null && clipData.getItemCount() > 0) { Uri fileUri = clipData.getItemAt(0).getUri(); // 这里拿到的就是正确的文件URI } }
方式二:从EXTRA_STREAM中提取(兼容部分应用)
Intent receivedIntent = getIntent(); if (Intent.ACTION_SEND.equals(receivedIntent.getAction())) { Uri fileUri = receivedIntent.getParcelableExtra(Intent.EXTRA_STREAM); if (fileUri != null) { // 处理获取到的URI } }
2. 为什么直接用路径创建FileInputStream会报错
你拿到的content://media/external/file/77191是Content Provider URI,不是本地文件的绝对路径,因此不能直接用FileInputStream打开。这类URI需要通过ContentResolver来获取输入流:
ContentResolver contentResolver = getContentResolver(); try (InputStream inputStream = contentResolver.openInputStream(fileUri)) { // 在这里执行文件复制、读取等操作 } catch (IOException e) { e.printStackTrace(); }
Content Provider URI是Android系统统一的文件访问方式,尤其是Android 10及以上版本,系统限制了直接访问外部存储路径,必须通过ContentResolver来操作这类URI对应的文件。
内容的提问来源于stack exchange,提问作者coder_jt
相关产品推荐
相关产品推荐

