kkevsekk1 / AutoX

A UiAutomator on android, does not need root access(安卓平台上的JavaScript自动化工具)
Other
7.52k stars 1.78k forks source link

安卓 14 上 Paint.setColor() 方法报错 #1182

Open pansong291 opened 1 week ago

pansong291 commented 1 week ago
  1. Autox.js 版本:7.0.2
  2. Autox.js 下载渠道:https://github.com/kkevsekk1/AutoX/releases
  3. Android 版本:Android 14
  4. Android 机型:小米13
  5. Android 系统类别:MIUI

代码如下:

const window = floaty.window(
  <frame gravity="center">
      <text id="text" text="点击可调整位置" textSize="16sp"/>
      <canvas id="board" w="*" h="*"/>
  </frame>
);

window.exitOnClose();

window.text.click(()=>{
  window.setAdjustEnabled(!window.isAdjustEnabled());
});

//画笔
var paint = new Paint();
//设置画笔颜色
paint.setColor(colors.parseColor("#ff0ff0ff"));

window.board.on("draw", function(canvas){
    var w = canvas.getWidth();
    var h = canvas.getHeight();
    canvas.drawRect(200,200,500,500,paint);
});
setInterval(()=>{}, 1000);
22:59:46.174/E: Wrapped java.lang.IllegalArgumentException: Invalid ID, must be in the range [0..18) (/storage/emulated/0/脚本/test.js#17)
Wrapped java.lang.IllegalArgumentException: Invalid ID, must be in the range [0..18)
    at /storage/emulated/0/脚本/test.js:17:0

然后我把设置颜色那里的代码改成了这样的字符串:

paint.setColor("#ff0ff0ff");

得到如下报错:

23:05:58.254/E: The choice of Java method android.graphics.Paint.setColor matching JavaScript argument types (string) is ambiguous; candidate methods are: 
    void setColor(int)
    void setColor(long) (/storage/emulated/0/脚本/test.js#17)
The choice of Java method android.graphics.Paint.setColor matching JavaScript argument types (string) is ambiguous; candidate methods are: 
    void setColor(int)
    void setColor(long)
    at /storage/emulated/0/脚本/test.js:17:0
pansong291 commented 1 week ago

@kkevsekk1

原因是 Android O 及之后,Paint 类的 setColor 方法被重载了,有两个签名:

public void setColor(int i);
public void setColor(long l);

Rhino 无法判断应该调用哪一个。这是 Rhino 无法解决的一个痛点,目前的解决办法: https://github.com/kkevsekk1/AutoX/issues/1180#issuecomment-2339471235

pansong291 commented 1 week ago

看起来似乎是优先调用了 setColor(long) 才报的错。

那么可能的解决方案:

try {
    paint.setColor(colors.pack(colors.parseColor("#ff0ff0ff")));
} catch(e) {
    paint.setColor(colors.parseColor("#ff0ff0ff"));
}

其中 colors.pack 详见 https://developer.android.google.cn/reference/android/graphics/Color#pack(int)