From 5a508ff28569069918256958bd9ee78d6fbfcca5 Mon Sep 17 00:00:00 2001 From: duqingquan Date: Fri, 17 Mar 2023 12:24:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99=E7=9A=84?= =?UTF-8?q?=E6=88=AA=E5=B1=8F=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uni-usercapturescreen/changelog.md | 4 - uni_modules/uni-usercapturescreen/index.d.ts | 18 -- .../uni-usercapturescreen/package.json | 88 ---------- uni_modules/uni-usercapturescreen/readme.md | 15 -- .../utssdk/app-android/index.uts | 145 ---------------- .../utssdk/app-ios/index.uts | 163 ------------------ .../utssdk/interface.uts | 97 ----------- .../utssdk/mp-weixin/index.js | 7 - .../utssdk/app-android/index.uts | 11 +- 9 files changed, 1 insertion(+), 547 deletions(-) delete mode 100644 uni_modules/uni-usercapturescreen/changelog.md delete mode 100644 uni_modules/uni-usercapturescreen/index.d.ts delete mode 100644 uni_modules/uni-usercapturescreen/package.json delete mode 100644 uni_modules/uni-usercapturescreen/readme.md delete mode 100644 uni_modules/uni-usercapturescreen/utssdk/app-android/index.uts delete mode 100644 uni_modules/uni-usercapturescreen/utssdk/app-ios/index.uts delete mode 100644 uni_modules/uni-usercapturescreen/utssdk/interface.uts delete mode 100644 uni_modules/uni-usercapturescreen/utssdk/mp-weixin/index.js diff --git a/uni_modules/uni-usercapturescreen/changelog.md b/uni_modules/uni-usercapturescreen/changelog.md deleted file mode 100644 index 22c87fe..0000000 --- a/uni_modules/uni-usercapturescreen/changelog.md +++ /dev/null @@ -1,4 +0,0 @@ -## 1.0.1(2022-10-27) -修改插件描述 -## 1.0.0(2022-10-26) -支持安卓、iOS、微信小程序平台 diff --git a/uni_modules/uni-usercapturescreen/index.d.ts b/uni_modules/uni-usercapturescreen/index.d.ts deleted file mode 100644 index debf1a1..0000000 --- a/uni_modules/uni-usercapturescreen/index.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -declare namespace UniNamespace { - type OnUserCaptureScreenCallback = (res?: { errMsg: string }) => void -} - -declare interface Uni { - /** - * 监听用户主动截屏事件,用户使用系统截屏按键截屏时触发此事件。 - * - * 文档: [https://uniapp.dcloud.net.cn/api/system/capture-screen.html#onusercapturescreen](https://uniapp.dcloud.net.cn/api/system/capture-screen.html#onusercapturescreen) - */ - onUserCaptureScreen(callback: UniNamespace.OnUserCaptureScreenCallback): void; - /** - * 用户主动截屏事件。取消事件监听。 - * - * 文档: [https://uniapp.dcloud.net.cn/api/system/capture-screen.html#offusercapturescreen](https://uniapp.dcloud.net.cn/api/system/capture-screen.html#offusercapturescreen) - */ - offUserCaptureScreen(callback: UniNamespace.OnUserCaptureScreenCallback): void; -} diff --git a/uni_modules/uni-usercapturescreen/package.json b/uni_modules/uni-usercapturescreen/package.json deleted file mode 100644 index 461dc0a..0000000 --- a/uni_modules/uni-usercapturescreen/package.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "id": "uni-usercapturescreen", - "displayName": "uni-usercapturescreen", - "version": "1.0.1", - "description": "用户主动截屏事件监听", - "keywords": [ - "截屏" - ], - "repository": "", - "engines": { - "HBuilderX": "^3.6.0" - }, - "dcloudext": { - "type": "uts", - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "插件不采集任何数据", - "permissions": "无" - }, - "npmurl": "" - }, - "uni_modules": { - "uni-ext-api":{ - "uni": { - "onUserCaptureScreen": "onUserCaptureScreen", - "offUserCaptureScreen": "offUserCaptureScreen", - "setUserCaptureScreen": "setUserCaptureScreen" - } - }, - "dependencies": [], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "Vue": { - "vue2": "n", - "vue3": "y" - }, - "App": { - "app-android": "y", - "app-ios": "y" - }, - "H5-mobile": { - "Safari": "n", - "Android Browser": "n", - "微信浏览器(Android)": "n", - "QQ浏览器(Android)": "n" - }, - "H5-pc": { - "Chrome": "n", - "IE": "n", - "Edge": "n", - "Firefox": "n", - "Safari": "n" - }, - "小程序": { - "微信": "y", - "阿里": "n", - "百度": "n", - "字节跳动": "n", - "QQ": "n", - "钉钉": "n", - "快手": "n", - "飞书": "n", - "京东": "n" - }, - "快应用": { - "华为": "n", - "联盟": "n" - } - } - } - } -} diff --git a/uni_modules/uni-usercapturescreen/readme.md b/uni_modules/uni-usercapturescreen/readme.md deleted file mode 100644 index e5702ca..0000000 --- a/uni_modules/uni-usercapturescreen/readme.md +++ /dev/null @@ -1,15 +0,0 @@ -# uni-usercapturescreen - -用户主动截屏事件监听 - -### uni.onUserCaptureScreen - -监听用户主动截屏事件,用户使用系统截屏按键截屏时触发此事件。 - -> 使用文档:[https://uniapp.dcloud.net.cn/api/system/capture-screen.html#onusercapturescreen](https://uniapp.dcloud.net.cn/api/system/capture-screen.html#onusercapturescreen) - -### uni.offUserCaptureScreen - -用户主动截屏事件。取消事件监听。 - -> 使用文档:[https://uniapp.dcloud.net.cn/api/system/capture-screen.html#offusercapturescreen](https://uniapp.dcloud.net.cn/api/system/capture-screen.html#offusercapturescreen) diff --git a/uni_modules/uni-usercapturescreen/utssdk/app-android/index.uts b/uni_modules/uni-usercapturescreen/utssdk/app-android/index.uts deleted file mode 100644 index 13fba35..0000000 --- a/uni_modules/uni-usercapturescreen/utssdk/app-android/index.uts +++ /dev/null @@ -1,145 +0,0 @@ -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"; -import Build from "android.os.Build"; -import FileObserver from "android.os.FileObserver"; -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 { UserCaptureScreenResult, OnUserCaptureScreenResult, SetUserCaptureScreenOptions, UserCaptureScreenCallback, OnUserCaptureScreen, OffUserCaptureScreen, SetUserCaptureScreen } from "../interface.uts"; - -/** - * 文件监听器 - */ -let observer : ScreenFileObserver | null = null; -/** - * 记录文件监听器上次监听的时间戳,避免重复监听 - */ -let lastObserverTime : number = 0; -/** - * 截屏回调 - */ -let listener : UserCaptureScreenCallback | null = null; - -/** - * android 文件监听实现 - */ -class ScreenFileObserver extends FileObserver { - - /** - * 截屏文件目录 - */ - private screenFile : File; - - constructor(screenFile : File) { - super(screenFile); - this.screenFile = screenFile; - } - - override onEvent(event : Int, path : string | null) : void { - // 只监听文件新增事件 - if (event == FileObserver.CREATE) { - 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); - } - } - } -} - -/** - * 开启截图监听 - */ -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); - // 因权限缺失导致监听失败 - const res : OnUserCaptureScreenResult = { - errCode: -1, - errMsg: "onUserCaptureScreen:permission denied", - errSubject: "uni-onUserCaptureScreen" - } - callback?.(res); - return; - } - - // 更新监听 - listener = callback; - - let directory_screenshot : File; - if (Build.MANUFACTURER.toLowerCase() == "xiaomi") { - // @Suppress("DEPRECATION") - directory_screenshot = new File(new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DCIM), "Screenshots"); - } else { - // @Suppress("DEPRECATION") - directory_screenshot = new File(new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES), "Screenshots"); - } - // 先结束监听 再开启监听 - observer?.stopWatching(); - observer = new ScreenFileObserver(directory_screenshot); - observer?.startWatching(); -} - -/** - * 关闭截屏监听 - */ -export const offUserCaptureScreen : OffUserCaptureScreen = function (_ : UserCaptureScreenCallback | null) { - // android10以上,关闭监听通过移除文件监听器实现 - observer?.stopWatching(); - observer = null; - lastObserverTime = 0; -} - -/** - * 设置是否禁止截屏 - */ -export const setUserCaptureScreen : SetUserCaptureScreen = function (option : SetUserCaptureScreenOptions) { - // 切换到UI线程 - UTSAndroid.getUniActivity()?.runOnUiThread(new SetUserCaptureScreenRunnable(option.enable)); - 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; - - constructor(enable : boolean) { - super(); - this.enable = enable; - } - - override run() : void { - if (this.enable) { - UTSAndroid.getUniActivity()?.getWindow()?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE); - } else { - UTSAndroid.getUniActivity()?.getWindow()?.addFlags(WindowManager.LayoutParams.FLAG_SECURE); - } - } -} diff --git a/uni_modules/uni-usercapturescreen/utssdk/app-ios/index.uts b/uni_modules/uni-usercapturescreen/utssdk/app-ios/index.uts deleted file mode 100644 index f197ffe..0000000 --- a/uni_modules/uni-usercapturescreen/utssdk/app-ios/index.uts +++ /dev/null @@ -1,163 +0,0 @@ -import { NotificationCenter } from 'Foundation'; -import { CGRect } from "CoreFoundation"; -import { UIApplication, UIView, UITextField, UIScreen, UIDevice } from "UIKit" -import { UTSiOS } from "DCloudUTSFoundation" -import { DispatchQueue } from 'Dispatch'; -import { SetUserCaptureScreenOptions, UserCaptureScreenResult, OnUserCaptureScreen, OffUserCaptureScreen, SetUserCaptureScreen, UserCaptureScreenCallback, OnUserCaptureScreenResult } from "../interface.uts" - -/** - * 定义监听截屏事件工具类 - */ -class CaptureScreenTool { - static listener : UserCaptureScreenCallback | null; - static secureView : UIView | null; - - // 监听截屏 - static listenCaptureScreen(callback : UserCaptureScreenCallback | null) { - this.listener = callback - - // 注册监听截屏事件及回调方法 - // target-action 回调方法需要通过 Selector("方法名") 构建 - const method = Selector("userDidTakeScreenshot") - NotificationCenter.default.addObserver(this, selector = method, name = UIApplication.userDidTakeScreenshotNotification, object = null) - } - - // 捕获截屏回调的方法 - // target-action 的方法前需要添加 @objc 前缀 - @objc static userDidTakeScreenshot() { - // 回调 - const res: OnUserCaptureScreenResult = { - errCode: 0, - errSubject: "uni-usercapturescreen", - errMsg: "onUserCaptureScreen: ok", - path: null - } - this.listener?.(res) - } - - // 移除监听事件 - static removeListen(callback : UserCaptureScreenCallback | null) { - this.listener = null - NotificationCenter.default.removeObserver(this) - const res: OnUserCaptureScreenResult = { - errCode: 0, - errSubject: "uni-usercapturescreen", - errMsg: "offUserCaptureScreen: ok", - path: null - } - callback?.(res) - } - - static createSecureView() : UIView | null { - let field = new UITextField(frame = CGRect.zero) - field.isSecureTextEntry = true - if (field.subviews.length > 0 && UIDevice.current.systemVersion != '15.1') { - let view = field.subviews[0] - view.subviews.forEach((item) => { - item.removeFromSuperview() - }) - view.isUserInteractionEnabled = true - return view - } - return null - } - - // 开启防截屏 - static onAntiScreenshot(option : SetUserCaptureScreenOptions) { - // uts方法默认会在子线程中执行,涉及 UI 操作必须在主线程中运行,通过 DispatchQueue.main.async 方法可将代码在主线程中运行 - DispatchQueue.main.async(execute = () : void => { - let secureView = this.createSecureView() - let window = UTSiOS.getKeyWindow() - let rootView = window.rootViewController == null ? null : window.rootViewController!.view - if (secureView != null && rootView != null) { - let rootSuperview = rootView!.superview - if (rootSuperview != null) { - this.secureView = secureView - rootSuperview!.addSubview(secureView!) - rootView!.removeFromSuperview() - secureView!.addSubview(rootView!) - let rect = rootView!.frame - secureView!.frame = UIScreen.main.bounds - rootView!.frame = rect - } - } - let res: UserCaptureScreenResult = { - errCode: 0, - errSubject: "uni-usercapturescreen", - errMsg: "setUserCaptureScreen:ok" - } - option.success?.(res) - option.complete?.(res) - }) - } - - // 关闭防截屏 - static offAntiScreenshot(option : SetUserCaptureScreenOptions) { - DispatchQueue.main.async(execute = () : void => { - if (this.secureView != null) { - let window = UTSiOS.getKeyWindow() - let rootView = window.rootViewController == null ? null : window.rootViewController!.view - if (rootView != null && this.secureView!.superview != null) { - let rootSuperview = this.secureView!.superview - if (rootSuperview != null) { - rootSuperview!.addSubview(rootView!) - this.secureView!.removeFromSuperview() - } - } - this.secureView = null - } - let res: UserCaptureScreenResult = { - errCode: 0, - errSubject: "uni-usercapturescreen", - errMsg: "setUserCaptureScreen:ok" - } - option.success?.(res) - option.complete?.(res) - }) - } -} - -/** - * 开启截图监听 - */ -export const onUserCaptureScreen : OnUserCaptureScreen = function (callback : UserCaptureScreenCallback | null) { - CaptureScreenTool.listenCaptureScreen(callback) -} - -/** - * 关闭截屏监听 - */ -export const offUserCaptureScreen : OffUserCaptureScreen = function (callback : UserCaptureScreenCallback | null) { - CaptureScreenTool.removeListen(callback) -} - -/** - * 开启/关闭防截屏 - */ -export const setUserCaptureScreen : SetUserCaptureScreen = function (options : SetUserCaptureScreenOptions) { - if (UIDevice.current.systemVersion < "13.0") { - let res: UserCaptureScreenResult = { - errCode: 12001, - errSubject: "uni-usercapturescreen", - errMsg: "setUserCaptureScreen:system not support" - } - options.fail?.(res); - options.complete?.(res); - - } else if (UIDevice.current.systemVersion == "15.1") { - let res: UserCaptureScreenResult = { - errCode: 12010, - errSubject: "uni-usercapturescreen", - errMsg: "setUserCaptureScreen:system internal error" - } - options.fail?.(res); - options.complete?.(res); - } else { - if (options.enable == true) { - CaptureScreenTool.offAntiScreenshot(options) - } else { - CaptureScreenTool.onAntiScreenshot(options) - } - } -} - diff --git a/uni_modules/uni-usercapturescreen/utssdk/interface.uts b/uni_modules/uni-usercapturescreen/utssdk/interface.uts deleted file mode 100644 index d5d744b..0000000 --- a/uni_modules/uni-usercapturescreen/utssdk/interface.uts +++ /dev/null @@ -1,97 +0,0 @@ -export type UserCaptureScreenResult = { - /** - * 错误码 - * 0:成功 - * -1:permission denied - * 12001:system not support - * 12010:system internal error - */ - errCode : number, - /** - * 调用API的名称 - */ - errSubject : string, - /** - * 错误的详细信息 - */ - errMsg : string, -} - -export type OnUserCaptureScreenResult = { - /** - * 错误码 - * 0:成功 - * -1:permission denied(仅Android返回) - */ - errCode : number, - /** - * 调用API的名称 - */ - errSubject : string, - /** - * 错误的详细信息 - */ - errMsg : string, - /** - * 截屏文件路径(仅Android返回) - */ - path : string | null -} - -export type SetUserCaptureScreenOptions = { - /** - * true: 允许用户截屏 false: 不允许用户截屏,防止用户截屏到应用页面内容 - */ - enable : boolean; - /** - * 接口调用成功的回调函数 - */ - success ?: (res : UserCaptureScreenResult) => void, - /** - * 接口调用失败的回调函数 - */ - fail ?: (res : UserCaptureScreenResult) => void, - /** - * 接口调用结束的回调函数(调用成功、失败都会执行) - */ - complete ?: (res : UserCaptureScreenResult) => void -} - -export type UserCaptureScreenCallback = (res : OnUserCaptureScreenResult) => void - -/** - * 开启截屏监听 - * - * @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 : UserCaptureScreenCallback | null) => void - -/** - * 关闭截屏监听 - * - * @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 : UserCaptureScreenCallback | null) => void - -/** - * 设置防截屏 - * - * @param {SetUserCaptureScreenOptions} options - * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#setusercapturescreen - * @platforms APP-IOS = ^9.0,APP-ANDROID = ^22 - * @since 3.7.3 - */ -export type SetUserCaptureScreen = (options : SetUserCaptureScreenOptions) => void - -interface uni { - onUserCaptureScreen : OnUserCaptureScreen, - offUserCaptureScreen : OffUserCaptureScreen, - setUserCaptureScreen : SetUserCaptureScreen -} - diff --git a/uni_modules/uni-usercapturescreen/utssdk/mp-weixin/index.js b/uni_modules/uni-usercapturescreen/utssdk/mp-weixin/index.js deleted file mode 100644 index 6aa57b3..0000000 --- a/uni_modules/uni-usercapturescreen/utssdk/mp-weixin/index.js +++ /dev/null @@ -1,7 +0,0 @@ -export function onUserCaptureScreen (callback) { - return wx.onUserCaptureScreen(callback) -} - -export function offUserCaptureScreen (callback) { - return wx.offUserCaptureScreen(callback) -} diff --git a/uni_modules/uts-screenshot-listener/utssdk/app-android/index.uts b/uni_modules/uts-screenshot-listener/utssdk/app-android/index.uts index 08b08ec..db836a2 100644 --- a/uni_modules/uts-screenshot-listener/utssdk/app-android/index.uts +++ b/uni_modules/uts-screenshot-listener/utssdk/app-android/index.uts @@ -110,7 +110,7 @@ export function onUserCaptureScreen(callback: UserCaptureScreenCallback) { let directory_pictures = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES); let directory_dcim = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DCIM); - if (Build.MANUFACTURER.lowercase() === "xiaomi") { + if (Build.MANUFACTURER.lowercase() == "xiaomi") { directory_screenshot = new File(directory_dcim, "Screenshots"); } else { directory_screenshot = new File(directory_pictures, "Screenshots"); @@ -122,15 +122,6 @@ export function onUserCaptureScreen(callback: UserCaptureScreenCallback) { //开始监听 screenOB = new ScreenFileObserver(directory_screenshot.path) screenOB!.startWatching() - - // 监听成功 - const ret: OnUserCaptureScreenResult = { - errCode: 0, - errSubject: "uni-usercapturescreen", - errMsg: "onUserCaptureScreen:ok", - image: null - } - callback(ret); } -- GitLab