安卓APP限制截屏录屏解决方案

这篇具有很好参考价值的文章主要介绍了安卓APP限制截屏录屏解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

经过两天的研究,

思路:投屏到电脑,然后windows窗体截图。

具体思路是:可以使用投屏软件,把安卓屏幕投到电脑上,然后根据句柄,截取windows窗口截图

于是,我根据思路,,研究出来了使用python【当然如果精通其它语言,不会python,可以根据上面的思路自行写代码】,写出了可运行的python代码。

下面是具体方式

一、安装ADB,SCRCPY。

ADB的安装就不说了,还需要安卓手机开发者设置:里面打开USB调试开关。诸君自行搜索

SCRCPY是github上star最多的开源投屏

scrcpy使用:

  1. 下载:https://github.com/Genymobile/scrcpy/releases/tag/v1.25

安卓APP限制截屏录屏解决方案
  1. 解压缩

  1. 设置windows环境变量->系统变量->path->添加一个指向解压缩后的文件夹路径

  1. 打开cmd

  1. 命令提示符cmd中输入 【scrcpy -s 安卓手机序列号】

  1. 然后scrcpy就会弹出安卓投屏了

二、python代码

思路:使用os调用系统cmd打开安卓投屏,找到安卓投屏窗口句柄,根据句柄进行窗口截图

使用库:os库,win32gui库,PILLOW库

os库是python默认库,不需要安装

win32gui库,不能直接pip install win32gui【它不支持python3.9,最多仅支持3.6】

正确install代码:

pip install -i https://pypi.doubanio.com/simple/ pypiwin32

pillow库:网上很多教程,自行搜索

三、具体代码如下:

import time,os,datetime
from PIL import Image
import win32gui, win32ui, win32api, win32con

hwnd_title = dict()#获取windows窗口句柄+标题

def cut_pic_by_filename_XY(filename, x1, y1, x2, y2):  # 根据图片路径,打开图片,并裁剪图片【从x1,y1到x2,y2】,然后保存裁剪出来的图片到硬盘
    img = Image.open(filename)  ## 打开filename文件,并赋值给img
    imgSize = img.size  # 大小/尺寸
    w = img.width  # 图片的宽
    h = img.height  # 图片的高
    f = img.format  # 图像格式
    region = img.crop((x1, y1, x2, y2))  # 裁剪图片【从x1,y1到x2,y2】
    current_date = datetime.datetime.now().strftime('%Y%m%d')#提取日期
    save_path_dir = "./image/save_image/" + current_date
    if not os.path.exists(save_path_dir):#文件夹不存在,则创建文件夹
        os.makedirs(save_path_dir)
    str_time = str(int(time.time()))#提取时间戳
    pic_filename = filename.split("/")[-1]#提取路径中的文件名
    region.save(save_path_dir + "/" + str_time + pic_filename)  ## 将裁剪下来的图片保存到 时间戳+文件名.png
    return save_path_dir + "/" + str_time + pic_filename#返回文件路径

def _get_all_hwnd(hwnd, mouse):
    if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
        hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})

def window_capture(filename, hwnd):#窗口截屏
    #hwnd = 0  # 窗口的编号,0号表示当前活跃窗口
    # 根据窗口句柄获取窗口的设备上下文DC(Divice Context)
    hwndDC = win32gui.GetWindowDC(hwnd)
    # 根据窗口的DC获取mfcDC
    mfcDC = win32ui.CreateDCFromHandle(hwndDC)
    # mfcDC创建可兼容的DC
    saveDC = mfcDC.CreateCompatibleDC()
    # 创建bigmap准备保存图片
    saveBitMap = win32ui.CreateBitmap()
    # 获取监控器信息
    MoniterDev = win32api.EnumDisplayMonitors(None, None)
    w = MoniterDev[0][2][2]
    h = MoniterDev[0][2][3]
    w2 = 600#设置截图的X轴宽度【可根据截图保存的文件filename查看,然后实际调整】
    h2 = 1080#设置截图的Y轴高度【可根据截图保存的文件filename查看,然后实际调整】
    # print w,h   #图片大小
    # 为bitmap开辟空间
    saveBitMap.CreateCompatibleBitmap(mfcDC, w2, h2)
    # 高度saveDC,将截图保存到saveBitmap中
    saveDC.SelectObject(saveBitMap)
    # 截取从左上角(0,0)长宽为(w,h)的图片
    saveDC.BitBlt((0, 0), (w2, h2), mfcDC, (0, 0), win32con.SRCCOPY)
    saveBitMap.SaveBitmapFile(saveDC, filename)
    #上面的截图尺寸不行,我就自己写了一个精确截图的def,其中x1,y1,x2,y2,诸君自行对比窗口截图
    backpng = cut_pic_by_filename_XY(filename, 10, 45, 590, 1070)
    return backpng
#可以运行以下注释的代码,获得手机的序列号,诸君可自行提取自己的手机序列号
#cmdstr = "adb devices"
#backstr = os.popen(cmdstr).read()
#print(backstr)
device_name = "b038bc0b"
device_n = ' -s ' + device_name
#scrcpy --crop设定屏幕=1080*1920并且偏移坐标为 (0,0)
#这里的--crop命令就是老版本的-c命令,新版本升级了,-c命令是错误的了。
#然而:网上面的所有有关scrcpy命令的教程文档,全部还是-c命令,真鸡儿扯淡,害我查半天
#-m 1024 限制画面分辨率=1024
#-b 4M修改视频码率=4M
# --window-x 100 --window-y 200 --window-width 405 --window-height 720设定窗体起始坐标,设置窗体宽和高
win_title = "MY_Test1"
#注意这里是windows窗体标题,最好每次打开的windows窗体标题不同,否则多个窗体标题一样的话
#会出现错误,找不到句柄
cmdstr = "scrcpy" + device_n  + " --crop=1080:1920:0:0 --window-title "
cmdstr = cmdstr + win_title
cmdstr = cmdstr + " -m 1024 -b 4M"
os.popen(cmdstr)#打开scrcpy
time.sleep(3)#等待3秒,等待窗体彻底弹出
win32gui.EnumWindows(_get_all_hwnd, 0)#获取所有windows窗口句柄
hwnd = 0
for wnd in hwnd_title.items():#循环获取所有的windows句柄
    print(wnd)#句柄值示例:(325674,"MI 5"):前面是windows句柄ID,后面是windows窗口标题
    get_win_title = str(wnd[1])
    if win_title == get_win_title:#根据windows窗口标题判断,是不是需要截图的窗口。
        hwnd = wnd[0]
        break
print("windows句柄ID:", hwnd)
cut_image_file = './image/scrcpy' + str(device_name) + '.png'
get_png = window_capture(cut_image_file, hwnd)#对windows窗体进行截图
print(get_png)
#关闭windows窗体
#win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)

如上,可以截屏。

录屏的话:scrcpy有个录屏启动命令,直接使用该命令启动scrcpy,然后操作scrcpy弹出的投屏窗口,scrcpy会保存操作视频

scrcpy -s 手机序列号 --record file.mp4

代码没仔细研究,诸君可自行研究。思路:os用上述代码,操作cmd打开scrcpy,然后python控制鼠标scrcpy弹出的窗口,在该窗口上点击,滑动等等具体的操作,最后看file.mp4

看到有兄弟问了,黑屏的时候还是黑的,这是因为该APP使用了FLAG_SECURE,两个都禁了【截屏录屏】和【投屏】.

Android代码是这样:

在Activity的onCreate事件中,setFlags【禁止截屏录屏】注册广播接收器,监听投屏事件【禁止投屏】

import android.app.Activity;
import android.content.Context;
import android.content.IntentFilter;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.view.WindowManager;

public class MainActivity extends Activity {
    private ScreenCaptureBroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 禁止截屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);

        // 注册广播接收器,监听投屏事件
        receiver = new ScreenCaptureBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销广播接收器
        unregisterReceiver(receiver);
    }

    // 广播接收器类,用于监听投屏事件
    private class ScreenCaptureBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 检测到投屏事件发生
            if (Intent.ACTION_SCREEN_ON.equals(intent.getAction()) ||
                    Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
                // 禁用投屏功能
                MediaProjectionManager mediaProjectionManager = (MediaProjectionManager)
                        getSystemService(Context.MEDIA_PROJECTION_SERVICE);
                if (mediaProjectionManager != null) {
                    mediaProjectionManager.stopScreenCapture();
                }
            }
        }
    }
}

如果仅仅禁止截屏录屏的话,可以用我上文的:投屏到电脑的办法,可以解决

如果是用MediaProjectionManager监听投屏的话:

MediaProjectionManager是Android提供的一个类,用于管理屏幕捕捉(Screen Capture)功能。

请注意,使用MediaProjectionManager需要申请android.permission.CAPTURE_VIDEO_OUTPUT权限,并且只能在Android 5.0(API级别21)及以上的设备上使用。此外,屏幕捕捉功能通常在需要进行屏幕录制、屏幕分享等场景下使用,并非所有应用都需要使用或禁用该功能。

你可以尝试把该APP的CAPTURE_VIDEO_OUTPUT权限关闭【中文权限名:捕获视频输出】,有很多手机找不到该权限,

不过关闭权限也未必管用,

有哪位同学知道的,可以给个文章地址,不过这涉及系统权限的修改,我估计要root手机,然后装xposed框架,然而,我对于xposed框架不熟,有会的同学,不妨留言。

还有物理办法:A手机操作,B手机在旁打开相机录制。

诸君自行研究吧。文章来源地址https://www.toymoban.com/news/detail-402301.html

到了这里,关于安卓APP限制截屏录屏解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app x生成的安卓包,安装时,提示不兼容。解决方案

    找到 manifest.json 进入:源码视图 packagename:包名;最好是和你“发行”(打包)时的包名一致。 abiFilters:需要兼容CPU的类型 minSdkVersion:应用兼容的最低Android版本(API等级) targetSdkVersion:应用适配的目标Android版本(API等级)   官方说明:manifest.json | uni-app官网 App-Android端发

    2024年02月03日
    浏览(96)
  • Android App保护用户隐私————禁止应用截屏或录屏

           相信大家在使用某些平台应用的时候,都会有 限制的规定 。        通常情况下,录屏、截图软件都可以在手机的运行过程中进行录屏、截图,普通的平台也不会阻止录屏、截图软件运行。        但是在某些比较 敏感 的平台上面,有可能出于 保密 的原因

    2024年02月02日
    浏览(78)
  • nginx文件上传大小限制解决方案

    nginx配置附件上传大小限制。 用 nginx 做代理。上传超过 1M 大的客户端文件无法正常上传, nginx 直接报错,上传文件太大( 413 Request Entity Too Large )于是修改了下 nginx 的配置,就可以了。   client_max_body_size 1024m; 可放在 http 下控制全局大小限制,大小根据需求配置,最大为

    2024年02月17日
    浏览(67)
  • Elasticsearch查询10000条限制解决方案

    目录 问题描述 问题原因 解决方案 Elasticsearch官方默认最多只能查询10000条数据,查询20000条数据开始就会报错: max_result_window 是 Elasticsearch 中一个重要的搜索参数,它控制了单个搜索请求返回的最大结果数。具体来说,它定义了从搜索结果中的哪个位置开始返回结果,以及要

    2024年02月04日
    浏览(38)
  • 【Unity】Animation Playable Bug、限制及解决方案汇总

    先自荐一下我的PlayableGraph监控工具,比官方的Visualizer好用得多:https://github.com/SolarianZ/UnityPlayableGraphMonitorTool 文中提及的各项Bug及解决方案的最小化测试工程可在此仓库下载:https://github.com/zdirtywork 。 【可规避】UUM-30899 使用 AnimationClipPlayable 播放动画时,调用 Playable.Pause(

    2024年02月01日
    浏览(44)
  • Selenium 无头浏览器被知乎限制访问的解决方案

    我尝试使用如下代码爬取知乎的有关内容,出现知乎安全验证界面: 添加启动参数 在网上的许多文章中,反复提到了如下三行代码,然而我将他们加入代码后没有什么效果: JavaScript特殊全局变量 有一些文章提到,通过 WebDriver 启动的网页会存在一些特殊的 JS 变量,这些变

    2024年02月14日
    浏览(50)
  • es sharding 文档数量超过最大限制,写入失败的4种解决方案

    es 插入数据的时候报错 failure in bulk execution: [0]: index [leopard_user.driver_work_detail_record], type [detail_info], id [xxx], message [ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=number of documents in the index cannot exceed 2147483519]]], 超过了2^31次方 解决方案: 方案一 重新创建一个

    2024年02月03日
    浏览(75)
  • 小程序限制PC端打开 只可以在手机端打开的解决方案

    电脑版微信是支持运行小程序的,但是某一些小程序是限制在PC上打开的,那么是怎么判断打开的设备是否是Pc端呢 官方文档给出的方案是 一般都是通过Ua来识别的,大多数小程序只要内存更改下Ua就可以在PC端上使用运行小程序了

    2024年02月12日
    浏览(179)
  • Unity 之 安卓平台上架隐私问题解决方案

    场景 1: APP 未见向用户明示个人信息收集使用的目的、方式和范围,未经用户同意,存在收集 Android ID、SIM 卡信息的行为。(存在风险) 场景 2: APP 未见向用户明示 SDK 收集使用个人信息的目的、方式和范围,未经用户同意,SDK 存在收集 com.unity3d.player 获 取 SIM 卡信息、c

    2024年02月16日
    浏览(35)
  • (转)H5和IOS/安卓通信解决方案

    项目背景:现有H5项目,要快速完成一个app开发,由于周期紧张只能先用H5套壳完成一版app。在其中,涉及到不同端的交互。 如果业务逻辑比较复杂,比如页面需要获取 IOS 端传回的返回值,或者 IOS 端需要调用 js 方法。可以通过第三方库来实现,我们项目用的是 WebViewJavasc

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包