提交 3b1c15d7 编写于 作者: taohebin@dcloud.io's avatar taohebin@dcloud.io

feat: uni-installApk

上级 21aa9c23
<template> <template>
<view class="content"> <view class="content">
<button @tap="testStartWifi" style="width: 100%;">初始化wifi模块</button> <button @tap="testStartWifi" style="width: 100%;">初始化wifi模块</button>
<button @tap="testGetWifiList" style="width: 100%;">获取当前wifi列表</button> <button @tap="testGetWifiList" style="width: 100%;">获取当前wifi列表</button>
<button @tap="testOffGetWifiList" style="width: 100%;">移除wifi列表监听</button> <button @tap="testOffGetWifiList" style="width: 100%;">移除wifi列表监听</button>
<button @tap="testGetConnnectWifi" style="width: 100%;">获取当前连接的wifi</button> <button @tap="testGetConnnectWifi" style="width: 100%;">获取当前连接的wifi</button>
<button @tap="testConnnectWifi" style="width: 100%;">链接wifi</button> <button @tap="testConnnectWifi" style="width: 100%;">链接wifi</button>
<button @tap="testStopWifi" style="width: 100%;">关闭wifi模块</button> <button @tap="testStopWifi" style="width: 100%;">关闭wifi模块</button>
<button @tap="onGetWifiList2_assert0" style="width: 100%;">onGetWifiList2_assert0</button> <button @tap="onGetWifiList2_assert0" style="width: 100%;">onGetWifiList2_assert0</button>
<button @tap="testScreenShotListen">开启截屏监听</button> <button @tap="testScreenShotListen">开启截屏监听</button>
<button @tap="testScreenShotOff">关闭截屏监听</button> <button @tap="testScreenShotOff">关闭截屏监听</button>
<button @tap="testSetUserCaptureScreen">{{setUserCaptureScreenText}}</button> <button @tap="testSetUserCaptureScreen">{{setUserCaptureScreenText}}</button>
<button @tap="testGetBatteryInfo">获取电池电量</button> <button @tap="testGetBatteryInfo">获取电池电量</button>
<button @tap="testGetBatteryInfoSync">同步获取电池电量</button> <button @tap="testGetBatteryInfoSync">同步获取电池电量</button>
<button @tap="testonMemoryWarning">开启内存不足告警监听</button> <button @tap="testonMemoryWarning">开启内存不足告警监听</button>
<button @tap="testoffMemoryWarning">关闭内存不足告警监听</button> <button @tap="testoffMemoryWarning">关闭内存不足告警监听</button>
<button @tap="getLocationTest" style="width: 100%;">获取定位</button> <button @tap="getLocationTest" style="width: 100%;">获取定位</button>
<button type="default" @click="handleInstallApk">安装apk</button>
</view>
</template> </view>
</template>
<script>
<script>
export default { import {
data() { installApk
return { } from "@/uni_modules/uni-installApk"
memListener:null,
setUserCaptureScreenFlag: false, export default {
setUserCaptureScreenText: '禁止截屏', data() {
permissionGranted: false, return {
id:0 memListener: null,
} setUserCaptureScreenFlag: false,
}, setUserCaptureScreenText: '禁止截屏',
onLoad() { permissionGranted: false,
id: 0
}, }
methods: { },
onMemoryWarning:function(res){ onLoad() {
console.log(res);
}, },
fn:function(res){ methods: {
console.log(res) onMemoryWarning: function(res) {
}, console.log(res);
getLocationTest() { },
console.log(" ------- getLocationTest: "); fn: function(res) {
uni.getLocation({ console.log(res)
type: 'gcj02 ', },
success (res) { getLocationTest() {
console.log(" success ",res); console.log(" ------- getLocationTest: ");
},fail (res) { uni.getLocation({
console.log(" fail ",res); type: 'gcj02 ',
} success(res) {
}) console.log(" success ", res);
}, },
onGetWifiList2_assert0() { fail(res) {
console.log(" ------- onGetWifiList2_assert0: ",this.id); console.log(" fail ", res);
const fn = res => console.log('onGetWifiList res', res) }
uni.startWifi({success(){ })
uni.onGetWifiList(fn) },
uni.getWifiList({ onGetWifiList2_assert0() {
success() { console.log(" ------- onGetWifiList2_assert0: ", this.id);
console.log('getWifiList success'); const fn = res => console.log('onGetWifiList res', res)
uni.offGetWifiList(fn) uni.startWifi({
uni.stopWifi({ success() {
success() {}, uni.onGetWifiList(fn)
fail(e) { uni.getWifiList({
console.log("stopWifi fail: ",e); success() {
} console.log('getWifiList success');
}) uni.offGetWifiList(fn)
} uni.stopWifi({
}) success() {},
}}) fail(e) {
this.id++ console.log("stopWifi fail: ", e);
}, }
})
testConnnectWifi(){ }
})
uni.startWifi({ }
success:(res)=> { })
console.log("success: " + JSON.stringify(res)); this.id++
// uni.connectWifi({ },
// maunal:false,
// SSID:"Xiaomi_20D0", testConnnectWifi() {
// password:"BBB111",
// complete:(res)=>{ uni.startWifi({
// console.log(res); success: (res) => {
// } console.log("success: " + JSON.stringify(res));
// }); // uni.connectWifi({
},fail:(res)=>{ // maunal:false,
console.log("fail: " + JSON.stringify(res)); // SSID:"Xiaomi_20D0",
},complete:(res)=>{ // password:"BBB111",
console.log("complete: " + JSON.stringify(res)); // complete:(res)=>{
} // console.log(res);
}) // }
// });
},
fail: (res) => {
}, console.log("fail: " + JSON.stringify(res));
testGetConnnectWifi(){ },
uni.getConnectedWifi({ complete: (res) => {
partialInfo:false, console.log("complete: " + JSON.stringify(res));
complete:(res)=>{ }
console.log(res); })
if (res.errCode == 0) {
uni.showToast({
icon:'none',
title:res.wifi.SSID },
}) testGetConnnectWifi() {
} else{ uni.getConnectedWifi({
uni.showToast({ partialInfo: false,
icon:'none', complete: (res) => {
title:res.errMsg console.log(res);
}) if (res.errCode == 0) {
} uni.showToast({
icon: 'none',
} title: res.wifi.SSID
}); })
}, } else {
testStartWifi(){ uni.showToast({
uni.startWifi({ icon: 'none',
success:(res)=> { title: res.errMsg
console.log("success: " + JSON.stringify(res)); })
// wifi 开启成功后,注册wifi链接状态监听和wifi列表获取监听 }
uni.onGetWifiList(function(res){
console.log("onGetWifiList"); }
console.log(res); });
}); },
uni.onWifiConnected(function(res){ testStartWifi() {
console.log("onWifiConnected"); uni.startWifi({
console.log(res); success: (res) => {
}); console.log("success: " + JSON.stringify(res));
uni.onWifiConnectedWithPartialInfo(function(res){ // wifi 开启成功后,注册wifi链接状态监听和wifi列表获取监听
console.log("onWifiConnectedWithPartialInfo"); uni.onGetWifiList(function(res) {
console.log(res); console.log("onGetWifiList");
}); console.log(res);
});
},fail:(res)=>{ uni.onWifiConnected(function(res) {
console.log("fail: " + JSON.stringify(res)); console.log("onWifiConnected");
},complete:(res)=>{ console.log(res);
console.log("complete: " + JSON.stringify(res)); });
} uni.onWifiConnectedWithPartialInfo(function(res) {
}) console.log("onWifiConnectedWithPartialInfo");
}, console.log(res);
testStopWifi() { });
uni.offWifiConnected()
uni.offWifiConnectedWithPartialInfo() },
fail: (res) => {
uni.stopWifi({ console.log("fail: " + JSON.stringify(res));
success:(res)=> { },
console.log("success: " + JSON.stringify(res)); complete: (res) => {
},fail:(res)=>{ console.log("complete: " + JSON.stringify(res));
console.log("fail: " + JSON.stringify(res)); }
},complete:(res)=>{ })
console.log("complete: " + JSON.stringify(res)); },
} testStopWifi() {
}) uni.offWifiConnected()
uni.offWifiConnectedWithPartialInfo()
},
testGetWifiList() { uni.stopWifi({
uni.getWifiList({ success: (res) => {
success:(res)=> { console.log("success: " + JSON.stringify(res));
console.log("success: " + JSON.stringify(res)); },
},fail:(res)=>{ fail: (res) => {
console.log("fail: " + JSON.stringify(res)); console.log("fail: " + JSON.stringify(res));
},complete:(res)=>{ },
console.log("complete: " + JSON.stringify(res)); complete: (res) => {
} console.log("complete: " + JSON.stringify(res));
}) }
})
},
},
testOffGetWifiList(){ testGetWifiList() {
uni.offGetWifiList() uni.getWifiList({
}, success: (res) => {
console.log("success: " + JSON.stringify(res));
},
fail: (res) => {
testonMemoryWarning() { console.log("fail: " + JSON.stringify(res));
uni.onMemoryWarning(this.onMemoryWarning) },
uni.showToast({ complete: (res) => {
icon:'none', console.log("complete: " + JSON.stringify(res));
title:'已监听,注意控制台输出' }
}) })
},
testoffMemoryWarning(){ },
uni.offMemoryWarning(this.onMemoryWarning)
uni.showToast({ testOffGetWifiList() {
icon:'none', uni.offGetWifiList()
title:'监听已移除' },
})
},
testScreenShotListen() {
var that = this; testonMemoryWarning() {
uni.onUserCaptureScreen(function(res) { uni.onMemoryWarning(this.onMemoryWarning)
console.log(res); uni.showToast({
uni.showToast({ icon: 'none',
icon:"none", title: '已监听,注意控制台输出'
title:'捕获截屏事件' })
}) },
that.screenImage = res.path testoffMemoryWarning() {
}); uni.offMemoryWarning(this.onMemoryWarning)
uni.showToast({
if (uni.getSystemInfoSync().platform != "android" || that.permissionGranted) { icon: 'none',
// 除android 之外的平台,直接提示监听已开启 title: '监听已移除'
uni.showToast({ })
icon:"none", },
title:'截屏监听已开启' testScreenShotListen() {
}) var that = this;
} uni.onUserCaptureScreen(function(res) {
}, console.log(res);
testScreenShotOff() { uni.showToast({
uni.offUserCaptureScreen(function(res) { icon: "none",
console.log(res); title: '捕获截屏事件'
}); })
// 提示已经开始监听,注意观察 that.screenImage = res.path
uni.showToast({ });
icon:"none",
title:'截屏监听已关闭' if (uni.getSystemInfoSync().platform != "android" || that.permissionGranted) {
}) // 除android 之外的平台,直接提示监听已开启
}, uni.showToast({
testGetBatteryInfo() { icon: "none",
uni.getBatteryInfo({ title: '截屏监听已开启'
success(res) { })
console.log(res); }
uni.showToast({ },
title: "当前电量:" + res.level + '%', testScreenShotOff() {
icon: 'none' uni.offUserCaptureScreen(function(res) {
}); console.log(res);
} });
}) // 提示已经开始监听,注意观察
}, uni.showToast({
icon: "none",
testGetBatteryInfoSync() { title: '截屏监听已关闭'
let ret = uni.getBatteryInfoSync() })
console.log(ret) },
}, testGetBatteryInfo() {
uni.getBatteryInfo({
testSetUserCaptureScreen() { success(res) {
let flag = this.setUserCaptureScreenFlag; console.log(res);
uni.setUserCaptureScreen({ uni.showToast({
enable: flag, title: "当前电量:" + res.level + '%',
success: (res) => { icon: 'none'
console.log("setUserCaptureScreen enable: " + flag + " success: " + JSON.stringify(res)); });
}, }
fail: (res) => { })
console.log("setUserCaptureScreen enable: " + flag + " fail: " + JSON.stringify(res)); },
},
complete: (res) => { testGetBatteryInfoSync() {
console.log("setUserCaptureScreen enable: " + flag + " complete: " + JSON.stringify(res)); let ret = uni.getBatteryInfoSync()
} console.log(ret)
}); },
uni.showToast({
icon:"none", testSetUserCaptureScreen() {
title: this.setUserCaptureScreenText let flag = this.setUserCaptureScreenFlag;
}); uni.setUserCaptureScreen({
this.setUserCaptureScreenFlag = !this.setUserCaptureScreenFlag; enable: flag,
if (this.setUserCaptureScreenFlag) { success: (res) => {
this.setUserCaptureScreenText = '允许截屏'; console.log("setUserCaptureScreen enable: " + flag + " success: " + JSON.stringify(
} else { res));
this.setUserCaptureScreenText = '禁止截屏'; },
} fail: (res) => {
}, console.log("setUserCaptureScreen enable: " + flag + " fail: " + JSON.stringify(res));
} },
} complete: (res) => {
</script> console.log("setUserCaptureScreen enable: " + flag + " complete: " + JSON.stringify(
res));
<style> }
.content { });
display: flex; uni.showToast({
flex-direction: column; icon: "none",
align-items: center; title: this.setUserCaptureScreenText
justify-content: center; });
} this.setUserCaptureScreenFlag = !this.setUserCaptureScreenFlag;
if (this.setUserCaptureScreenFlag) {
.logo { this.setUserCaptureScreenText = '允许截屏';
height: 200rpx; } else {
width: 200rpx; this.setUserCaptureScreenText = '禁止截屏';
margin-top: 200rpx; }
margin-left: auto; },
margin-right: auto; handleInstallApk() {
margin-bottom: 50rpx; installApk({
} filePath: "/sdcard/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/ddd.apk",
// filePath:"/static/ddd.apk",
.text-area { complete(res) {
display: flex; console.log(res);
justify-content: center; }
} })
},
.title { }
font-size: 36rpx; }
color: #8f8f94; </script>
}
</style> <style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>
\ No newline at end of file
{
"id": "uni-installApk",
"displayName": "uni-installApk",
"version": "1.0.0",
"description": "uni-installApk",
"keywords": [
"uni-installApk"
],
"repository": "",
"engines": {
"HBuilderX": "^3.6.8"
},
"dcloudext": {
"type": "uts",
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "",
"data": "",
"permissions": ""
},
"npmurl": ""
},
"uni_modules": {
"dependencies": [],
"uni-ext-api": {
"uni": {
"installApk": {
"name": "installApk",
"app": {
"js": false,
"kotlin": true,
"swift": false
}
}
}
},
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "u",
"aliyun": "u"
},
"client": {
"Vue": {
"vue2": "u",
"vue3": "u"
},
"App": {
"app-android": "u",
"app-ios": "u"
},
"H5-mobile": {
"Safari": "u",
"Android Browser": "u",
"微信浏览器(Android)": "u",
"QQ浏览器(Android)": "u"
},
"H5-pc": {
"Chrome": "u",
"IE": "u",
"Edge": "u",
"Firefox": "u",
"Safari": "u"
},
"小程序": {
"微信": "u",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u",
"钉钉": "u",
"快手": "u",
"飞书": "u",
"京东": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}
\ No newline at end of file
# uni-installApk
### 开发文档
[UTS 语法](https://uniapp.dcloud.net.cn/tutorial/syntax-uts.html)
[UTS API插件](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html)
[UTS 组件插件](https://uniapp.dcloud.net.cn/plugin/uts-component.html)
[Hello UTS](https://gitcode.net/dcloud/hello-uts)
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
package="io.dcloud.uni.installApk">
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
</manifest>
\ No newline at end of file
import { InstallApkOptions, InstallApkSuccess } from "../interface.uts"
import Intent from 'android.content.Intent';
import Build from 'android.os.Build';
import File from 'java.io.File';
import FileProvider from 'androidx.core.content.FileProvider';
import Context from 'android.content.Context';
import Uri from 'android.net.Uri';
export function installApk(options : InstallApkOptions) : void {
const context = UTSAndroid.getAppContext() as Context
const filePath = UTSAndroid.convert2AbsFullPath(options.filePath)
const apkFile = new File(filePath)
if (!apkFile.exists() && !apkFile.isFile()) {
let error = new UniError("uni-installApk", -1, "filePath is illegal");
options.fail?.(error)
options.complete?.(error)
return
}
const intent = new Intent()
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.setAction(Intent.ACTION_VIEW)
if (Build.VERSION.SDK_INT >= 24) {
const authority = context.getPackageName() + ".dc.fileprovider"
const apkUri = FileProvider.getUriForFile(context, authority, apkFile)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
}
context.startActivity(intent)
const success : InstallApkSuccess = {
message: "success"
}
options.success?.(success)
options.complete?.(success)
}
\ No newline at end of file
export interface Uni {
/**
* installApk()
* @description
* 安装apk
* @param {InstallApkOptions}
* @return {void}
* @uniPlatform {
* "app": {
* "android": {
* "osVer": "4.4",
* "uniVer": "3.96+",
* "unixVer": "3.96+"
* },
* "ios": {
* "osVer": "x",
* "uniVer": "x",
* "unixVer": "x"
* }
* }
* }
* @example
```typescript
uni.installApk({
filePath: "/xx/xx/xx.apk",
complete: (res: any) => {
console.log("complete => " + JSON.stringify(res));
}
});
```
*/
installApk(options : InstallApkOptions) : void
}
export type InstallApkSuccess = {
/**
* 安装成功消息
*/
message : string
}
export type InstallApkComplete = any
export type InstallApkSuccessCallback = (res : InstallApkSuccess) => void
export type InstallApkFailCallback = (err : UniError) => void
export type InstallApkCompleteCallback = (res : InstallApkComplete) => void
export type InstallApkOptions = {
/**
* apk文件地址
*/
filePath : string,
/**
* 接口调用成功的回调函数
* @defaultValue null
*/
success ?: InstallApkSuccessCallback | null,
/**
* 接口调用失败的回调函数
* @defaultValue null
*/
fail ?: InstallApkFailCallback | null,
/**
* 接口调用结束的回调函数(调用成功、失败都会执行)
* @defaultValue null
*/
complete ?: InstallApkCompleteCallback | null
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册