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

feat: uni-installApk

上级 21aa9c23
......@@ -20,47 +20,53 @@
<button @tap="testonMemoryWarning">开启内存不足告警监听</button>
<button @tap="testoffMemoryWarning">关闭内存不足告警监听</button>
<button @tap="getLocationTest" style="width: 100%;">获取定位</button>
<button type="default" @click="handleInstallApk">安装apk</button>
</view>
</template>
<script>
import {
installApk
} from "@/uni_modules/uni-installApk"
export default {
data() {
return {
memListener:null,
memListener: null,
setUserCaptureScreenFlag: false,
setUserCaptureScreenText: '禁止截屏',
permissionGranted: false,
id:0
id: 0
}
},
onLoad() {
},
methods: {
onMemoryWarning:function(res){
onMemoryWarning: function(res) {
console.log(res);
},
fn:function(res){
fn: function(res) {
console.log(res)
},
getLocationTest() {
console.log(" ------- getLocationTest: ");
uni.getLocation({
type: 'gcj02 ',
success (res) {
console.log(" success ",res);
},fail (res) {
console.log(" fail ",res);
success(res) {
console.log(" success ", res);
},
fail(res) {
console.log(" fail ", res);
}
})
},
onGetWifiList2_assert0() {
console.log(" ------- onGetWifiList2_assert0: ",this.id);
console.log(" ------- onGetWifiList2_assert0: ", this.id);
const fn = res => console.log('onGetWifiList res', res)
uni.startWifi({success(){
uni.startWifi({
success() {
uni.onGetWifiList(fn)
uni.getWifiList({
success() {
......@@ -69,19 +75,20 @@
uni.stopWifi({
success() {},
fail(e) {
console.log("stopWifi fail: ",e);
console.log("stopWifi fail: ", e);
}
})
}
})
}
})
}})
this.id++
},
testConnnectWifi(){
testConnnectWifi() {
uni.startWifi({
success:(res)=> {
success: (res) => {
console.log("success: " + JSON.stringify(res));
// uni.connectWifi({
// maunal:false,
......@@ -91,9 +98,11 @@
// console.log(res);
// }
// });
},fail:(res)=>{
},
fail: (res) => {
console.log("fail: " + JSON.stringify(res));
},complete:(res)=>{
},
complete: (res) => {
console.log("complete: " + JSON.stringify(res));
}
})
......@@ -101,47 +110,49 @@
},
testGetConnnectWifi(){
testGetConnnectWifi() {
uni.getConnectedWifi({
partialInfo:false,
complete:(res)=>{
partialInfo: false,
complete: (res) => {
console.log(res);
if (res.errCode == 0) {
uni.showToast({
icon:'none',
title:res.wifi.SSID
icon: 'none',
title: res.wifi.SSID
})
} else{
} else {
uni.showToast({
icon:'none',
title:res.errMsg
icon: 'none',
title: res.errMsg
})
}
}
});
},
testStartWifi(){
testStartWifi() {
uni.startWifi({
success:(res)=> {
success: (res) => {
console.log("success: " + JSON.stringify(res));
// wifi 开启成功后,注册wifi链接状态监听和wifi列表获取监听
uni.onGetWifiList(function(res){
uni.onGetWifiList(function(res) {
console.log("onGetWifiList");
console.log(res);
});
uni.onWifiConnected(function(res){
uni.onWifiConnected(function(res) {
console.log("onWifiConnected");
console.log(res);
});
uni.onWifiConnectedWithPartialInfo(function(res){
uni.onWifiConnectedWithPartialInfo(function(res) {
console.log("onWifiConnectedWithPartialInfo");
console.log(res);
});
},fail:(res)=>{
},
fail: (res) => {
console.log("fail: " + JSON.stringify(res));
},complete:(res)=>{
},
complete: (res) => {
console.log("complete: " + JSON.stringify(res));
}
})
......@@ -151,11 +162,13 @@
uni.offWifiConnectedWithPartialInfo()
uni.stopWifi({
success:(res)=> {
success: (res) => {
console.log("success: " + JSON.stringify(res));
},fail:(res)=>{
},
fail: (res) => {
console.log("fail: " + JSON.stringify(res));
},complete:(res)=>{
},
complete: (res) => {
console.log("complete: " + JSON.stringify(res));
}
})
......@@ -163,18 +176,20 @@
},
testGetWifiList() {
uni.getWifiList({
success:(res)=> {
success: (res) => {
console.log("success: " + JSON.stringify(res));
},fail:(res)=>{
},
fail: (res) => {
console.log("fail: " + JSON.stringify(res));
},complete:(res)=>{
},
complete: (res) => {
console.log("complete: " + JSON.stringify(res));
}
})
},
testOffGetWifiList(){
testOffGetWifiList() {
uni.offGetWifiList()
},
......@@ -183,15 +198,15 @@
testonMemoryWarning() {
uni.onMemoryWarning(this.onMemoryWarning)
uni.showToast({
icon:'none',
title:'已监听,注意控制台输出'
icon: 'none',
title: '已监听,注意控制台输出'
})
},
testoffMemoryWarning(){
testoffMemoryWarning() {
uni.offMemoryWarning(this.onMemoryWarning)
uni.showToast({
icon:'none',
title:'监听已移除'
icon: 'none',
title: '监听已移除'
})
},
testScreenShotListen() {
......@@ -199,8 +214,8 @@
uni.onUserCaptureScreen(function(res) {
console.log(res);
uni.showToast({
icon:"none",
title:'捕获截屏事件'
icon: "none",
title: '捕获截屏事件'
})
that.screenImage = res.path
});
......@@ -208,8 +223,8 @@
if (uni.getSystemInfoSync().platform != "android" || that.permissionGranted) {
// 除android 之外的平台,直接提示监听已开启
uni.showToast({
icon:"none",
title:'截屏监听已开启'
icon: "none",
title: '截屏监听已开启'
})
}
},
......@@ -219,8 +234,8 @@
});
// 提示已经开始监听,注意观察
uni.showToast({
icon:"none",
title:'截屏监听已关闭'
icon: "none",
title: '截屏监听已关闭'
})
},
testGetBatteryInfo() {
......@@ -245,17 +260,19 @@
uni.setUserCaptureScreen({
enable: flag,
success: (res) => {
console.log("setUserCaptureScreen enable: " + flag + " success: " + JSON.stringify(res));
console.log("setUserCaptureScreen enable: " + flag + " success: " + JSON.stringify(
res));
},
fail: (res) => {
console.log("setUserCaptureScreen enable: " + flag + " fail: " + JSON.stringify(res));
},
complete: (res) => {
console.log("setUserCaptureScreen enable: " + flag + " complete: " + JSON.stringify(res));
console.log("setUserCaptureScreen enable: " + flag + " complete: " + JSON.stringify(
res));
}
});
uni.showToast({
icon:"none",
icon: "none",
title: this.setUserCaptureScreenText
});
this.setUserCaptureScreenFlag = !this.setUserCaptureScreenFlag;
......@@ -265,6 +282,15 @@
this.setUserCaptureScreenText = '禁止截屏';
}
},
handleInstallApk() {
installApk({
filePath: "/sdcard/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/ddd.apk",
// filePath:"/static/ddd.apk",
complete(res) {
console.log(res);
}
})
},
}
}
</script>
......
{
"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.
先完成此消息的编辑!
想要评论请 注册