index.uts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import { UTSAndroid } from "io.dcloud.uts";
  2. import ActivityCompat from "androidx.core.app.ActivityCompat";
  3. import Manifest from "android.Manifest";
  4. import PackageManager from "android.content.pm.PackageManager";
  5. import Build from "android.os.Build";
  6. import FileObserver from "android.os.FileObserver";
  7. import File from "java.io.File";
  8. import Environment from "android.os.Environment";
  9. import System from 'java.lang.System';
  10. import WindowManager from 'android.view.WindowManager';
  11. import { OnUserCaptureScreenCallbackResult, UserCaptureScreenCallback, OnUserCaptureScreen, OffUserCaptureScreen, SetUserCaptureScreenSuccess, SetUserCaptureScreenOptions, SetUserCaptureScreen } from "../interface.uts";
  12. import string from 'android.R.string';
  13. /**
  14. * 文件监听器
  15. */
  16. let observer : ScreenFileObserver | null = null;
  17. /**
  18. * 记录文件监听器上次监听的时间戳,避免重复监听
  19. */
  20. let lastObserverTime : number = 0;
  21. /**
  22. * 截屏回调
  23. */
  24. let listener : UserCaptureScreenCallback | null = null;
  25. /**
  26. * android 文件监听实现
  27. */
  28. @UTSAndroid.Suppress("DEPRECATION")
  29. class ScreenFileObserver extends FileObserver {
  30. /**
  31. * 截屏文件目录
  32. */
  33. private screenFile : File;
  34. constructor(screenFileStr : string) {
  35. super(screenFileStr);
  36. this.screenFile = new File(screenFileStr);
  37. }
  38. override onEvent(event : Int, path : string | null) : void {
  39. // 只监听文件新增事件
  40. if (event == FileObserver.CREATE) {
  41. if (path != null) {
  42. const currentTime = System.currentTimeMillis();
  43. if ((currentTime - lastObserverTime) < 1000) {
  44. // 本地截屏行为比上一次超过1000ms, 才认为是一个有效的时间
  45. return;
  46. }
  47. lastObserverTime = currentTime;
  48. const screenShotPath = new File(this.screenFile, path).getPath();
  49. const res : OnUserCaptureScreenCallbackResult = {
  50. path: screenShotPath
  51. }
  52. listener?.(res);
  53. }
  54. }
  55. }
  56. }
  57. /**
  58. * 开启截图监听
  59. */
  60. export const onUserCaptureScreen : OnUserCaptureScreen = function (callback : UserCaptureScreenCallback | null) {
  61. // 检查相关权限是否已授予
  62. if (ActivityCompat.checkSelfPermission(UTSAndroid.getAppContext()!, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
  63. // 无权限,申请权限
  64. ActivityCompat.requestPermissions(UTSAndroid.getUniActivity()!, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1001);
  65. return;
  66. }
  67. // 更新监听
  68. listener = callback;
  69. let directory_screenshot : File;
  70. if (Build.MANUFACTURER.toLowerCase() == "xiaomi") {
  71. // @Suppress("DEPRECATION")
  72. directory_screenshot = new File(new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DCIM), "Screenshots");
  73. } else {
  74. // @Suppress("DEPRECATION")
  75. directory_screenshot = new File(new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES), "Screenshots");
  76. }
  77. // 先结束监听 再开启监听
  78. observer?.stopWatching();
  79. observer = new ScreenFileObserver(directory_screenshot.getPath());
  80. observer?.startWatching();
  81. UTSAndroid.onAppActivityDestroy(function(){
  82. observer?.stopWatching()
  83. observer = null
  84. })
  85. }
  86. /**
  87. * 关闭截屏监听
  88. */
  89. export const offUserCaptureScreen : OffUserCaptureScreen = function (_ : UserCaptureScreenCallback | null) {
  90. // android10以上,关闭监听通过移除文件监听器实现
  91. observer?.stopWatching();
  92. observer = null;
  93. lastObserverTime = 0;
  94. }
  95. /**
  96. * 设置是否禁止截屏
  97. */
  98. export const setUserCaptureScreen : SetUserCaptureScreen = function (option : SetUserCaptureScreenOptions) {
  99. // 切换到UI线程
  100. UTSAndroid.getUniActivity()?.runOnUiThread(new SetUserCaptureScreenRunnable(option.enable));
  101. const res : SetUserCaptureScreenSuccess = {}
  102. option.success?.(res);
  103. option.complete?.(res);
  104. }
  105. class SetUserCaptureScreenRunnable extends Runnable {
  106. /**
  107. * ture: 允许用户截屏
  108. * false: 不允许用户截屏,防止用户截屏到应用页面内容
  109. */
  110. private enable : boolean;
  111. constructor(enable : boolean) {
  112. super();
  113. this.enable = enable;
  114. }
  115. override run() : void {
  116. if (this.enable) {
  117. UTSAndroid.getUniActivity()?.getWindow()?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
  118. } else {
  119. UTSAndroid.getUniActivity()?.getWindow()?.addFlags(WindowManager.LayoutParams.FLAG_SECURE);
  120. }
  121. }
  122. }