From a2acc722eb71488733e030eaf865624ca8c1bbf3 Mon Sep 17 00:00:00 2001 From: yinjiacheng Date: Wed, 15 Mar 2023 14:39:18 +0800 Subject: [PATCH] =?UTF-8?q?Android=20uni-usercapturescreen=20=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/index/index.vue | 17 +- .../utssdk/app-android/index.uts | 208 +++++++----------- .../utssdk/interface.uts | 38 +++- 3 files changed, 120 insertions(+), 143 deletions(-) diff --git a/pages/index/index.vue b/pages/index/index.vue index 93847db..fb405a1 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -28,7 +28,8 @@ title: 'Hello', memListener:null, setUserCaptureScreenFlag: false, - setUserCaptureScreenText: '禁止截屏' + setUserCaptureScreenText: '禁止截屏', + permissionGranted: false } }, onLoad() { @@ -142,13 +143,9 @@ // 除android 之外的平台,不需要判断返回状态码 if(res.errCode == -1){ // 启动失败 + that.permissionGranted = true; return ; }else if(res.errCode == 0){ - uni.showToast({ - icon:"none", - title:'截屏监听已开启' - }) - }else { uni.showToast({ icon:"none", title:'捕获截屏事件' @@ -164,7 +161,7 @@ } }); - if (uni.getSystemInfoSync().platform != "android") { + if (uni.getSystemInfoSync().platform != "android" || that.permissionGranted) { // 除android 之外的平台,直接提示监听已开启 uni.showToast({ icon:"none", @@ -198,13 +195,13 @@ uni.setUserCaptureScreen({ enable: flag, success: (res) => { - console.log("setUserCaptureScreen open: " + flag + " success: " + JSON.stringify(res)); + console.log("setUserCaptureScreen enable: " + flag + " success: " + JSON.stringify(res)); }, fail: (res) => { - console.log("setUserCaptureScreen open: " + flag + " fail: " + JSON.stringify(res)); + console.log("setUserCaptureScreen enable: " + flag + " fail: " + JSON.stringify(res)); }, complete: (res) => { - console.log("setUserCaptureScreen open: " + flag + " complete: " + JSON.stringify(res)); + console.log("setUserCaptureScreen enable: " + flag + " complete: " + JSON.stringify(res)); } }); uni.showToast({ diff --git a/uni_modules/uni-usercapturescreen/utssdk/app-android/index.uts b/uni_modules/uni-usercapturescreen/utssdk/app-android/index.uts index 114cde5..2a99ed3 100644 --- a/uni_modules/uni-usercapturescreen/utssdk/app-android/index.uts +++ b/uni_modules/uni-usercapturescreen/utssdk/app-android/index.uts @@ -1,10 +1,4 @@ - - -import { - UTSAndroid -} from "io.dcloud.uts"; - - +import { UTSAndroid } from "io.dcloud.uts"; import ActivityCompat from "androidx.core.app.ActivityCompat"; import Manifest from "android.Manifest"; import PackageManager from "android.content.pm.PackageManager"; @@ -14,167 +8,134 @@ import File from "java.io.File"; import Environment from "android.os.Environment"; import System from 'java.lang.System'; import WindowManager from 'android.view.WindowManager'; -import { SetUserCaptureScreenOption, UserCaptureScreenResult, OnUserCaptureScreen, OffUserCaptureScreen, SetUserCaptureScreen } from "../interface.uts"; - - +import { UserCaptureScreenResult, OnUserCaptureScreenResult, SetUserCaptureScreenOptions, UserCaptureScreenCallback, OnUserCaptureScreen, OffUserCaptureScreen, SetUserCaptureScreen } from "../interface.uts"; /** - * 文件监听器 - */ -let screenOB: ScreenFileObserver | null = null; + * 文件监听器 + */ +let observer : ScreenFileObserver | null = null; /** - * 记录文件监听器上次监听的时间戳,避免重复监听 - */ -let lastFileObserverTime: number = 0; + * 记录文件监听器上次监听的时间戳,避免重复监听 + */ +let lastObserverTime : number = 0; /** - * 图片被捕获的实现 - */ -let imageChange: UTSCallback | null = null; - - - + * 截屏回调 + */ +let listener : UserCaptureScreenCallback | null = null; /** - * android 文件监听实现 - */ -@Suppress("DEPRECATION") + * android 文件监听实现 + */ class ScreenFileObserver extends FileObserver { /** - * 所有截屏文件的存放目录 - */ - allScreen: File; + * 截屏文件目录 + */ + private screenFile : File; - - constructor(screenFile: string) { - super(new File(screenFile)) - this.allScreen = new File(screenFile); - + constructor(screenFile : File) { + super(screenFile); + this.screenFile = screenFile; } - - override onEvent(event: Int, path?: string): void { - + override onEvent(event : Int, path : string | null) : void { // 只监听文件新增事件 if (event == FileObserver.CREATE) { - - let newPath: string = new File(this.allScreen, path!).getPath(); - let currentTime = System.currentTimeMillis(); - - if ((currentTime - lastFileObserverTime) < 1000) { - // 本地截屏行为比上一次超过1000ms,才认为是一个有效的时间 - return; - } - - lastFileObserverTime = System.currentTimeMillis() - let ret = { - errCode:1, - image:newPath + if (path != null) { + const currentTime = System.currentTimeMillis(); + if ((currentTime - lastObserverTime) < 1000) { + // 本地截屏行为比上一次超过1000ms, 才认为是一个有效的时间 + return; + } + lastObserverTime = currentTime; + + const screenShotPath = new File(this.screenFile, path).getPath(); + const res : OnUserCaptureScreenResult = { + errCode: 0, + errMsg: "onUserCaptureScreen:ok", + errSubject: "uni-onUserCaptureScreen", + path: screenShotPath + } + listener?.(res); } - - imageChange!(ret); } } } - - - - - - - /** - * 开启截图监听 - */ -@Suppress("DEPRECATION") -export const onUserCaptureScreen : OnUserCaptureScreen = function (callback : UTSCallback) { - - // 检查相关权限是否已经具备 - if (ActivityCompat.checkSelfPermission(UTSAndroid.getUniActivity()!, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - // 不具备权限,申请权限,并且告知用户监听失败 - ActivityCompat.requestPermissions(UTSAndroid.getUniActivity()!, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1001) - + * 开启截图监听 + */ +export const onUserCaptureScreen : OnUserCaptureScreen = function (callback : UserCaptureScreenCallback | null) { + // 检查相关权限是否已授予 + if (ActivityCompat.checkSelfPermission(UTSAndroid.getAppContext()!, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + // 无权限,申请权限,并且告知用户监听失败 + ActivityCompat.requestPermissions(UTSAndroid.getUniActivity()!, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1001); // 因权限缺失导致监听失败 - let ret = { - errCode:-1 + const res : OnUserCaptureScreenResult = { + errCode: -1, + errMsg: "onUserCaptureScreen:permission denied", + errSubject: "uni-onUserCaptureScreen" } - callback(ret); - return ; + callback?.(res); + return; } - - imageChange = callback; - let directory_screenshot: File; - // 找到设备存放截屏文件的目录 - let directory_pictures = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES); - let directory_dcim = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DCIM); - + // 更新监听 + listener = callback; + + let directory_screenshot : File; if (Build.MANUFACTURER.toLowerCase() === "xiaomi") { - directory_screenshot = new File(directory_dcim, "Screenshots"); + // @Suppress("DEPRECATION") + directory_screenshot = new File(new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DCIM), "Screenshots"); } else { - directory_screenshot = new File(directory_pictures, "Screenshots"); + // @Suppress("DEPRECATION") + directory_screenshot = new File(new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES), "Screenshots"); } - - if (screenOB != null) { - screenOB!.stopWatching() - } - //开始监听 - screenOB = new ScreenFileObserver(directory_screenshot.path) - screenOB!.startWatching() - - // 监听成功 - let ret = { - errCode:0 - } - callback(ret); - + // 先结束监听 再开启监听 + observer?.stopWatching(); + observer = new ScreenFileObserver(directory_screenshot); + observer?.startWatching(); } - /** - * 关闭截屏监听 - */ -export const offUserCaptureScreen : OffUserCaptureScreen = function (callback : UTSCallback) { - - // android 10以上,关闭监听通过移除文件监听器实现 - if (screenOB != null) { - screenOB!.stopWatching() - screenOB = null - } - lastFileObserverTime = 0; - - callback({}); + * 关闭截屏监听 + */ +export const offUserCaptureScreen : OffUserCaptureScreen = function (_ : UserCaptureScreenCallback | null) { + // android10以上,关闭监听通过移除文件监听器实现 + observer?.stopWatching(); + observer = null; + lastObserverTime = 0; } /** - * 设置是否禁止截屏 - */ -export const setUserCaptureScreen : SetUserCaptureScreen = function (option: SetUserCaptureScreenOption) { + * 设置是否禁止截屏 + */ +export const setUserCaptureScreen : SetUserCaptureScreen = function (option : SetUserCaptureScreenOptions) { // 切换到UI线程 UTSAndroid.getUniActivity()?.runOnUiThread(new SetUserCaptureScreenRunnable(option.enable)); - const res = new UserCaptureScreenResult(); - res.errCode = 0; - res.errMsg = "setUserCaptureScreen:ok"; - res.errSubject = "uni-setUserCaptureScreen"; + const res : UserCaptureScreenResult = { + errCode: 0, + errMsg: "setUserCaptureScreen:ok", + errSubject: "uni-setUserCaptureScreen" + } option.success?.(res); option.complete?.(res); } class SetUserCaptureScreenRunnable extends Runnable { - + /** - * ture: 允许用户截屏 - * false: 不允许用户截屏,防止用户截屏到应用页面内容 - */ - private enable: boolean; + * ture: 允许用户截屏 + * false: 不允许用户截屏,防止用户截屏到应用页面内容 + */ + private enable : boolean; - constructor(enable: boolean) { + constructor(enable : boolean) { super(); this.enable = enable; } - override run(): void { + override run() : void { if (this.enable) { UTSAndroid.getUniActivity()?.getWindow()?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE); } else { @@ -182,6 +143,3 @@ class SetUserCaptureScreenRunnable extends Runnable { } } } - - - diff --git a/uni_modules/uni-usercapturescreen/utssdk/interface.uts b/uni_modules/uni-usercapturescreen/utssdk/interface.uts index 64b72e2..b0bb95a 100644 --- a/uni_modules/uni-usercapturescreen/utssdk/interface.uts +++ b/uni_modules/uni-usercapturescreen/utssdk/interface.uts @@ -16,7 +16,28 @@ export type UserCaptureScreenResult = { errMsg : string, } -export type SetUserCaptureScreenOption = { +export type OnUserCaptureScreenResult = { + /** + * 错误码 + * 0:成功 + * -1:permission denied(仅Android返回) + */ + errCode : number, + /** + * 调用API的名称 + */ + errSubject : string, + /** + * 错误的详细信息 + */ + errMsg : string, + /** + * 截屏文件路径(仅Android返回) + */ + path : string | null +} + +export type SetUserCaptureScreenOptions = { /** * true: 允许用户截屏 false: 不允许用户截屏,防止用户截屏到应用页面内容 */ @@ -35,25 +56,27 @@ export type SetUserCaptureScreenOption = { complete ?: (res : UserCaptureScreenResult) => void } +export type UserCaptureScreenCallback = (res : OnUserCaptureScreenResult) => void + /** * 开启截屏监听 * - * @param {UTSCallback} callback + * @param {UserCaptureScreenCallback} callback * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#onusercapturescreen * @platforms APP-IOS = ^9.0,APP-ANDROID = ^22 * @since 3.6.8 */ -export type OnUserCaptureScreen = (callback ?: UTSCallback) => void +export type OnUserCaptureScreen = (callback : UserCaptureScreenCallback | null) => void /** * 关闭截屏监听 * - * @param {UTSCallback} callback + * @param {UserCaptureScreenCallback} callback * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#offusercapturescreen * @platforms APP-IOS = ^9.0,APP-ANDROID = ^22 * @since 3.6.8 */ -export type OffUserCaptureScreen = (callback ?: UTSCallback) => void +export type OffUserCaptureScreen = (callback : UserCaptureScreenCallback | null) => void /** * 设置防截屏 @@ -63,11 +86,10 @@ export type OffUserCaptureScreen = (callback ?: UTSCallback) => void * @platforms APP-IOS = ^9.0,APP-ANDROID = ^22 * @since 3.7.3 */ -export type SetUserCaptureScreen = (options : SetUserCaptureScreenOption) => void +export type SetUserCaptureScreen = (options : SetUserCaptureScreenOptions) => void interface uni { onUserCaptureScreen : OnUserCaptureScreen, offUserCaptureScreen : OffUserCaptureScreen, setUserCaptureScreen : SetUserCaptureScreen -} - +} -- GitLab