一、整个项目中禁止截屏与录屏
在android/app/src/main/java/com/your-app-name/MainActivity.java
文件中的onCreate
方法中添加如下代码即可
import android.view.WindowManager; //添加导入WindowManager代码
...
@Override
protected void onCreate(Bundle savedInstanceState) {
SplashScreen.show(this);
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); //添加禁止截屏代码
}
...
参考:https://www.cnblogs.com/imay/p/9603287.html
二、个别页面禁止截屏
1、创建一个原生模块
创建一个新的Java
类并命名为FlagSecureModule.java
,放置到android/app/src/main/java/com/your-app-name/
目录下,其具体代码如下:
package com.your-app-name;//这里写入自己项目名称
import android.util.Log;
import android.widget.Toast;
import android.view.WindowManager;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import java.util.List;
public class FlagSecureModule extends ReactContextBaseJavaModule {
FlagSecureModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "FlagSecure";//标记这个模块,在JavaScript中通过NativeModules.ToastExample访问到这个模块
}
@ReactMethod
public void setFlag() {
//Toast.makeText(getReactApplicationContext(), "setFlag", Toast.LENGTH_SHORT).show();
getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
getCurrentActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE); // 禁止截屏
}
});
}
@ReactMethod
public void clearFlag() {
//Toast.makeText(getReactApplicationContext(), "clearFlag", Toast.LENGTH_SHORT).show();
getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
getCurrentActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); // 禁止截屏
}
});
}
}
2、注册模块
创建一个新的Java
类并命名为CustomFlagSecurePackage.java
,放置到android/app/src/main/java/com/your-app-name/
目录下,其具体代码如下:
package com.your-app-name;//这里写入自己项目名称
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CustomFlagSecurePackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new FlagSecureModule(reactContext));
return modules;
}
}
这个package
需要在MainApplication.java
文件的getPackages
方法中提供。具体路径是: android/app/src/main/java/com/your-app-name/MainApplication.java.
// MainApplication.java
...
import com.maintainapp.CustomFlagSecurePackage; // <-- 引入包
...
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
...
new CustomFlagSecurePackage()// 添加这行
);
}
}
3、在js中使用
在你想要禁止截屏的页面添加如下代码
import { NativeModules } from 'react-native';
...
componentDidMount() {
NativeModules.FlagSecure.setFlag();//禁止截屏
}
componentWillUnmount() {
NativeModules.FlagSecure.clearFlag();//取消截屏禁止
}