20_ java.lang.IllegalArgumentException: Service Intent must be explicit异常说明

本文介绍了解决Android 5.0中由于系统限制导致无法使用隐式Intent启动Service的问题。通过增加指定包名的步骤,实现了在Lollipop及以上版本中成功启动Service组件。

     在Android 5.0采用隐式意图启动方式

Intent intent = new Intent();
intent.setAction("b.aidl.DownLoadService");
bindService(intent, conn, BIND_AUTO_CREATE);

    产生了如下 截图所示的bug

   

      bug说明:

       有些时候我们使用Service的时需要采用隐式意图启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent  must be explitict,也就是说从Lollipop开始,service服务必须采用显式意图方式启动.

      解决方案:

Intent intent = new Intent();
intent.setAction("b.aidl.DownLoadService");
intent.setPackage("lq.cn.twoapp"); //指定启动的是那个应用(lq.cn.twoapp)中的Action(b.aidl.DownLoadService)指向的服务组件
bindService(intent, conn, BIND_AUTO_CREATE);

 


<think>我们正在处理Auto.js中出现的错误:`Wrapped java.lang.IllegalArgumentException: Duration must be positive` 根据错误信息,`Duration must be positive`意味着我们传递给某个函数的持续时间(duration)参数不是正数(即<=0)。 在之前的上下文中,我们使用了`gestures`函数来模拟按下操作: ```javascript gestures([0, 100, [centerX, centerY]]); ``` 其中,第二个参数就是持续时间(duration),这里我们设置的是100(毫秒),是正数。 但是,错误提示持续时间必须为正,说明在代码中可能有一个地方传递了非正数(负数或0)的持续时间。 可能的原因: 1. 在调用`gestures`时,某个手势点的持续时间参数(duration)被设置成了0或负数。 2. 在调用其他函数(如`press`)时,持续时间参数设置不正确。 回顾`gestures`函数的参数要求: 每个手势点是一个数组:[delay, duration, [x, y]] 其中: - delay: 这个手势点相对于手势开始的延迟时间(毫秒) - duration: 这个手势点持续的时长(毫秒),必须为正数(>0) - [x, y]: 坐标 因此,如果我们在某个手势点中设置的duration<=0,就会抛出这个异常。 例如,以下代码会触发错误: ```javascript // 错误示例:持续时间为0 gestures([0, 0, [100, 200]]); // 抛出IllegalArgumentException: Duration must be positive ``` 解决方案: 检查所有调用`gestures`的地方,确保每个手势点的持续时间(duration)都是正数(>0)。 另外,在Auto.js中,还有可能使用`press`函数来模拟长按,它的参数是坐标和持续时间(毫秒): ```javascript press(x, y, duration); ``` 同样,这里的duration也必须为正数。 因此,如果使用`press`函数,也要确保第三个参数是正数。 示例修正: 假设我们原本的代码中有一个手势点的duration设置成了0,我们需要将其改为一个正数(比如100毫秒): ```javascript // 错误代码 gestures([0, 0, [100, 200]]); // 错误,duration=0 // 修正为 gestures([0, 100, [100, 200]]); // 正确,duration=100 ``` 总结步骤: 1. 在代码中搜索`gestures(`和`press(`等可能涉及持续时间参数的函数调用。 2. 检查这些调用中设置的持续时间(duration)参数是否为正整数(>0)。 3. 将任何非正数(<=0)的持续时间修改为大于0的整数。 注意:如果持续时间是从变量中获取的,需要确保该变量在运行时为正整数。 例如: ```javascript let myDuration = 0; // 错误,不能为0 // ... 可能被修改 myDuration = 100; // 正确,改为正数 // 使用变量 gestures([0, myDuration, [x, y]]); ``` 如果问题仍然存在,请检查变量是否被意外修改为0或负数。 如果问题比较复杂,可以添加日志输出持续时间参数的值,以便调试。 例如: ```javascript let duration = ...; // 从某处获取的持续时间 console.log("duration = " + duration); gestures([0, duration, [x, y]]); ``` 这样,当运行出错时,可以查看日志输出,确认duration的值是否为正数。 根据以上分析,我们可以这样回答用户:</think>### Auto.js 错误 `Duration must be positive` 解决方法 在 Auto.js 中遇到 `Wrapped java.lang.IllegalArgumentException: Duration must be positive` 错误,通常是因为手势操作函数(如 `gestures()` 或 `press()`)中的 **持续时间参数(duration)被设置为负数或零**。以下是详细解决方法: #### 错误原因分析 ```javascript // 错误示例:duration 参数 <= 0 gestures([0, 0, [x, y]]); // 持续时间为0 gestures([0, -100, [x, y]]); // 持续时间为负数 press(x, y, 0); // press函数持续时间为0 ``` #### ✅ 正确解决方案 1. **检查所有持续时间参数** 确保所有手势操作的 **duration 值 > 0**(单位:毫秒): ```javascript // 正确示例:duration > 0 gestures([0, 100, [x, y]]); // 持续100毫秒 press(x, y, 500); // 持续500毫秒 ``` 2. **动态计算时长时添加验证** 若时长是变量计算得出,需添加保护逻辑: ```javascript let duration = calculateDuration(); // 假设此函数可能返回0或负数 // 添加保护:确保 duration >= 10ms duration = Math.max(10, duration); gestures([0, duration, [x, y]]); ``` 3. **长按操作的推荐写法** 长按操作(>500ms)需确保 duration ≥ 500: ```javascript let element = id("btn_submit").findOne(); let center = [element.bounds().centerX(), element.bounds().centerY()]; // 长按800ms gestures([0, 800, center]); // ✅ 正确 ``` #### 完整修复示例 ```javascript // 查找点赞按钮 let likeBtn = id("v5").depth(21).findOne(); if (likeBtn) { let bounds = likeBtn.bounds(); let x = bounds.centerX(); let y = bounds.centerY(); // 修复点:确保第二个参数(duration)> 0 gestures([0, 100, [x, y]]); // ✅ 100ms按下操作 console.log("模拟点击成功"); } else { console.log("未找到元素"); } ``` #### 关键注意事项 1. **所有手势函数均要求 duration > 0**,包括: - `gestures()` - `press()` - `longClick()` 2. 若从配置文件读取时长,需添加类型检查: ```javascript let configDuration = config.duration || 100; // 默认100ms if (typeof configDuration !== 'number' || configDuration <= 0) { configDuration = 100; // 强制修正 } ``` 3. 屏幕旋转时重新获取坐标,避免使用过期的坐标值导致异常[^1]
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值