Android如何通过Intent Filter接收PDF文件?默认文件管理器打开崩溃怎么解决
崩溃根因
- 空指针触发直接原因:系统默认文件管理器通过
ACTION_VIEW启动你的应用时,Intent未携带Extras数据,intent.getExtras()返回null,你未做空判断直接调用bundle.get()方法触发异常。 - 逻辑错误:
ACTION_VIEW类型的意图传递文件URI时,默认将URI存放在Intent的data字段,而非EXTRA_STREAM字段。EXTRA_STREAM仅用于ACTION_SEND/ACTION_SEND_MULTIPLE类分享场景,不是你当前场景的传参方式。
修复代码
替换你原有接收Intent的代码为如下版本,兼容所有打开场景,同时增加全链路空判断:
Intent intent = getIntent(); Uri pdfUri = null; // 优先处理VIEW动作的data字段(文件管理器、浏览器等打开场景) if (Intent.ACTION_VIEW.equals(intent.getAction())) { pdfUri = intent.getData(); } // 兼容第三方应用分享PDF的场景 else { Bundle bundle = intent.getExtras(); if (bundle != null) { pdfUri = (Uri) bundle.get(Intent.EXTRA_STREAM); } } // 非空校验后再执行加载逻辑 if (pdfUri != null) { // 此处放置你原本的PDF加载逻辑 } else { // 异常处理,可弹出Toast提示用户无法获取文件 }
可选优化项
- Manifest配置可简化:你当前写的三个
intent-filter中,第一个匹配application/pdfmime类型的配置已经覆盖了所有scheme(包括content、file、http、https等),剩余两个冗余的scheme匹配配置可以直接删除,减少兼容问题。 - 如果需要加载http/https的在线PDF,记得在Manifest中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者Syed Irfan Hussaini
相关产品推荐
相关产品推荐

