免费试用

中文化、本土化、云端化的在线跨平台软件开发工具,支持APP、电脑端、小程序、IOS免签等等

app防止录屏开发的软件

在移动互联网时代,人们使用的手机应用越来越多,其中很多应用运用到了相机、麦克风等设备,用户信息也随之泄漏。面对手机应用录屏等安全隐患,防止录屏成为一个迫切的问题。本篇文章将介绍几种常见的防止录屏的开发技术及其原理。

一、iOS 官方开发技术:ReplayKit

ReplayKit 是苹果官方为 iOS 提供的防止录屏的开发技术,可以帮助开发者创建防录屏的应用程序。 开发者可以使用 ReplayKit 提供的 API 防止其他应用对自己的应用进行屏幕录制。具体步骤如下:

1. 初始化 ReplayKit

开启 ReplayKit:

```

[RPSystemBroadcastPickerView class];

```

2. 实现 RPPreviewViewControllerDelegate 协议功能

在屏幕记录完成之后,系统会展示录像预览界面,此时可以通过实现 RPPreviewViewControllerDelegate 来进行界面的自定义处理。

3. 实现 RPBroadcastActivityViewControllerDelegate 协议功能

展示自定义录屏界面,可以通过实现 RPSystemBroadcastPickerView 的代理方法来进行控制。

二、Android 官方开发技术:Media Projection

Media Projection 是 Android 官方提供的一个防录屏技术,具体实现步骤如下:

1. 申请权限

在系统版本 Android 5.0 及以上,需要首先向系统申请 Media Projection 权限。

```

startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);

```

在应用接收到系统的回应之后,在 onActivityResult() 回调方法中,可以去处理 ScreenCaptureIntent 数据。

2. 生成 bitmap 图像

通过 MediaProjection.createVirtualDisplay() 方法获取当前 Activity 在屏幕上的显示信息,按照指定格式生成 bitmap 图像。

3. 实现虚拟输入设备

通过创建虚拟输入设备,可以在应用启动时直接使用,避免了权限限制的问题。

```

public abstract class InputDevice implements Parcelable {

public static final int KEYBOARD_TYPE_UNKNOWN = 0x00000000;

public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 0x00000001;

public static final int KEYBOARD_TYPE_ALPHABETIC = 0x00000002;

public static final int MOTION_RANGE_X = 0;

public static final int MOTION_RANGE_Y = 1;

public static final int MOTION_RANGE_PRESSURE = 2;

public static final int MOTION_RANGE_SIZE = 3;

public static final int MOTION_RANGE_TOOL_MAJOR = 4;

public static final int MOTION_RANGE_TOOL_MINOR = 5;

public static final int MOTION_RANGE_ORIENTATION = 6;

public static final int SOURCE_KEYBOARD = 0x00000100;

public static final int SOURCE_DPAD = 0x00000200;

public static final int SOURCE_GAMEPAD = 0x00000400;

public static final int SOURCE_TOUCHSCREEN = 0x00001000;

public static final int SOURCE_MOUSE = 0x00002000;

public static final int SOURCE_STYLUS = 0x00004000;

public static final int SOURCE_TOUCHPAD = 0x00100000;

public static final int SOURCE_JOYSTICK = 0x01000000;

public static final String ADDR = "device.addr";

public static final String BUDDY_SINK = "sink";

public static final String DEVICE_NAME = "device.name";

public static final String DEVICE_PRODUCT_ID = "device.productid";

public static final String DEVICE_VENDOR_ID = "device.vendorid";

public static final String FAILURE_REPORTED = "failures_reported";

protected InputDevice() {}

public abstract int getId();

public abstract int getControllerNumber();

public abstract String getDescriptor();

public abstract int getVendorId();

public abstract int getProductId();

public abstract String getName();

public abstract int getKeyboardType();

public abstract MotionRange getMotionRange(int axis);

public abstract MotionRange[] getMotionRanges();

public static InputDevice getDevice(int id) {

return InputManager.getInstance().getInputDevice(id);

}

public static int[] getDeviceIds() {

return InputManager.getInstance().getInputDeviceIds();

}

public static InputDevice[] getDeviceList() {

return InputManager.getInstance().getInputDevices();

}

public final boolean isVirtual() {

return !isExternal();

}

public final boolean isExternal() {

return getSources() == 0;

}

public final boolean supportsSource(int source) {

return (getSources() & source) == source;

}

public final boolean supportsKeyEvent(int keyCode) {

return false;

}

public final KeyEvent[] getEvents(MotionEvent motion) {

return KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD).getEvents(motion.getHistorySize(), motion.getEventTime(), motion.getPointerCount(),

motion.getPointerIds(), motion.getToolTypes(), motion.getXs(), motion.getYs(),

motion.getPressures(), motion.getOrientations(), motion.getButtonState(), KeyEvent.FLAG_SOFT_KEYBOARD);

}

public final boolean hasMicrophone() {

return (getSources() & AudioSource.MIC) == AudioSource.MIC;

}

public final boolean hasKeyboard() {

return (getSources() & SOURCE_KEYBOARD) == SOURCE_KEYBOARD;

}

public final boolean hasKeys(int[] keys) {

if (keys == null) {

throw new IllegalArgumentException("keys must not be null.");

}

int[] keyCodes = new int[keys.length];

for (int i = 0; i < keys.length; i++) {

keyCodes[i] = KeyEvent.keyCodeFromString(KEYCODE_UNKNOWN);

}

return hasKeys(keyCodes);

}

public final boolean hasKeys(int... keyCodes) {

if (keyCodes == null) {

throw new IllegalArgumentException("keyCodes must not be null.");

}

Arrays.sort(keyCodes);

int[] deviceKeyCodes = getKeyCodes();

Arrays.sort(deviceKeyCodes);

return Arrays.binarySearch(deviceKeyCodes, keyCodes) >= 0;

}

public final boolean hasKeys(List keys) {

if (keys == null) {

throw new IllegalArgumentException("keys must not be null.");

}

int[] keyCodes = new int[keys.size()];

for (int i = 0; i < keys.size(); i++) {

keyCodes[i] = keys.get(i).getKeyCode();

}

return hasKeys(keyCodes);

}

public final int getSources() {

return 0;

}

public final InputChannel getChannel() {

return mChannel;

}

@Deprecated

public final MotionRange getMotionRange(int axis, int source) {

if (source == InputDevice.SOURCE_CLASS_POINTER) {

return getMotionRange(axis);

} else {

return null;

}

}

@Deprecated

public final MotionRange[] getMotionRanges(int source) {

if (source == InputDevice.SOURCE_CLASS_POINTER) {

return getMotionRanges();

} else {

return MotionRange.EMPTY_ARRAY;

}

}

private InputChannel mChannel;

protected InputDevice(int id, int generation, int controllerNumber, String name, int vendorId, int productId, String descriptor, int sources) {

mChannel = new InputChannel();

}

protected void finalize() throws Throwable {

try {

mChannel.dispose();

} finally {

super.finalize();

}

}

public int[] getKeyCodes() {

return new int[0];

}

}

```

三、第三方开发技术:巧用 GLSurfaceView

GLSurfaceView 是一个基于 OpenGL ES 的适用于 Android 平台的开放源代码的 3D 渲染器,主要应用于处理高质量图像和视频,也可以用来实现防止录屏的效果。实现如下:

1. 配置 SurfaceView

在 Android 平台下,可以创建一个 SurfaceView,将视频播放在 SurfaceView 上,从而达到实现防录屏的目的。随着技术的发展,即使被伪装成黑屏,也可以防止被录制。

2. 应用铺屏技术

铺屏技术是通过展示自定义的图像,来实现防录屏的效果。铺屏技术具体实现过程如下:

① 首先创建一个 GLSurfaceView。

② 然后创建 TextureView 对象,将 GLSurfaceView 的预览画面传送到 TextureView 上。

③ 在 TextureView 的画面上显示图像,从而实现铺屏的目的。

综上所述,本文介绍了几种常见的防止录屏的方法,包括 iOS 官方开发技术:ReplayKit,Android 官方开发技术:Media Projection,以及第三方开发技术:巧用 GLSurfaceView,每种方法都有其特定的实现原理和应用场景。开发者可以根据自己应用的特点,选择适合的方式进行处理,从而达到防止录屏的效果。


相关知识:
汽车企业服务app开发
随着智能手机的普及,移动应用程序也越来越受到人们的青睐。汽车企业服务app也不例外。这种应用程序为汽车企业提供了一种更便捷、更快速、更高效的服务方式。下面我们来了解一下汽车企业服务app的开发原理和详细介绍。一、汽车企业服务app的开发原理汽车企业服务ap
2024-01-10
app开发完成定义
App开发是指通过编写代码和设计界面,创建适用于移动设备的应用程序。在过去几年中,移动应用程序的需求迅速增长,促使越来越多的开发者进入这个领域。本文将介绍App开发的原理和详细过程。首先,App开发需要掌握一些基本的编程知识。目前,最流行的App开发平台是
2023-06-29
app开发售价多少钱
App开发的售价是根据多个因素来决定的,包括项目的复杂度、功能需求、设计要求、开发平台、开发团队的经验等等。下面将详细介绍这些因素对App开发售价的影响。1. 项目的复杂度:App的复杂度是影响售价的一个重要因素。一个简单的App可能只需要几个基本功能和简
2023-06-29
app开发流程中六个步骤正确的是
App开发六个步骤:1. 梳理需求,确定功能与模块在进行App开发之前,必须先明确需求,即设计出用户能够使用的产品。在这个阶段,开发者需要先了解客户的期望和要求,进行业务分析,明确功能需求,然后所有功能按照比较重要性和优先顺序排列,确定模块功能。2. 制定
2023-06-29
app开发后收入来源
移动应用程序(APP)开发是目前互联网行业中最受欢迎和广泛关注的领域之一,许多开发者希望通过这种方式开启他们的创业之旅。然而,除了技术方面,盈利模式也是开发成功的关键。本文将介绍几种APP盈利的方法。广告收入广告收入是APP盈利的主要来源之一,运用广告的方
2023-06-29
app开发加入aa收款功能
AA收款,是指将好友、同事或亲密关系的人之间进行的消费或付款,按人均平摊或自定义比例分摊的一种支付方式。如果您是一位app开发工程师,可能会想在您的app中集成AA收款功能,以提高用户体验和使用价值。在本篇文章中,我将向您介绍AA收款功能的原理和详细步骤,
2023-06-29