今天拿到一个需求,在输入密码的时候禁止截屏,本来想在MainActivity里面写的,但是不好控制,所以就使用react-native调用原生的方法做了一个封装,其实封装都一样,如果在reactMetod方法直接写会报错
Only the original thread that created a view hierarchy can touch its views.
所以需要重新写个线程来进行实现
这里主要用到了原生模块,下面贴出NoScreenshotsModule.java的代码
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 NoScreenshotsModule extends ReactContextBaseJavaModule {
NoScreenshotsModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "ScreenshotsModule";
}
@ReactMethod
public void setFlag() {
getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
getCurrentActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE); // 禁止截屏
}
});
}
@ReactMethod
public void clearFlag() {
getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
getCurrentActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); // 清除禁止截屏
}
});
}
}
然后在componentDidMount和componentWillUnmount两个生命周期中分别调用setFlag和clearFlag这两个方法就可以使用了。