index.uts 4.2 KB

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