Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在React Native应用程序中禁用屏幕捕获/屏幕截图_Android_Ios_Reactjs_React Native_Screenshot - Fatal编程技术网

Android 在React Native应用程序中禁用屏幕捕获/屏幕截图

Android 在React Native应用程序中禁用屏幕捕获/屏幕截图,android,ios,reactjs,react-native,screenshot,Android,Ios,Reactjs,React Native,Screenshot,我遇到了一些针对ios和Android的解决方案,以防止截屏和截图。但是如何在react native中禁用屏幕捕获?防止捕获屏幕 安卓 通过设置安全标志防止捕获屏幕 getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);

我遇到了一些针对ios和Android的解决方案,以防止截屏和截图。但是如何在react native中禁用屏幕捕获?

防止捕获屏幕

安卓

通过设置安全标志防止捕获屏幕

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
如果要删除安全标志

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
安卓 内部
/android/app/src/main/java/com/{Project_Name}/MainActivity.java

您可以添加以下行。通过setFlag
FLAG\u SECURE
防止捕获屏幕,以下面的代码为例:


导入android.os.Bundle;
导入android.view.WindowManager;
...
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG\u安全,WindowManager.LayoutParams.FLAG\u安全);
}
稍后,当您要删除安全标志时

getWindow().clearFlags(WindowManager.LayoutParams.FLAG\u安全);
网间网操作系统 在
AppDelegate.m
中覆盖屏幕,以以下示例为例:

-(void)应用程序将重新指定:(UIApplication*)应用程序{
//用我们自己的颜色填充屏幕
UIView*colorView=[[UIView alloc]initWithFrame:self.window.frame];
colorView.backgroundColor=[UIColor whiteColor];
colorView.tag=1234;
colorView.alpha=0;
[self.window addSubview:colorView];
[self.window将子视图带到前面:colorView];
//淡入视野
[UIView animateWithDuration:0.5动画:^{
colorView.alpha=1;
}];
}
-(无效)应用IDBECOMEACTIVE:(UIApplication*)应用{
//请参考我们的彩色视图
UIView*colorView=[self.window view with tag:1234];
//从主视图淡出彩色视图
[UIView animateWithDuration:0.5动画:^{
colorView.alpha=0;
}完成:^(布尔完成){
//完成褪色后移除
[彩色视图从SuperView移除];
}];
}
在android中

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

写一些导入语句

import android.os.Bundle;
import android.view.WindowManager;
通过在MainActivity类中设置下面的代码来防止捕获屏幕

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

因此,在本机平台上构建iOS端几乎没有什么工作。因此,请耐心阅读以下方法

我正在使用react原生视频包播放媒体。我的要求是显示微调器,如果用户启用了屏幕录制

  • 据我了解,
    captured
    属性设置为YES。我在AppDelegate.m中的
    didfishlaunchingwithoptions
    方法下添加了observer

    [[UIScreen mainScreen]添加观察者:自分叉路径:@“捕获”选项:NSKeyValueObservingOptionNew context:nil]

  • 由于RN允许与本机模块通信,所以我决定添加网桥,以便在
    capture
    标志设置为YES时通知

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

    h

    并添加
    [[UIScreen mainScreen]addObserver:self forKeyPath:@“捕获”选项:NSKeyValueObservingOptionNew context:nil]
    中使用选项完成启动
    。 这就结束了iOS端的更改

  • 现在,您需要在.js文件中添加侦听器,以通知iOS正在发送的消息。一旦收到通知,就由你决定如何处理。大致如下所示
  • render(){
    if(this.state.screenscapture){
    //显示微调器
    返回
    }
    返回(
    )
    }
    

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

    谢谢你的回复。IOS呢?你至少可以提到我们应该把那行代码放在哪里。这个答案不够清楚,你没有说明我们应该把那行代码放在哪里@BurimSyla请看我的答案,以获得该行代码的确切位置。你能解释一下iOS解决方案的作用吗?在我的应用程序上,它只会使应用程序淡入白色屏幕,使应用程序从背景中“unscreenshottable”,但是你仍然能够在应用程序中截图如何处理这个问题,例如,如果转到安全消息截图不可用,否则应该可用。此解决方案仅在应用程序位于后台时有效。对于我来说,当用户截图时,不会调用applicationWillResignActive
    import android.os.Bundle如果用户尝试截图,在AndroidDos capture属性的顶部添加这一行将为真?@DhruvilShah您应该试试。我尝试了屏幕录制,其效果如预期。@Naren我尝试了您的解决方案,但不起作用,您能否在functional中共享react native side的代码component@vijaykahar明白这一点。React native和iOS可以使用网桥进行通信。当您从iOS接收到React Native的标志时,您可以在redux中设置该标志,该标志将阻止应用程序重新加载。在react的类文件中,添加mapStateToProps以从redux获取更新的值。我不能共享代码,但如果您共享您的代码,我可以检查。显示最近的问题未定义的符号:_OBJC_CLASS_$\u ScreenCaptureNotification在Xcode 12.2上获取此错误
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if ([keyPath isEqualToString:@"captured"]){
          NSLog(@"Screen Capture is Enabled");
          RCTLog(@"Screen Capture is Enabled");
          if (@available(iOS 11.0, *)) {
            ScreenCaptureNotification *manager = [ScreenCaptureNotification allocWithZone: nil];
            [manager isScreenCaptureEnabled:UIScreen.mainScreen.isCaptured];
          }
        }
    }
    
      addListener() {  
        let bridge = new NativeEventEmitter(NativeModules.ScreenCaptureNotification);
    
        this.screenCaptureEnabled = bridge.addListener("isScreenCaptureEnabled",res => { 
          this.setState({ screenCapture: true })
        })
      }
    
    render() {
      if (this.state.screenCapture) {
         //Show spinner
         return <Spinner />
      }
      return (
      <Vido uri ... /> 
      )
    }