Android 在React Native应用程序中禁用屏幕捕获/屏幕截图
我遇到了一些针对ios和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);
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
您可以添加以下行。通过setFlagFLAG\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]代码>
capture
标志设置为YES时通知
[[UIScreen mainScreen]addObserver:self forKeyPath:@“捕获”选项:NSKeyValueObservingOptionNew context:nil]代码>在中使用选项完成启动
。
这就结束了iOS端的更改
现在,您需要在.js文件中添加侦听器,以通知iOS正在发送的消息。一旦收到通知,就由你决定如何处理。大致如下所示
及
render(){
if(this.state.screenscapture){
//显示微调器
返回
}
返回(
)
}
我愿意接受对这篇文章进行修改的建议。如果这篇文章对你有帮助,别忘了投票。谢谢你的回复。IOS呢?你至少可以提到我们应该把那行代码放在哪里。这个答案不够清楚,你没有说明我们应该把那行代码放在哪里@BurimSyla请看我的答案,以获得该行代码的确切位置。你能解释一下iOS解决方案的作用吗?在我的应用程序上,它只会使应用程序淡入白色屏幕,使应用程序从背景中“unscreenshottable”,但是你仍然能够在应用程序中截图如何处理这个问题,例如,如果转到安全消息截图不可用,否则应该可用。此解决方案仅在应用程序位于后台时有效。对于我来说,当用户截图时,不会调用applicationWillResignActiveimport 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 ... />
)
}