常用函数

# 说明 工具类模块函数主要是跟Android常用的信息相关联 工具类模块的对象前缀是utils,例如 utils.requestShowLogPermission()这样调用 # App相关 ## utils.isAppExist() App是否已经安装 @param packageName 应用程序的包名 @return true 代表已经安装,false代表未安装 ```js function main(){ var result = utils.isAppExist("com.xx"); } main(); ``` ## utils.openApp(packageName) 通过包名打开APP @param packageName 程序的包名 @return 布尔型 true 代表成功,false 代表失败 ```js function main(){ utils.openApp("com.xx"); } main(); ``` #### 封装一个启动应用函数 ```js let packageName = 'com.ss.android.ugc.aweme'; launch(packageName); /** @description 通过包名启动应用。如果该包名对应的应用不存在,则返回false;否则返回true。 @version 20201125 @author 飞云<283054503@qq.com> @param packageName {string} :应用包名 @param delay {number} :启动后等待时长,单位毫秒。默认5000 @param startNum {number} :重试次数。默认3 @return {boolean}:返回是否成功 */ function launch(packageName, delay, startNum) { let result = false; if (!delay) { delay = 5000; } if (!startNum) { startNum = 3; } if (utils.isAppExist(packageName)) { if (getRunningPkg() === packageName) { logd('应用已经在前台'); result = true; } else { logd('启动应用...'); let selectors = text('允许'); let num = 0; while (num < startNum) { if (getRunningPkg() === packageName) { logi('启动成功'); result = true; break; } else if (has(selectors)) { let node = selectors.getOneNodeInfo(1000); if (node) { node.click() } } else { utils.openApp(packageName); sleep(delay); num++; } } } } else { loge('应用未安装'); } if (result) { logd('应用版本号:' + utils.getAppVersionName(packageName)); } return result; }; ``` ## utils.openAppByName() 通过名称打开APP @param appName 程序名称,比如今日头条 @return 布尔型 true 代表成功,false 代表失败 ```js function main(){ utils.openAppByName("xx"); } main(); ``` ## utils.getApkPkgName() 取得App文件的包名 @param filePath 文件路径 @return 字符串 ```js function main(){ var pkgName = utils.getApkPkgName("/sdcard/app.apk"); } main(); ``` ## utils.getAppVersionName() 取得已安装的程序的版本字符串标示(版本号) @param packageName 应用程序的包名 @return 字符串。例如 1.0.0 ```js function main(){ var r = utils.getAppVersionName("com.xx"); } main(); ``` ## utils.getAppVersionCode() 取得已安装的程序的版本整型标示 @param packageName 应用程序的包名 @return 整型。例如 130600 ```js function main(){ var versionCode = utils.getAppVersionCode("com.xx"); } main(); ``` ## getRunningPkg() 取得当前运行的App包名 @return {字符串|null} ```js function main(){ var result = getRunningPkg(); } main(); ``` ## getRunningActivity() 取得当前运行的Activity类名 @return {字符串|null} ```js function main(){ var result = getRunningActivity(); } main(); ``` # Activity ## utils.openActivity() 打开一个activity,通过map参数 @param map 例如{"action":""},key的固定只有 action: 标准的android action字符串 uri: uri可以是http网址,也可以是文件file:///地址,也可以是 URLSchema语法 type: uri对应的type,等同于MIME类型,例如安装apk包的type是 application/vnd.android.package-archive pkg: 要打开的activity对应的包名 className: 要打开的 className 对应的类名 flag: androi打开activity 标准的flag标志位,特殊情况下可以填写 其他的都是属于intent参数了 @return 布尔型 true 代表成功,false 代表失败 ```js function main(){ //打开安装包界面 var m ={ "action":"android.intent.action.VIEW", "uri":"file:///sdcard/a.apk", "type":"application/vnd.android.package-archive" }; var x = utils.openActivity(m); logd("x "+x); var map={ "uri":"xx://xx/live/6701887916223941379", }; utils.openActivity(map); } main(); ``` > 以下非官方例子 #### 浏览图片 ```js importPackage(android.content) var m = { "action": "android.intent.action.VIEW", "uri": "file:///sdcard/ad1.png", "type": "image/*", "flag": android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION | android.content.Intent.FLAG_ACTIVITY_NEW_TASK }; var x = utils.openActivity(m); logd(x); ``` ```js // 打开抖音用户主页 var x = utils.openActivity({ "uri": "snssdk1128://user/profile/98726798113", }); logd(x); ``` ```js // 打开指定网址 var m = { "action": "android.intent.action.VIEW", "uri": "http://www.feiyunjs.com", }; var x = utils.openActivity(m); sleep(3000); logd(x); ``` ## utils.openIntentAction() 通过Action打开某个界面 @param action action动作,例如 android.settings.ACCESSIBILITY_SETTINGS = 辅助功能, 如果改方法不满足要求,可以直接使用intent进行打开: 常用的action有: - android.settings.ACCESSIBILITY_SETTINGS //辅助功能 - android.settings.ADD_ACCOUNT_SETTINGS //添加账户 - android.settings.AIRPLANE_MODE_SETTINGS //系统设置首页 - android.settings.APN_SETTINGS //APN设置 - android.settings.APPLICATION_SETTINGS //应用管理 - android.settings.BATTERY_SAVER_SETTINGS //节电助手 - android.settings.BLUETOOTH_SETTINGS //蓝牙 - android.settings.CAPTIONING_SETTINGS //字幕 - android.settings.CAST_SETTINGS //无线显示 - android.settings.DATA_ROAMING_SETTINGS //移动网络 - android.settings.DATE_SETTINGS //日期和时间设置 - android.settings.DEVICE_INFO_SETTINGS //关于手机 - android.settings.DISPLAY_SETTINGS //显示设置 - android.settings.DREAM_SETTINGS //互动屏保设置 - android.settings.HARD_KEYBOARD_SETTINGS //实体键盘 - android.settings.HOME_SETTINGS //应用权限,默认应用设置,特殊权限 - android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS //忽略电池优化设置 - android.settings.INPUT_METHOD_SETTINGS //可用虚拟键盘设置 - android.settings.INPUT_METHOD_SUBTYPE_SETTINGS //安卓键盘语言设置(AOSP) - android.settings.INTERNAL_STORAGE_SETTINGS //内存和存储 - android.settings.LOCALE_SETTINGS //语言偏好设置 - android.settings.LOCATION_SOURCE_SETTINGS //定位服务/位置信息设置 - android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS //所有应用 - android.settings.MANAGE_APPLICATIONS_SETTINGS //应用管理 - android.settings.MANAGE_DEFAULT_APPS_SETTINGS //与ACTION_HOME_SETTINGS相同 - android.settings.action.MANAGE_OVERLAY_PERMISSION //在其他应用上层显示,悬浮窗 - android.settings.MANAGE_UNKNOWN_APP_SOURCES //安装未知应用 安卓8.0 - android.settings.action.MANAGE_WRITE_SETTINGS //可修改系统设置 权限 - android.settings.MEMORY_CARD_SETTINGS //内存与存储 - android.settings.NETWORK_OPERATOR_SETTINGS //可用网络选择 - android.settings.NFCSHARING_SETTINGS //NFC设置 - android.settings.NFC_SETTINGS //网络中的 更多设置 - android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS //通知权限设置 - android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS //勿扰权限设置 - android.settings.ACTION_PRINT_SETTINGS //打印服务设置 - android.settings.PRIVACY_SETTINGS //备份和重置 - android.settings.SECURITY_SETTINGS //安全设置 - android.settings.SHOW_REGULATORY_INFO //监管信息 - android.settings.SOUND_SETTINGS //声音设置 - android.settings.SYNC_SETTINGS //添加账户设置 - android.settings.USAGE_ACCESS_SETTINGS //有权查看使用情况的应用 - android.settings.USER_DICTIONARY_SETTINGS //个人词典 - android.settings.VOICE_INPUT_SETTINGS //辅助应用和语音输入 - android.settings.VPN_SETTINGS //VPN设置 - android.settings.VR_LISTENER_SETTINGS //VR助手 - android.settings.WEBVIEW_SETTINGS //选择webview - android.settings.WIFI_IP_SETTINGS //高级WLAN设置 - android.settings.WIFI_SETTINGS //选择WIFI,连接WIFI - com.android.settings.Settings$DevelopmentSettingsActivity @return {null|boolean|*} ```js //打开无障碍设置页面 function main(){ utils.openIntentAction("android.settings.ACCESSIBILITY_SETTINGS"); } main(); ``` 直接使用Intent打开方式 ```js // 打开应用详情页面 // let packageName = 'com.ss.android.ugc.aweme' let packageName = getRunningPkg() importClass(android.content.Intent); importClass(android.net.Uri) var intent = new Intent(); intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.parse("package:" + packageName)) intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { context.startActivity(intent); sleep(3000); } catch (e) { loge(e) } ``` > 以下非官方例子 ```js //打开微信扫一扫 importClass(android.content.Intent); importClass(android.net.Uri); importClass(android.content.ComponentName); var intent = new Intent(); intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI")); intent.putExtra("LauncherUI.From.Scaner.Shortcut", true); intent.setAction("android.intent.action.VIEW"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { context.startActivity(intent); sleep(5000); } catch (e) { loge(e) } ``` # 文件库 ## utils.insertImageToAlbum() 将图片插入到相册中,此方法会立刻更新相册数据 @param path 图片路径 ```js function main(){ utils.insertImageToAlbum("/sdcard/a.png"); } main(); ``` ## utils.insertVideoToAlbum() 将视频插入到相册中,此方法会立刻更新相册数据 @param path 视频路径 ```js function main(){ utils.insertVideoToAlbum("/sdcard/a.mp4"); } main(); ``` # 剪贴板 ## utils.setClipboardText(content) 设置剪贴板文本 @param content 文本 @return boolean ```js function main(){ var r = utils.setClipboardText("com.xx"); toast("设置结果:"+r); } main(); ``` ## utils.getClipboardText() 读取剪贴板文本 @return string ```js function main(){ var r = utils.getClipboardText(); toast("读取结果:"+r); } main(); ``` # 其他 ## utils.readConfigInt() 读取JSON中的整型数据 @param jsonObject JSON对象 @param key 配置项目 @return 整型,找不到就返回0 ```js function main(){ var testData = utils.readConfigInt(jsonObject,"test_key"); } main(); ``` ## utils.readJSONString() 读取JSON中的字符串数据 @param jsonObject JSON对象 @param key 配置项目 @return 字符串 找不到就返回空字符串 ```js function main(){ var testData = utils.readConfigString(jsonObject,"test_key"); } main(); ``` ## utils.isObjectNull() 判断一个对象为空 @param o 对象 @return true或者false ```js function main(){ var isNull = utils.isObjectNull("test_key"); } main(); ``` ## utils.isObjectNotNull() 判断一个对象不为空 @param o 对象 @return true或者false ```js function main(){ var isNull = utils.isObjectNotNull("test_key"); } main(); ``` ## utils.getRatio() 取得比例,例如10参数,就是返回10%的比例,如果是true,说明随机比例正确,否则不正确 @param ratio 浮点型 1-100 @return true或者false ```js function main(){ var ratio = utils.getRatio(20f); toast(ratio); } main(); ``` ## utils.getRangeInt() 取得某个范围的随机值 @param min 最小值 @param max 最大值 @return 在min和max中间的值,包含最大和最小值 ```js function main(){ var value = utils.getRangeInt(1,100); toast(value); } main(); ``` ## utils.isTrue() 判断布尔型对象是否为真 @param r 布尔型对象 @return true 或者 false ```js function main(){ var value = utils.isTrue(true); } main(); ``` ## utils.fileMd5() 文件的MD5 @param file 文件路径 @return 文件MD5字符串或者null ```js function main(){ var md5 = utils.fileMd5("/sdcard/a.txt"); } main(); ``` ## utils.dataMd5() 数据计算出来的MD5 @param data 数据 @return 数据MD5字符串或者null ```js function main(){ var md5 = utils.dataMd5("data"); } main(); ``` ## utils.randomInt() 随机整型数据 @param length 位数,要随机产生多少位的整型数据 @return 整型 ```js function main(){ var r = utils.randomInt(2); } main(); ``` ## utils.randomCharNumber() 取得随机的数字和字母 @param length 长度 @return 字符串数字混合 ```js function main(){ var r = utils.randomCharNumber(2); } main(); ``` # JSON处理 ## JSON.stringify(object) 格式化对象为JSON字符串 @param 对象 ```js function main(){ var m ={"sss":"a"}; var d =JSON.stringify(m); logd(d); } main(); ``` ## JSON.parse(string) 格式化JSON字符串为对象 @param 字符串 ```js var m = {"sss": "a"}; if (!empty(m)) { var d = JSON.stringify(m); d = JSON.parse(d); logd(d); } else { loge('内容为空,无法转换'); } // 判断值是否为空 function empty(value) { switch (typeof value) { case 'undefined': return true; case 'string': if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true; break; case 'boolean': if (!value) return true; break; case 'number': if (0 === value || isNaN(value)) return true; break; case 'object': if (null === value || value.length === 0) return true; for (var i in value) { return false; } return true; } return false; } ``` # 编码转换 > 以下非官方文档内容 [菜鸟教程:JavaScript 全局函数](https://www.runoob.com/jsref/jsref-obj-global.html) [JavaScript 之url转义](https://www.cnblogs.com/itsharehome/p/10041883.html) ## encodeURI(uri) 把字符串作为 URI 进行编码 对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的: ` , / ? : @ & = + $ # ` (可以使用 encodeURIComponent() 方法分别对特殊含义的 ASCII 标点符号进行编码。) @param uri 必需。一个字符串,含有 URI 或其他要编码的文本。 提示:(通用资源标识符:UniformResourceIdentifier,简称"URI")。 ```js var uri="my test.php?name=ståle&car=saab"; logd(encodeURI(uri)); ``` ## decodeURI(uri) 对 encodeURI() 函数编码过的 URI 进行解码 @param uri 必需。一个字符串,含有要解码的 URI 或其他要解码的文本。 ```js var encodedData = encodeURI('你好,飞云;/?:@&=+$,#'); // encode a string logd(encodedData); var decodedData = decodeURI(encodedData); // decode the string logd(decodedData); ``` ## encodeURIComponent(uri) 把字符串作为 URI 进行编码 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。 其他字符(比如 :;/? : @ & = + $ , # 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。 @param uri 必需。一个字符串,含有 URI 或其他要编码的文本。 ## decodeURIComponent(uri) 对 encodeURIComponent() 函数编码过的 URI 进行解码 @param uri 必需。一个字符串,含有要解码的 URI 或其他要解码的文本。