设备 - 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); ```