常用函数
# 说明
工具类模块函数主要是跟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 或其他要解码的文本。