Skip to content

API Function

下载apk方法

函数封装

ts
class nativeAPI {
    /**
    * 本地下载api封装
    * @param {*} parameter
    * parameter: {   // 下载地址(http/https)开头
    *     url:文件下载地址,网络连接
    *     fileName:保存本地的文件夹名称(下载后保存到该文件夹内)
    *     appName:文件名称(下载的文件名称)
    * }
    * @param {*} callback (文件下载的进度条进度)(下载成功后返回的对象)
    */
    downLoadApi(parameter, callback) {
        // 创建下载接口
        const dtask = plus.downloader.createDownload(
            // 下载地址
            parameter.url,
            // 本地文件地址(安卓手机路径)
            {
                filename: `file://storage/emulated/0/${parameter.fileName}/${parameter.appName}`,
            },
            function (r, status) {
                if (status == 200) {
                    // 下载成功
                } else {
                    //status为200表示下载成功
                    // 则表示下载失败
                    console.log("下载失败", r);
                    plus.downloader.clear(); //清除下载任务
                }
            }
        );

        // 保存上一次的进度条进度变化的值
        let copyProgress = "";

        // 监听下载进度(每次下载进度变化便会执行一次该回调)
        dtask.addEventListener("statechanged", (task) => {
            // 如果监听对象不存在,则直接退出
            if (!dtask) return;

            /**
             * task.state: 状态:1,2,3,4
             * 1. 表示开始下载
             * 2. 链接到服务器
             * 3. 下载中 (监听进度进度)
             * 4. 下载完成
             */
            switch (task.state) {
                case 3:
                    // 计算下载进度比列
                    const progress = Math.floor(
                        (task.downloadedSize / task.totalSize) * 100
                    );
                    /**
                     * 起因:一样的进度值会多次执行
                     * 解决方法:保留上一次的进度值和目前进度值进行对比,如果相同,表示重复执行立即退出,否则为最新进度,对比参数同步更新
                     */
                    if (copyProgress == progress) return;
                    copyProgress = progress;
                    // 如果进度值为100者退出执行 让其进度下一个判断
                    if (progress == 100) return;
                    callback && callback({ progress, path: "下载中,下载后可获取文件路径" });
                    break;

                case 4:
                    // 状态码为4表示当前下载完成,恢复对比参数
                    copyProgress = "";
                    // 执行完回调函数 (progress: 为进度条进度 )(path为下载后的文件路径)
                    callback && callback({ progress: 100, path: task.filename });
                    break;
            }
        });

        // 开始下载
        dtask.start();
    }

    /**
     * 查找文件是否存在
     * @param {*} callback 
     * callback: {   // 下载地址(http/https)开头
     *     path:文件下载地址,网络连接
     *     success:()=>{}    查询成功后调取的回调函数
     *     fail:()=>{}       查询失败后调取的回调函数
     * }
     */
    lookupFile(callback) {
        plus.io.getFileInfo({
            // 查询的文件路径
            filePath: callback.path,
            // 查询成功
            success: (res) => {
                callback && callback.success && callback.success({ status: 200, size: Number(res.size) / 1024 });
            },
            // 查询失败
            fail: (r) => {
                callback && callback.fail && callback.fail({ status: 201, msg: "文件不存在", ...r });
            },
        });
    }

    /**
     * 调起手机app安装
     * @param {*} path 安装的app路径
     */
    installApp(path) {
        // plus.runtime.openFile(`file://storage/emulated/0/${path}`);
        plus.runtime.openFile(path);
    }

     /**
     * 权限申请
     * @param {*} callback 回调函数(在存储条件允许的情况下执行该函数)
     */
    PermissionApplication(callback) {
        plus.android.requestPermissions(['android.permission.WRITE_EXTERNAL_STORAGE'], function (e) {
            if (e.deniedAlways.length > 0) { //权限被永久拒绝
                // 弹出提示框解释为何需要读写手机储存权限,引导用户打开设置页面开启
                uni.showModal({
                    title: '存储权限',
                    content: '您拒绝了存储权限,请前往设置-应用开启存储权限。',
                    success: function (res) {
                        if (res.confirm) {
                            // console.log('用户点击确定');
                        } else if (res.cancel) {
                            // console.log('用户点击取消');
                        }
                    }
                });
            }

            if (e.deniedPresent.length > 0) { //权限被临时拒绝
                // 弹出提示框解释为何需要读写手机储存权限,可再次调用plus.android.requestPermissions申请权限
                plus.android.requestPermissions(['android.permission.WRITE_EXTERNAL_STORAGE'])
            }

            if (e.granted.length > 0) { //权限被允许
                //调用依赖获取读写手机储存权限的代码
                callback && callback();
            }
        });
    }
}

使用方法

ts
  // 查看当前app是否存在
  nativeAPI.lookupFile({
    // 文件路径
    path: `file://storage/emulated/0/${'LUKES后台管理/LUKES后台管理.apk'}`,
    success(res) {
      // 查询到文件返回文件信息
      // console.log(res, "文件查找成功");
    },
    fail(r) {
      // 没有该文件
      // console.log(res, "文件不存在");
    }
  });


   // 安装app方法
   nativeAPI.installApp(`file://storage/emulated/0/${'LUKES后台管理/LUKES后台管理.apk'}`);

   // 下载app方法
   nativeAPI.downLoadApi(
       {
       // 下载app地址 (下载地址(http/https)开头)(网络连接)
         url: "https://vip.123pan.cn/1818386522/%E6%B········",
       // 创建本地文件并保存到(fileName属性值)文件夹中  (自定义文件夹,并把下载好的文件放到当前文件夹中)
         fileName: "LUKES后台管理",
       // 文件名称
         appName: "LUKES后台管理.apk",
       },
       (res) => {
           // res ==> res.progress (进度条进度)
           // res ==> res.path (当前文件地址)

           // 进度条为100时,表示下载成功
         if (res.progress == 100) {
           // 调起手机安装程序  安装app
           nativeAPI.installApp(res.path);
         }
       }
   );

设置剪切板内容

ts
/**
 * 复制文本内容
 * @param {*} text 复制的文本
 * @param {*} [callback] 复制完成后的回调函数 => { return text } 返回复制的文本内容
 */
setCopy(text, callback) {
    uni.setClipboardData({
        data: text,
        showToast: false,
        success() { callback && callback(text) }
    });
}

获取剪切板内容

ts
/**
 * 保存文件到本地
 * @param {*} path 文件链接 
 */
addFile(path) {
    uni.saveFile({
        tempFilePath: path,
        success(res) {
            console.log(res);
        }
    });
}

保存文件到本地

ts
/**
 * 保存文件到本地
 * @param {*} path 文件链接 
 */
addFile(path) {
    uni.saveFile({
        tempFilePath: path,
        success(res) {
            console.log(res);
        }
    });
}

保存图片到相册

ts
/**
 * 保存图片到相册
 * @param {*} url 需要保存的图片地址
 * @param {*} [callback] 保存成功后的回调函数
 */
savePick(url, callback) {
    uni.saveImageToPhotosAlbum({
        filePath: url,
        success: (res) => {
            callback && callback(res);
            this.msgInfo("保存成功,请到相册中查看");
        }
    });
}

预览图片

ts
/**
 * 预览图片
 * @param {*} imgsArr 预览图片的数组 (图片集合)
 * @param {*} [itemList] 长安图片的菜单栏 例如:['发送给朋友', '保存图片', '收藏']
 * @param {*} [callback] 点击某一个菜单栏的回调函数 (返回点击的按钮以及图片索引)
 * @param {*} [rej] 返回错误信息
 */
pickyl(current, imgsArr, itemList = ["暂无功能"], callback, rej) {
    let _this = this;
    uni.previewImage({
        // 当前图片索引
        current,
        // 图片集合
        urls: imgsArr,
        indicator: "number",
        longPressActions: {
            itemList: ['保存图片'],
            // itemList: itemList,
            success: (data) => {
                // 用户点击的当前图片
                const downImg = imgsArr[data.index];
                _this.downLoad(downImg, () => { }, { img: true });
                // callback && callback({
                //     // '选中了第' + (data.tapIndex + 1) + '个按钮
                //     btnIndex: data.tapIndex + 1,
                //     // 第' + (data.index + 1) + '张图片'
                //     imgIndex: data.index + 1,
                // })
                // console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
            },
            fail(err) { rej && rej(err) }
        }
    });
}

选择图片

ts
/**
 * 选择图片 
 * @param {*} num 选择的张数
 * @param {*} optionType 从哪里选择 (1.表示从相册选图 2.相机拍照 3.两者都有)
 * @param {*} [oss] 是否转换为oss格式 (Boolean)
 * @param {*} [callback] 图片选取后的回调函数
 */
optionsImg(num = 9, optionType, callback, oss) {
    let _this = this;
    // 判断需要的类型
    let arr = optionType == 1 ? ["album"] : optionType == 2 ? ["camera"] : ["album", "camera"];
    uni.chooseImage({
        count: num, //默认可以选择9张图片
        sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
        sourceType: arr, //从相册选择
        success: async (res) => {
            if (oss) {
                let arr = await _this.picKImgs(res.tempFilePaths)
                callback && callback(arr);
                return
            }
            callback && callback(res.tempFilePaths)
        },
    });
}

图片转换为oss

ts
// 图片转换为oss [res为数组,包含多张图片路径]
async picKImgs(res) {
    // 文件名称
    let name = appInst.getStore("info").nickname || "新用户";
    // 转换后的路径
    let newImgs = []
    for (const item of res) {
        let img = await uploadImg({ path: item, name });
        // 判断是否转换成功
        if (img.success) {
            newImgs.push(img.fileID)
            console.log(img.fileID);
        }
        // 判断是否把所有的图片都成功的转为oss
        if (res.length == newImgs.length) {
            return newImgs;
        }
    }
}

查看图片信息

ts
/**
 * 查看图片信息
 * @param {*} url 图片地址
 * @param {*} callback 成功后的回调函数 return(图片信息)
 */
imgInfo(url, callback) {
    uni.getImageInfo({
        src: url,
        success: (res) => callback && callback(res)
    });
}

图片下载

ts
/**
 * 图片下载
 * @param {*} url 文件地址
 * @param {*} callback 下载后的回调函数
 */
downLoad(url, callback, setting) {
    let _this = this;
    uni.downloadFile({
        url,
        success: (res) => {
            callback && callback(res)
            if (setting.img) {
                // 保存到相册中
                _this.savePick(res.tempFilePath);
            }
        },
        fail(err) {
            console.log(err);
        }
    });
}

判断手机号码是否正确

ts
/**
 * 判断手机号码是否正确
 * @param {*} num 手机号码
 * @returns 
 */
isTel(num) {
    let tel = /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1589]))\d{8}$/;
    return tel.test(num)
}

截取字符串个数

ts
/**
 * 截取字符串个数
 * @param {*} str 要截取的字符串
 * @param {*} num 要截取字符串的个数
 * @returns 
 */
interceptStr(str, num) {
    return str.length > num ? `${str.slice(0, num)}...` : str;
}

获取用户当前地址

ts
/**
 * 获取用户当前地址
 * @param {*} callback 回调函数 返回结果 
 */
getAddress(callback) {
    uni.getLocation({
        type: "gcj02", //返回可以用于uni.openLocation的经纬度
        geocode: true,
        success: (res) => {
            callback && callback(res.address);
        }
    })
}

获取缓存中的数据

ts
/**
 * 获取缓存中的数据
 * @param {*} name 
 */
getStore(name) {
    return uni.getStorageSync(name);
}

设置本地缓存

ts
/**
 * 设置本地缓存
 * @param {*} name 键名
 * @param {*} val 键值
 */
setStore(name, val) {
    uni.setStorageSync(name, val);
}

指纹识别

ts
/**
 * 指纹识别
 */
checkIsSupportSoterAuthentication() {
    // #ifdef APP-PLUS || MP-WEIXIN
    uni.checkIsSupportSoterAuthentication({
        success(res) {
            console.log(res);
            // 如果当前设备支持生物识别方式,且支持指纹识别方式
            if (res.supportMode && res.supportMode.includes("fingerPrint")) {
                /**
                 * uni.checkIsSoterEnrolledInDevice : 获取设备内是否录入指纹信息
                 *  checkAuthMode: 'fingerPrint', // 检验指纹信息
                 * */
                uni.checkIsSoterEnrolledInDevice({
                    checkAuthMode: "fingerPrint", // 检验指纹信息
                    success(res) {
                        console.log(res.isEnrolled);
                        if (res.isEnrolled == true) {
                            /**
                             * 开始 SOTER 生物认证
                             * 执行成功,进行后续操作
                             * */
                            uni.startSoterAuthentication({
                                requestAuthModes: ["fingerPrint"],
                                challenge: "123456",
                                // authContent: "请用指纹解锁",
                                success(res) {
                                    console.log(res);
                                    uni.showToast({
                                        title: "识别成功",
                                        duration: 5000,
                                        icon: "none",
                                    });
                                    //指纹识别成功后,进行后续工作
                                },
                                fail(err) {
                                    console.log(err, "66666666666666666");
                                },
                                complete(res) {
                                    console.log(res);
                                },
                            });
                            uni.hideLoading();
                        } else {
                            this.result = "此设备未录入指纹,请到设置中开启";
                        }
                    },
                    fail(err) {
                        uni.showModal({
                            title: "温馨提示",
                            content: "此设备未录入指纹,请到设置中开启",
                            showCancel: false,
                            success: function (res) {
                                // 进行后续逻辑
                            },
                        });
                    },
                });
            } else {
                this.result = "此设备不支持指纹识别功能";
            }
        },
        fail(err) {
            uni.showModal({
                title: "温馨提示",
                content: "此设备不支持指纹识别功能",
                showCancel: false,
                success: function (res) {
                    // 进行后续逻辑
                },
            });
        },
    });
    // #endif
    // #ifndef APP-PLUS || MP-WEIXIN
    this.result = "此平台不支持指纹识别";
    // #endif
}
ts
/**
 * 本地静态资源链接 (仅仅浏览器可用)
 * @param {*} url 本地资源地址
 * @returns 
 */
getPick(url) {
    return new URL(`../static/${url}`,
        import.meta.url).href;
}

跳转首页

ts
/**
 * 跳转首页
 * @param {*} url 页面路径
 * @param {*} [callback] 跳转完成后的回调函数 
 */
tab(url, callback) {
    uni.switchTab({
        url,
        success: () => callback && callback(),
        fail: (err) => {
            console.log(err);
        }
    });
}

没有记录的跳转 (关闭所有页面)

ts
/**
 * 没有记录的跳转 (关闭所有页面) 没有记录
 * @param {*} url 页面路径
 * @param {*} [callback] 跳转完成后的回调函数 
 */
noJL(url, callback) {
    uni.reLaunch({
        url,
        success: () => callback && callback(),
        fail: (err) => {
            console.log(err);
        }
    })
}

没有记录的跳转 (关闭当前页面)

ts
/**
 * 没有记录的跳转 (关闭当前页面) 没有记录
 * @param {*} url 页面路径
 * @param {*} [callback] 跳转完成后的回调函数 
 */
toOne(url, callback) {
    uni.redirectTo({
        url,
        success: () => callback && callback(),
        fail: (err) => {
            console.log(err);
        }
    })
}

跳转到某一个页面 (非tabbar页面)

ts
/**
 * 跳转到某一个页面 (非tabbar页面)
 * @param {*} url 页面路径
 * @param {*} [callback] 跳转完成后的回调函数 
 */
to(url, callback) {
    uni.navigateTo({
        url,
        success: () => callback && callback()
    })
    // this.shock()
}

返回上个页面,后退

ts
/**
 * 返回上个页面,后退
 * @param {*} [num] <string/number> (后退的步数) 
 */
last(num = 1, callback) {
    uni.navigateBack({ delta: num });
    this.delay(() => callback && callback(), 100);
}

提示信息

ts
/**
 * 提示信息
 * @param {*} title 提示的内容
 * @param {*} icon  警示图标
 * @param {*} [callback] 跳转完成后的回调函数 
 */
msgInfo(title, icon = "none", duration = 2500) {
    uni.showToast({
        title,
        icon: "none",
        duration
    });
}

隐藏提示信息

ts
/** 隐藏提示信息 **/
hide() {
    uni.hideToast();
}

手机震动

ts
/**
 * 手机震动
 * @param {*} [callback] 震动完成后的回调函数
 */
shock(callback) {
    uni.vibrateShort({ success: () => callback && callback() });
}

双击事件封装

ts
/**
 * 双击事件封装
 * @param hander 回调函数 {
 * click:单机时执行
 * doubleClick:双击时执行
 * }
 * @param time 执行时间,默认300毫秒后执行
 * @returns null
 */
double(hander: { click: Function, doubleClick: Function}, time = 300) {
  // 清除定时器
  clearTimeout(doubleTapTime);
  // 判断该属性是否存在 ,如果_this.sum不存在,者指定默认值
  let doubleSumTap = uni.getStorageSync("doubleSumTap") as any;
  doubleSumTap = doubleSumTap == "undefined" ? 0 : doubleSumTap;
  // 当前索引增加
  doubleSumTap++;
  // 修改缓存的数据
  uni.setStorageSync("doubleSumTap", doubleSumTap);
  // 判断是否到达预设的时间
  doubleTapTime = setTimeout(() => {
    // 单击
    if(doubleSumTap == 1) hander.click();
    // 双击执行完成
    if (doubleSumTap == 2) hander.doubleClick();
    // 清除缓存
    uni.removeStorageSync("doubleSumTap");
    // 默认值
    doubleSumTap = 0;
  }, time);
}

Copyright © 2026 Luke