首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用React本机应用程序中的屏幕捕获/屏幕截图

禁用React本机应用程序中的屏幕捕获/屏幕截图
EN

Stack Overflow用户
提问于 2019-03-05 08:06:49
回答 6查看 28.4K关注 0票数 20

我遇到了几个专门针对ios和Android的解决方案来防止屏幕捕捉和截屏。但是如何禁用本机反应中的屏幕捕捉呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-03-05 08:16:46

安卓

内部/android/app/src/main/java/com/{Project_Name}/MainActivity.java

您可以添加以下行。防止setFlag FLAG_SECURE捕获屏幕,使用下面的代码作为示例:

代码语言:javascript
复制
import android.os.Bundle;
import android.view.WindowManager;

...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}

稍后,当您要删除安全标志时

代码语言:javascript
复制
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);

iOS

AppDelegate.m中的覆盖屏幕为例:

代码语言:javascript
复制
- (void)applicationWillResignActive:(UIApplication *)application {    
    // fill screen with our own colour
    UIView *colourView = [[UIView alloc]initWithFrame:self.window.frame];
    colourView.backgroundColor = [UIColor whiteColor];
    colourView.tag = 1234;
    colourView.alpha = 0;
    [self.window addSubview:colourView];
    [self.window bringSubviewToFront:colourView];
    // fade in the view
    [UIView animateWithDuration:0.5 animations:^{
        colourView.alpha = 1;
    }];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // grab a reference to our coloured view
    UIView *colourView = [self.window viewWithTag:1234];
    // fade away colour view from main view
    [UIView animateWithDuration:0.5 animations:^{
        colourView.alpha = 0;
    } completion:^(BOOL finished) {
        // remove when finished fading
        [colourView removeFromSuperview];
    }];
}
票数 34
EN

Stack Overflow用户

发布于 2020-01-13 17:30:33

因此,iOS端构建在上的工作很少。所以,请耐心地阅读下面的方法。

我使用的反应-本机-视频包播放媒体。如果用户启用了屏幕记录,我的要求是显示旋转器。

  1. https://developer.apple.com/documentation/uikit/uiscreen/2921651-captured?language=objc中,我了解到captured属性设置为YES。我在AppDelegate.m中添加了didFinishLaunchingWithOptions方法下的观察者。 [[UIScreen mainScreen] addObserver:self forKeyPath:@"captured" options:NSKeyValueObservingOptionNew context:nil];
  2. 由于RN允许与本机模块通信,所以我决定在capture标志设置为YES时添加桥通知。

我创建了两个文件ScreenRecordingNotificy.h和.m

.h

代码语言:javascript
复制
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>
#ifndef ScreenCaptureNotification_h
#define ScreenCaptureNotification_h


@interface ScreenCaptureNotification : RCTEventEmitter <RCTBridgeModule>
-(void) isScreenCaptureEnabled:(BOOL)isCaptured;
@end

#endif /* ScreenCaptureNotification_h */

.m看起来就像

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import "ScreenCaptureNotification.h"
#import <React/RCTLog.h>
@implementation ScreenCaptureNotification

+ (id)allocWithZone:(NSZone *)zone {
  static ScreenCaptureNotification *sharedInstance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedInstance = [super allocWithZone:zone];
  });
  return sharedInstance;
}

RCT_EXPORT_MODULE();

- (NSArray<NSString *> *)supportedEvents {
  return @[           
           @"isScreenCaptureEnabled"];
}

-(void) isScreenCaptureEnabled:(BOOL)isCaptured {
  [self sendEventWithName:@"isScreenCaptureEnabled" body:@{@"value": @(isCaptured)}];
}

@end
  1. #import "ScreenCaptureNotification.h"中导入AppDelegate并添加以下方法。
  • (observeValueForKeyPath:(NSString *)keyPath ofObject:(Id)对象更改:(NSDictionary*)更改上下文:(void*)上下文{ if (keyPath isEqualToString:@"captured"){ NSLog(@“已启用屏幕捕获”);RCTLog(@“启用屏幕捕获”);if (@available(iOS 11.0,*)) { ScreenCaptureNotification *manager = ScreenCaptureNotification allocWithZone: 0;manager }

并在[[UIScreen mainScreen] addObserver:self forKeyPath:@"captured" options:NSKeyValueObservingOptionNew context:nil];中添加didFinishLaunchingWithOptions。这就结束了iOS端的更改。

  1. 现在,您需要在.js文件中添加侦听器,以通知iOS发送的通知。一旦你得到通知,就由你决定如何处理它。大致看上去如下所示。

NativeEventEmitter(NativeModules.ScreenCaptureNotification);this.screenCaptureEnabled = bridge.addListener("isScreenCaptureEnabled",res => { this.setState({ screenCapture: true }) }}

代码语言:javascript
复制
render() {
  if (this.state.screenCapture) {
     //Show spinner
     return <Spinner />
  }
  return (
  <Vido uri ... /> 
  )
}

我愿意接受修改这个职位的建议。如果这篇文章对你有帮助的话,别忘了投票。

票数 8
EN

Stack Overflow用户

发布于 2019-03-05 08:11:53

防止捕获屏幕

安卓

防止setFlag安全捕获屏幕

代码语言:javascript
复制
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);

如果您想要删除标志安全

代码语言:javascript
复制
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54998051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档