You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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",
  },
);

为什么之前的配置不生效?

  1. 你之前用的action_main(也就是android.intent.action.MAIN)是用来唤起App主界面的,不是处理下载请求的,所以参数根本不会被下载模块识别;
  2. 文件名的参数Key用错了,1DM不识别com.android.extra.filename,得用它自定义的idm.extra.FILENAME
  3. 下载链接没有放在正确的位置,要么用data字段传入,要么用android.intent.extra.TEXT配合SEND Action传递。

你可以先试第一种写法,大部分1DM版本都支持这个配置,唤起后应该能自动填充下载链接和文件名,直接进入下载确认界面。

内容来源于stack exchange

火山引擎 最新活动