设备 - Device
## Device
> Stability: 2 - Stable
device模块提供了与设备有关的信息与操作,例如获取设备宽高,内存使用率,IMEI,调整设备亮度、音量等。
此模块的部分函数,例如调整音量,需要"修改系统设置"的权限。如果没有该权限,会抛出SecurityException并跳转到权限设置界面。
## device.width
- {number}
设备屏幕分辨率宽度。例如1080。
> 以下非官方说明
在项目开发中,偶尔会出现device.width的值为0的情况。因此调用这个函数时,最好做下判断。
```js
//抖音视频点赞
toastLog('开始点赞');
let x = device.width / 2
let y = device.height / 2
if (x > 10 && y > 10) {
} else {
// 有的机型取出来的设备宽度和高度都是0
x = 500
y = 500
}
//模拟双击
log(x, y)
click(parseInt(x), parseInt(y))
sleep(50)
click(parseInt(x), parseInt(y))
sleep(50)
```
## device.height
- {number}
设备屏幕分辨率高度。例如1920。
## device.buildId
- {string}
Either a changelist number, or a label like "M4-rc20".
修订版本号,或者诸如"M4-rc20"的标识。
## device.broad
- {string}
The name of the underlying board, like "goldfish".
设备的主板(?)型号。
## device.brand
- {string}
The consumer-visible brand with which the product/hardware will be associated, if any.
与产品或硬件相关的厂商品牌,如"Xiaomi", "Huawei"等。
## device.device
- {string}
The name of the industrial design.
设备在工业设计中的名称。
## device.model
- {string}
The end-user-visible name for the end product.
设备型号。
## device.product
- {string}
The name of the overall product.
整个产品的名称。
## device.bootloader
- {string}
The system bootloader version number.
设备Bootloader的版本。
## device.hardware
- {string}
The name of the hardware (from the kernel command line or /proc).
设备的硬件名称(来自内核命令行或者/proc)。
## device.fingerprint
- {string}
A string that uniquely identifies this build. Do not attempt to parse this value.
构建(build)的唯一标识码。
## device.serial
- {string}
A hardware serial number, if available. Alphanumeric only, case-insensitive.
硬件序列号。
## device.sdkInt
- {number}
The user-visible SDK version of the framework; its possible values are defined in Build.VERSION_CODES.
安卓系统API版本。例如安卓4.4的sdkInt为19。
## device.incremental
- {string}
The internal value used by the underlying source control to represent this build. E.g., a perforce changelist number or a git hash.
## device.release
- {string}
The user-visible version string. E.g., "1.0" or "3.4b5".
Android系统版本号。例如"5.0", "7.1.1"。
## device.baseOS
- {string}
The base OS build the product is based on.
## device.securityPatch
- {string}
The user-visible security patch level.
安全补丁程序级别。
## device.codename
- {string}
The current development codename, or the string "REL" if this is a release build.
开发代号,例如发行版是"REL"。
## device.getIMEI()
- {string}
返回设备的IMEI.
## device.getAndroidId()
- {string}
返回设备的Android ID。
Android ID为一个用16进制字符串表示的64位整数,在设备第一次使用时随机生成,之后不会更改,除非恢复出厂设置。
## device.getMacAddress()
- {string}
返回设备的Mac地址。该函数需要在有WLAN连接的情况下才能获取,否则会返回null。
可能的后续修改:未来可能增加有root权限的情况下通过root权限获取,从而在没有WLAN连接的情况下也能返回正确的Mac地址,因此请勿使用此函数判断WLAN连接。
## device.getBrightness()
- {number}
返回当前的(手动)亮度。范围为0~255。
## device.getBrightnessMode()
- {number}
返回当前亮度模式,0为手动亮度,1为自动亮度。
## device.setBrightness(b)
- b {number} 亮度,范围0~255
设置当前手动亮度。如果当前是自动亮度模式,该函数不会影响屏幕的亮度。
此函数需要"修改系统设置"的权限。如果没有该权限,会抛出SecurityException并跳转到权限设置界面。
## device.setBrightnessMode(mode)
- mode {number} 亮度模式,0为手动亮度,1为自动亮度
设置当前亮度模式。
此函数需要"修改系统设置"的权限。如果没有该权限,会抛出SecurityException并跳转到权限设置界面。
## device.getMusicVolume()
- {number} 整数值
返回当前媒体音量。
## device.getNotificationVolume()
- {number} 整数值
返回当前通知音量。
## device.getAlarmVolume()
- {number} 整数值
返回当前闹钟音量。
## device.getMusicMaxVolume()
- {number} 整数值
返回媒体音量的最大值。
## device.getNotificationMaxVolume()
- {number} 整数值
返回通知音量的最大值。
## device.getAlarmMaxVolume()
- {number} 整数值
返回闹钟音量的最大值。
## device.setMusicVolume(volume)
volume - {number} 音量
设置当前媒体音量。
此函数需要"修改系统设置"的权限。如果没有该权限,会抛出SecurityException并跳转到权限设置界面。
## device.setNotificationVolume(volume)
- volume {number} 音量
设置当前通知音量。
此函数需要"修改系统设置"的权限。如果没有该权限,会抛出SecurityException并跳转到权限设置界面。
## device.setAlarmVolume(volume)
- volume {number} 音量
设置当前闹钟音量。
此函数需要"修改系统设置"的权限。如果没有该权限,会抛出SecurityException并跳转到权限设置界面。
## device.getBattery()
- {number} 0.0~100.0的浮点数
返回当前电量百分比。
## device.isCharging()
- {boolean}
返回设备是否正在充电。
## device.getTotalMem()
- {number}
返回设备内存总量,单位字节(B)。1MB = 1024 * 1024B。
## device.getAvailMem()
- {number}
返回设备当前可用的内存,单位字节(B)。
```js
//获取内存使用率
function getMemoryUsage(){
var usage = (100 * device.getAvailMem() / device.getTotalMem());
//保留一位小数
return Math.round(usage * 10) / 10;
};
toast(util.format("内存使用量: %d%%\n", getMemoryUsage()););
//util.format:根据第一个参数,返回一个格式化字符串,类似printf的格式化输出。
```
## device.isScreenOn()
返回 {boolean}
返回设备屏幕是否是亮着的。如果屏幕亮着,返回true; 否则返回false。
需要注意的是,类似于vivo xplay系列的息屏时钟不属于"屏幕亮着"的情况,虽然屏幕确实亮着但只能显示时钟而且不可交互,此时isScreenOn()也会返回false。
## device.wakeUp()
唤醒设备。包括唤醒设备CPU、屏幕等。可以用来点亮屏幕。
## device.wakeUpIfNeeded()
如果屏幕没有点亮,则唤醒设备。
## device.keepScreenOn([timeout])
- timeout - {number} 屏幕保持常亮的时间, 单位毫秒。如果不加此参数,则一直保持屏幕常亮。
保持屏幕常亮。
此函数无法阻止用户使用锁屏键等正常关闭屏幕,只能使得设备在无人操作的情况下保持屏幕常亮;同时,如果此函数调用时屏幕没有点亮,则会唤醒屏幕。
在某些设备上,如果不加参数timeout,只能在Auto.js的界面保持屏幕常亮,在其他界面会自动失效,这是因为设备的省电策略造成的。因此,建议使用比较长的时长来代替"一直保持屏幕常亮"的功能,例如device.keepScreenOn(3600 * 1000)。
可以使用device.cancelKeepingAwake()来取消屏幕常亮。
```js
//一直保持屏幕常亮
device.keepScreenOn()
device.keepScreenDim([timeout])
```
timeout - {number} 屏幕保持常亮的时间, 单位毫秒。如果不加此参数,则一直保持屏幕常亮。
保持屏幕常亮,但允许屏幕变暗来节省电量。此函数可以用于定时脚本唤醒屏幕操作,不需要用户观看屏幕,可以让屏幕变暗来节省电量。
此函数无法阻止用户使用锁屏键等正常关闭屏幕,只能使得设备在无人操作的情况下保持屏幕常亮;同时,如果此函数调用时屏幕没有点亮,则会唤醒屏幕。
可以使用device.cancelKeepingAwake()来取消屏幕常亮。
## device.cancelKeepingAwake()
取消设备保持唤醒状态。用于取消device.keepScreenOn(), device.keepScreenDim()等函数设置的屏幕常亮。
## device.vibrate(millis)
- millis - {number} 震动时间,单位毫秒
使设备震动一段时间。
```
//震动两秒
device.vibrate(2000);
```
## device.cancelVibration()
>w [v4.2.7新增]
如果设备处于震动状态,则取消震动。
## device.checkDeviceHasNavigationBar()
>w [v4.2.7新增]
- {boolean}
返回 true|false 设备是否存储虚拟导航栏
## device.getVirtualBarHeigh();
>w [v4.2.7新增]
- {number}
返回导航栏的高度 设备虚拟导航栏的高度,可以用设备高度 减去 这个高度,再按一定比例 点击底部附件的坐标
# 示例
## 获取设备信息1
> 对官方例子做了补充
```js
console.show();
var str = "";
str += "屏幕宽度:" + device.width;
str += "\n屏幕高度:" + device.height;
str += "\nbuildId:" + device.buildId; //修订版本号
str += "\n主板:" + device.board;
str += "\n制造商:" + device.brand;
str += "\n工业设计名称:" + device.device;
str += "\n产品名称:" + device.product;
str += "\n型号:" + device.model;
str += "\nbootloader版本:" + device.bootloader;
str += "\n硬件名称:" + device.hardware;
str += "\n唯一标识码:" + device.fingerprint;
str += "\n硬件序列号:"+device.serial;
str += "\nIncremental:"+device.incremental;
str += "\nAndroid系统版本号:"+device.release;
str += "\nBaseOS:"+device.baseOS;
str += "\n安全补丁程序级别:"+device.securityPatch;
str += "\n开发代号:"+device.codename;
str += "\n内存总量:"+device.getTotalMem();
str += "\n当前可用内存:"+device.getAvailMem();
str += "\nAndroidId: " + device.getAndroidId();
str += "\nMac: " + device.getMacAddress();
str += "\nAPI: " + device.sdkInt;
str += "\n电量: " + device.getBattery();
str += "\nIMEI: " + device.getIMEI(); //需要读取设备信息权限
log(str);
```
以红米NOTE5高配版为例。运行结果如下:
>屏幕宽度:720
屏幕高度:1280
buildId:N2G47H
主板:QC_Reference_Phone
制造商:xiaomi
工业设计名称:ugg
产品名称:ugg
型号:Redmi Note 5A
bootloader版本:unknown
硬件名称:qcom
唯一标识码:xiaomi/ugg/ugg:7.1.2/N2G47H/V9.6.3.0.NDKCNFD:user/release-keys
硬件序列号:d0161d
Incremental:V9.6.3.0.NDKCNFD
Android系统版本号:7.1.2
BaseOS:
安全补丁程序级别:2018-07-01
开发代号:REL
内存总量:2982748160
当前可用内存:670408701
AndroidId: 75ce36b35fc495c1
Mac: 80:35:C1:1C:D6:F1
API: 25
电量: 91
## 获取设备信息2
```js
//from:https://thbelief.coding.me/2019/04/17/Auto-js-Script开发-十/
function mainUI(){
ui.layout(
<frame>
<vertical gravity="center">
<text gravity="center" text="设备信息" textSize="30sp" textColor="#000000"/>
<text gravity="center" id="Width" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Height" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="BuildId" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Broad" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Brand" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Device" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Model" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Product" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Bootloader" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Hardware" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Fingerprint" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Serial" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="SdkInt" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Incremental" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Release" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="BaseOS" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="SecurityPatch" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="Codename" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="GetAndroidId" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="GetMacAddress" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="GetTotalMem" text="" textSize="15sp" textColor="#000000"/>
<text gravity="center" id="GetAvailMem" text="" textSize="15sp" textColor="#000000"/>
</vertical>
</frame>
);
ui.Width.setText("设备宽度: "+device.width);
ui.Height.setText("设备高度: "+device.height);
ui.BuildId.setText("修订版本号: "+device.buildId);
ui.Broad.setText("主板型号: "+device.broad);
ui.Brand.setText("厂商品牌: "+device.brand);
ui.Device.setText("工业设计名称: "+device.device);
ui.Model.setText("设备型号: "+device.model);
ui.Product.setText("整个产品名称: "+device.product);
ui.Bootloader.setText("Bootloader版本: "+device.bootloader);
ui.Hardware.setText("硬件名称: "+device.hardware);
ui.Fingerprint.setText("唯一标识码: "+device.fingerprint);
ui.Serial.setText("硬件序列号: "+device.serial);
ui.SdkInt.setText("AndroidAPI版本: "+device.sdkInt);
ui.Incremental.setText("Incremental: "+device.incremental);
ui.Release.setText("Android系统版本号: "+device.release);
ui.BaseOS.setText("BaseOS: "+device.baseOS);
ui.SecurityPatch.setText("安全补丁程序级别: "+device.securityPatch);
ui.Codename.setText("开发代号: "+device.codename);
ui.GetAndroidId.setText("AndroidId: "+device.getAndroidId());
ui.GetMacAddress.setText("Mac地址: "+device.getMacAddress());
ui.GetTotalMem.setText("内存总量: "+device.getTotalMem());
ui.GetAvailMem.setText("当前可用内存: "+device.getAvailMem());
};
```
## 调整设备亮度
```js
"ui";
ui.layout(
<vertical padding="16">
<checkbox id="auto" text="自动亮度"/>
<text textColor="black" textSize="16sp" margin="8">亮度</text>
<seekbar id="brightness" max="100"/>
</vertical>
);
//getBrightnessMode()返回亮度模式,1为自动亮度
ui.auto.setChecked(device.getBrightnessMode() == 1);
ui.auto.setOnCheckedChangeListener(function(v, checked){
device.setBrightnessMode(checked ? 1: 0);
});
ui.brightness.setProgress(device.getBrightness());
ui.brightness.setOnSeekBarChangeListener({
onProgressChanged: function(seekbar, p, fromUser){
if(fromUser){
device.setBrightness(p);
}
}
});
```
## 调整设备音量
```js
"ui";
ui.layout(
<vertical padding="16">
<text textColor="black" textSize="16sp">媒体音量</text>
<seekbar id="music"/>
<text textColor="black" textSize="16sp">通知音量</text>
<seekbar id="notification"/>
<text textColor="black" textSize="16sp">闹钟音量</text>
<seekbar id="alarm"/>
</vertical>
);
ui.music.setMax(device.getMusicMaxVolume());
ui.music.setProgress(device.getMusicVolume());
ui.music.setOnSeekBarChangeListener({
onProgressChanged: function(seekbar, p, fromUser){
if(fromUser){
device.setMusicVolume(p);
}
}
});
ui.notification.setMax(device.getNotificationMaxVolume());
ui.notification.setProgress(device.getAlarmVolume());
ui.notification.setOnSeekBarChangeListener({
onProgressChanged: function(seekbar, p, fromUser){
if(fromUser){
device.setNotificationVolume(p);
}
}
});
ui.alarm.setMax(device.getAlarmMaxVolume());
ui.alarm.setProgress(device.getAlarmVolume());
ui.alarm.setOnSeekBarChangeListener({
onProgressChanged: function(seekbar, p, fromUser){
if(fromUser){
device.setAlarmVolume(p);
}
}
});
```
> 以下非官方资料
系统设置页面的相关intent跳转:
```js
var intent = new Intent(); // vpnIntent.setAction("android.net.vpn.SETTINGS");
intent.setAction("android.settings.ACCESSIBILITY_SETTINGS"); //辅助功能
intent.setAction("android.settings.ADD_ACCOUNT_SETTINGS"); //添加账户
intent.setAction("android.settings.AIRPLANE_MODE_SETTINGS"); //系统设置首页
intent.setAction("android.settings.APN_SETTINGS"); //APN设置
intent.setAction("android.settings.APPLICATION_SETTINGS"); //应用管理
intent.setAction("android.settings.BATTERY_SAVER_SETTINGS"); //节电助手
intent.setAction("android.settings.BLUETOOTH_SETTINGS"); //蓝牙
intent.setAction("android.settings.CAPTIONING_SETTINGS"); //字幕
intent.setAction("android.settings.CAST_SETTINGS"); //无线显示
intent.setAction("android.settings.DATA_ROAMING_SETTINGS"); //移动网络
intent.setAction("android.settings.DATE_SETTINGS"); //日期和时间设置
intent.setAction("android.settings.DEVICE_INFO_SETTINGS"); //关于手机
intent.setAction("android.settings.DISPLAY_SETTINGS"); //显示设置
intent.setAction("android.settings.DREAM_SETTINGS"); //互动屏保设置
intent.setAction("android.settings.HARD_KEYBOARD_SETTINGS"); //实体键盘
intent.setAction("android.settings.HOME_SETTINGS"); //应用权限,默认应用设置,特殊权限
intent.setAction("android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS"); //忽略电池优化设置
intent.setAction("android.settings.INPUT_METHOD_SETTINGS"); //可用虚拟键盘设置
intent.setAction("android.settings.INPUT_METHOD_SUBTYPE_SETTINGS"); //安卓键盘语言设置(AOSP)
intent.setAction("android.settings.INTERNAL_STORAGE_SETTINGS"); //内存和存储
intent.setAction("android.settings.LOCALE_SETTINGS"); //语言偏好设置
intent.setAction("android.settings.LOCATION_SOURCE_SETTINGS"); //定位服务设置
intent.setAction("android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS"); //所有应用
intent.setAction("android.settings.MANAGE_APPLICATIONS_SETTINGS"); //应用管理
intent.setAction("android.settings.MANAGE_DEFAULT_APPS_SETTINGS"); //与ACTION_HOME_SETTINGS相同
intent.setAction("android.settings.action.MANAGE_OVERLAY_PERMISSION"); //在其他应用上层显示,悬浮窗
intent.setAction("android.settings.MANAGE_UNKNOWN_APP_SOURCES"); //安装未知应用 安卓8.0
intent.setAction("android.settings.action.MANAGE_WRITE_SETTINGS"); //可修改系统设置 权限
intent.setAction("android.settings.MEMORY_CARD_SETTINGS"); //内存与存储
intent.setAction("android.settings.NETWORK_OPERATOR_SETTINGS"); //可用网络选择
intent.setAction("android.settings.NFCSHARING_SETTINGS"); //NFC设置
intent.setAction("android.settings.NFC_SETTINGS"); //网络中的 更多设置
intent.setAction("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); //通知权限设置
intent.setAction("android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS"); //勿扰权限设置
intent.setAction("android.settings.ACTION_PRINT_SETTINGS"); //打印服务设置
intent.setAction("android.settings.PRIVACY_SETTINGS"); //备份和重置
intent.setAction("android.settings.SECURITY_SETTINGS"); //安全设置
intent.setAction("android.settings.SHOW_REGULATORY_INFO"); //监管信息
intent.setAction("android.settings.SOUND_SETTINGS"); //声音设置
intent.setAction("android.settings.SYNC_SETTINGS"); //添加账户设置
intent.setAction("android.settings.USAGE_ACCESS_SETTINGS"); //有权查看使用情况的应用
intent.setAction("android.settings.USER_DICTIONARY_SETTINGS"); //个人词典
intent.setAction("android.settings.VOICE_INPUT_SETTINGS"); //辅助应用和语音输入
intent.setAction("android.settings.VPN_SETTINGS"); //VPN设置
intent.setAction("android.settings.VR_LISTENER_SETTINGS"); //VR助手
intent.setAction("android.settings.WEBVIEW_SETTINGS"); //选择webview
intent.setAction("android.settings.WIFI_IP_SETTINGS"); //高级WLAN设置
intent.setAction("android.settings.WIFI_SETTINGS"); //选择WIFI,连接WIFI
app.startActivity(intent);
```