Flutter应用唤起1DM(idm.internet.download.manager)并传入下载参数的Intent配置问题
Flutter应用唤起1DM(idm.internet.download.manager)并传入下载参数的Intent配置问题
我之前做Flutter项目时刚好遇到过一模一样的问题——能唤起1DM但传参总是不生效,折腾了好一会儿才摸清楚正确的Intent配置方式,给你梳理下解决方案:
第一步:先删掉你AndroidManifest里多余的配置
你之前在自己App的AndroidManifest.xml里添加的1DM Activity声明完全是多余的,那是1DM自身应用该配置的内容,我们的App根本不需要管这个,直接把这段代码删掉就行:
<!-- 把这段彻底删掉 --> <activity android:name="idm.internet.download.manager" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN"> </action> </intent-filter> </activity>
第二步:修正Flutter里的AndroidIntent参数
你之前的问题主要出在Action配置错误和参数Key用错上,1DM对Intent参数有特定的要求,下面是两种经过验证的可行写法:
写法一:显式指定1DM的下载处理组件(推荐)
这种方式最稳定,直接指定1DM专门处理下载请求的组件,参数也用官方认可的Key:
final AndroidIntent intent = AndroidIntent( package: 'idm.internet.download.manager', // 1DM专门处理下载链接的组件,别写错 componentName: 'idm.internet.download.manager.UrlHandlerDownloader', action: 'android.intent.action.VIEW', // 直接把下载链接作为data传入,这是1DM识别下载地址的关键 data: urlStr, arguments: <String, dynamic>{ // 文件名的正确参数Key,别用之前的错误Key了 'idm.extra.FILENAME': "fileName.mp4", // 可选:如果需要设置Referer、Cookie等额外参数,也可以加上 // 'idm.extra.REFERER': "https://your-referer-url.com", // 'idm.extra.COOKIE': "your-cookie-content", }, );
写法二:用SEND Action隐式唤起
如果上面的写法不生效,也可以试试这种隐式Intent的方式,用系统的SEND Action传递参数:
final AndroidIntent intent = AndroidIntent( action: 'android.intent.action.SEND', package: 'idm.internet.download.manager', type: 'text/plain', arguments: <String, dynamic>{ 'android.intent.extra.TEXT': urlStr, 'idm.extra.FILENAME': "fileName.mp4", }, );
为什么之前的配置不生效?
- 你之前用的
action_main(也就是android.intent.action.MAIN)是用来唤起App主界面的,不是处理下载请求的,所以参数根本不会被下载模块识别; - 文件名的参数Key用错了,1DM不识别
com.android.extra.filename,得用它自定义的idm.extra.FILENAME; - 下载链接没有放在正确的位置,要么用
data字段传入,要么用android.intent.extra.TEXT配合SEND Action传递。
你可以先试第一种写法,大部分1DM版本都支持这个配置,唤起后应该能自动填充下载链接和文件名,直接进入下载确认界面。
内容来源于stack exchange




