一个库,可让你保护应用中的屏幕不被捕获或记录。
expo-screen-capture
允许你保护应用中的屏幕不被捕获或记录,并在你的应用处于前台时截取屏幕截图时收到通知。你可能想要阻止屏幕捕获的两个最常见原因是:
¥expo-screen-capture
allows you to protect screens in your app from being captured or recorded, as well as be notified if a screenshot is taken while your app is foregrounded. The two most common reasons you may want to prevent screen capture are:
如果屏幕显示敏感信息(密码、信用卡数据等)
¥If a screen is displaying sensitive information (password, credit card data, and so on)
你正在显示你不希望被记录和共享的付费内容
¥You are displaying paid content that you don't want to be recorded and shared
这在 Android 上尤其重要,因为 android.media.projection
API 允许第三方应用执行屏幕捕获或屏幕共享(即使应用位于后台)。
¥This is especially important on Android since the android.media.projection
API allows third-party apps to perform screen capture or screen sharing (even if the app is in the background).
目前,iOS 上的截图是无法阻止的。这是由于底层操作系统的限制。
¥Installation
-
npx expo install expo-screen-capture
If you are installing this in an existing React Native app (bare workflow), start by installing expo
in your project. Then, follow the additional instructions as mentioned by library's README under "Installation in bare React Native projects" section.
¥Usage
¥Example: hook
import { usePreventScreenCapture } from 'expo-screen-capture';
import { Text, View } from 'react-native';
export default function ScreenCaptureExample() {
usePreventScreenCapture();
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>As long as this component is mounted, this screen is unrecordable!</Text>
</View>
);
}
¥Example: functions
import * as ScreenCapture from 'expo-screen-capture';
import { useEffect } from 'react';
import { Button, StyleSheet, View } from 'react-native';
export default function ScreenCaptureExample() {
const hasPermissions = async () => {
const { status } = await ScreenCapture.requestPermissionsAsync();
return status === 'granted';
};
useEffect(() => {
let subscription;
const addListenerAsync = async () => {
if (await hasPermissions()) {
subscription = ScreenCapture.addScreenshotListener(() => {
alert('Thanks for screenshotting my beautiful app 😊');
});
} else {
console.error('Permissions needed to subscribe to screenshot events are missing!');
}
};
addListenerAsync();
return () => {
subscription?.remove();
};
}, []);
const activate = async () => {
await ScreenCapture.preventScreenCaptureAsync();
};
const deactivate = async () => {
await ScreenCapture.allowScreenCaptureAsync();
};
return (
<View style={styles.container}>
<Button title="Activate" onPress={activate} />
<Button title="Deactivate" onPress={deactivate} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});
import * as ScreenCapture from 'expo-screen-capture';
usePermissions(options)
Name | Type |
---|---|
options (optional) | PermissionHookOptions<object> |
Check or request permissions necessary for detecting when a screenshot is taken.
This uses both requestPermissionsAsync
and getPermissionsAsync
to interact with the permissions.
[null | PermissionResponse, RequestPermissionMethod<PermissionResponse>, GetPermissionMethod<PermissionResponse>]
Example
const [status, requestPermission] = ScreenCapture.useScreenCapturePermissions();
usePreventScreenCapture(key)
Name | Type | Description |
---|---|---|
key (optional) | string | If provided, this will prevent multiple instances of this hook or the
Default: 'default' |
A React hook to prevent screen capturing for as long as the owner component is mounted.
void
ScreenCapture.allowScreenCaptureAsync(key)
Name | Type | Description |
---|---|---|
key (optional) | string | This will prevent multiple instances of the Default: 'default' |
Re-allows the user to screen record or screenshot your app. If you haven't called
preventScreenCapture()
yet, this method does nothing.
Promise<void>
ScreenCapture.getPermissionsAsync()
Checks user's permissions for detecting when a screenshot is taken.
Only Android requires additional permissions to detect screenshots. On iOS devices, this method will always resolve to a
granted
permission response.
A promise that resolves to a PermissionResponse object.
ScreenCapture.isAvailableAsync()
Returns whether the Screen Capture API is available on the current device.
Promise<boolean>
A promise that resolves to a boolean
indicating whether the Screen Capture API is available on the current
device. Currently, this resolves to true
on Android and iOS only.
ScreenCapture.preventScreenCaptureAsync(key)
Name | Type | Description |
---|---|---|
key (optional) | string | Optional. If provided, this will help prevent multiple instances of the Default: 'default' |
Prevents screenshots and screen recordings until allowScreenCaptureAsync
is called or the app is restarted. If you are
already preventing screen capture, this method does nothing (unless you pass a new and unique key
).
Please note that on iOS, this will only prevent screen recordings, and is only available on iOS 11 and newer. On older iOS versions, this method does nothing.
Promise<void>
ScreenCapture.requestPermissionsAsync()
Asks the user to grant permissions necessary for detecting when a screenshot is taken.
Only Android requires additional permissions to detect screenshots. On iOS devices, this method will always resolve to a
granted
permission response.
A promise that resolves to a PermissionResponse object.
ScreenCapture.addScreenshotListener(listener)
Name | Type | Description |
---|---|---|
listener | () => void | The function that will be executed when the user takes a screenshot. This function accepts no arguments. |
Adds a listener that will fire whenever the user takes a screenshot while the app is foregrounded.
On Android, this method requires the READ_EXTERNAL_STORAGE
permission. You can request this
with MediaLibrary.requestPermissionsAsync()
.
A Subscription
object that you can use to unregister the listener, either by calling
remove()
or passing it to removeScreenshotListener
.
ScreenCapture.removeScreenshotListener(subscription)
Name | Type | Description |
---|---|---|
subscription | Subscription | Subscription returned by |
Removes the subscription you provide, so that you are no longer listening for screenshots.
If you prefer, you can also call remove()
on that Subscription
object, for example:
let mySubscription = addScreenshotListener(() => {
console.log("You took a screenshot!");
});
...
mySubscription.remove();
// OR
removeScreenshotListener(mySubscription);
void
PermissionResponse
An object obtained by permissions get and request functions.
PermissionResponse Properties
Name | Type | Description |
---|---|---|
canAskAgain | boolean | Indicates if user can be asked again for specific permission. If not, one should be directed to the Settings app in order to enable/disable the permission. |
expires | PermissionExpiration | Determines time when the permission expires. |
granted | boolean | A convenience boolean that indicates if the permission is granted. |
status | PermissionStatus | Determines the status of the permission. |
PermissionHookOptions
Literal Type: multiple types
Acceptable values are: PermissionHookBehavior
| Options
Subscription
Name | Type | Description |
---|---|---|
remove | () => void | A method to unsubscribe the listener. |
PermissionStatus
PermissionStatus Values
UNDETERMINED
PermissionStatus.UNDETERMINED = "undetermined"
User hasn't granted or denied the permission yet.