Android手机防沉迷软件的基本原理

news2024/11/17 11:27:15

     (现在手机游戏、短视频等不仅对小孩子负面影响巨大,连很多成年人都沉迷其中难以自拔,影响工作、生活、学习。这已经造成全社会性的巨大影响,长此以往,国将不国。本人仅在此以自己掌握的些许技术略尽绵薄之力,希望能抛砖引玉,更希望能有具备大能力的各方有识之士力挽狂澜,成我所之不能。欢迎加微交流84378495)

       本文首发csdn,链接:http://t.csdn.cn/p58h9

        正在写一个免费、开源的手机防沉迷公益软件,有兴趣的朋友一起来开发吧,有朋友一起做比较有动力一些,源代码已经上传到github:https://github.com/ActionWind/Anti-PhoneAddiction
源代码基于Android8.1版本,其他版本请注意兼容性问题。

        在这里介绍一下它的基本原理。Android手机防沉迷软件的技术原理非常简单,主要是使用Android无障碍服务接口检测当前的app界面,如果它正好是用户所设置的需要限制的界面,则弹出悬浮窗遮挡此界面,让用户无法对其进行操作。

       所以,如果你想要开发一款Android平台的防沉迷软件,需要做以下这些事情:

       1、写一个类继承AccessibilityService类,实现必要的接口。这个后台服务将一直运行在手机上,一旦检测相应的界面出现就做出相应的反应。

       2、实现全屏悬浮窗。

       3、设计用户界面和接口,让用户能够计划使用手机的时间,设置以什么方式和时间限制整部手机、单个应用或某个应用界面的使用。

       4、需要一个小小的数据库用于存储这些配置。

       5、Android各个版本的适配,因为各个版本的应用编程接口会有一些不同。

       实现了以上5步之后基本上就是一个可以用于实用的防沉迷软件了,对于一般的安卓程序员来说,可以说一点都不困难,就是需要你花时间和精力就是了。相对而言,其中第三步可能就是最难最复杂的部分了。如果要做得好一点,还需要融入一些心理学方面的设计和引导。下面就讲一下每一步如何实现:

一、实现无障碍服务:

1、AccessibilityService类的实现:

public class AntiPhoneAddiction extends AccessibilityService {
// 悬浮窗所需要的变量
    WindowManager windowManager;
    View fullScreenFloatingWindow;
    WindowManager.LayoutParams layoutParams;
    Display display;
    int width;
    int height;
    int fullFloatingWindowFlag = 0;//悬浮窗是否打开的标志位    @Override //此方法对无障碍服务进行配置
    protected void onServiceConnected() {
        super.onServiceConnected();
        fullScreenFloatingWindow();//生成悬浮窗的方法,看第二步。
        AccessibilityServiceInfo config = new AccessibilityServiceInfo();        //配置监听的事件类型为界面变化
        config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED ;
        config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        if (Build.VERSION.SDK_INT >= 16) {
            config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
        }
        setServiceInfo(config);
    }

    @Override //核心方法,对界面进行监听并作出响应的操作
    public void onAccessibilityEvent(AccessibilityEvent event) {
       if (event.getSource() != null){            if (event.getPackageName().equals("com.tencent.mobileqq")) {
                //当qq界面出现时弹出悬浮窗挡住它
                if (fullFloatingWindowFlag == 0) {                    
                    windowManager.addView(fullScreenFloatingWindow, layoutParams);//显示悬浮窗
                    fullFloatingWindowFlag = 1;
                }
            }
                 //全局屏蔽,同时设置了白名单
                if (timeBetween(startTime_user, endTime_user)) {
                    if (!whiteList.contains(packageName)) {
                        guardsSheild();//晚上屏蔽手机
                    }
                }

                        getActivityName(event);

                        //屏蔽黑名单中的界面:

                if (blackList.contains(activityName)) {
                    if (!timeBetween(13 * 60 + 5, 13 * 60 + 25)) {
                        guardsSheild();
                    }
                } 
         }    }

    @Override //这个暂时可以留空
    public void onInterrupt() {

    }
} 

2、Manifest文件的设置:

在 <appilication中加入以下代码:

<service
    android:name=".AutoFire"
    android:enabled="true"
    android:exported="true"
    android:label="AutoFire"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibilitysettings"
        />
</service>

在工程目录/app/src/main/res文件夹下新建xml目录,新建accessibilitysettings.xml文件,写入代码:

<?xml version="1.0" encoding="utf-8"?>

    <accessibility-service
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
        android:canPerformGestures="true"
        android:canRetrieveWindowContent="true"
        android:notificationTimeout="100" />

我的项目已经实现了手机全局锁定、单个应用锁定、单个界面锁定的功能,主要包含以下方法:

//app定时屏蔽
    void appSheild(String pName, int startTime, int endTime) 

//app中的某个界面定时屏蔽 
    void activitySheild(String shieldActivity, String currentActivityName, int startTime, int endTime)

//app中的某个界面定时屏蔽(黑名单模式) 
    void activitySheild(HashSet blackList, String currentActivityName, int startTime, int endTime)

//点击指定按钮时屏蔽(黑名单模式)
    void callSheildWhenClick()

//点击指定按钮时屏蔽(指定按钮文本模式)
    void callSheildWhenClick(CharSequence buttonText)

//获取Activity界面名称
void getActivityName(AccessibilityEvent event)

等等……

二、实现悬浮窗:

    private void fullScreenFloatingWindow() {
        if (Settings.canDrawOverlays(this)) {
            // 获取WindowManager服务
            windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

            // 新建悬浮窗控件
            fullScreenFloatingWindow = new Button(getApplicationContext());
            //button.setText("Floating Window");
//            recentScreen.setBackgroundColor(Color.rgb(204, 232, 207));
            fullScreenFloatingWindow.setBackgroundColor(Color.GREEN);
            fullScreenFloatingWindow.setAlpha(0.5f);
//            fullScreenFloatingWindow.setText("屏蔽掉你,不让你看!");
            // 设置LayoutParam
            layoutParams = new WindowManager.LayoutParams();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
                layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;

            } else {
                layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
            }
            display = windowManager.getDefaultDisplay();
            width = display.getWidth();
            height = display.getHeight();
            layoutParams.format = PixelFormat.RGBA_8888;
            layoutParams.width = width;
            layoutParams.height = height;


        }
    }

3、用户界面设计。UI我暂时只写了一个让用户设置全局屏蔽的页面,其他的还没写。打算借鉴我一直在使用的一个防沉迷软件,它的用户界面已经设计得挺好了:

  

 5 数据库 和 6 版本适配还没做。

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/984381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的社团管理系统

基于SpringBootVue的社团管理系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 角色&#xff1a;普通用户、管理员 管理员&#xff1a;…

有哪些开源通用流程引擎

有哪些开源通用流程引擎 Activiti&#xff1a;Camunda&#xff1a;Flowable&#xff1a;jBPM&#xff1a;Bonita&#xff1a; 以下是一些常见的开源通用流程引擎&#xff1a; Activiti&#xff1a; Activiti 是一个轻量级的、基于 Java 的 BPM&#xff08;Business Process M…

Git 常用

1.工作区、暂存区、版本库&#xff1a; 工作区&#xff1a;就是电脑上可以看到的目录&#xff1b; 暂存区&#xff1a;英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件&#xff08;.git/index&#xff09;中&#xff0c;所以我们把暂存区有时也叫作索引&#xf…

华为OD机试 - 最多颜色的车辆 - 数据结构map(Java 2022Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路1、核心思想2、题做多了&#xff0c;你就会发现&#xff0c;这道题属于送分题&#xff0c;为什么这样说&#xff1f;3、具体解题思路&#xff1a; 五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B…

一文读懂骨传导耳机和入耳式耳机哪个对人体伤害小?

先说结论&#xff0c;骨传导耳机和入耳式耳机哪个对人体伤害最小&#xff0c;答案是骨传导耳机对人体的伤害要小一些。 普通的耳机传声原理是直接将声音通过空气振动传递给耳膜&#xff0c;从而听到声音而骨传导的传声原理有所不同&#xff0c;骨传导传递声音是通过振动&#…

功率信号源可以应用在哪些方面

功率信号源是一种能够产生一定功率的信号源&#xff0c;广泛应用于各个领域。下面将介绍功率信号源在电子、通信、工业和科研等方面的应用。 在电子行业中&#xff0c;功率信号源是一种重要的测试工具。它可以产生各种波形的信号&#xff0c;如正弦波、方波、脉冲波等&#xff…

MySQL 8.0安装及配置教程

一、下载mysql 进入官网https://www.mysql.com/&#xff0c;下载最新的的mysql8.0版本&#xff0c;该版本新增了许多特性。 进入下载页面&#xff0c;可以选择企业版本和社区版本&#xff0c;一般选择社区免费下载。 二、安装mysql&#xff08;此方法默认安装至C盘&#xff0c…

echarts环图配置

echarts环图配置 1、安装echarts npm install echarts4.9.02、页面引入echarts import echarts from echarts;3、应用 template片段 <div class"chart-wrap"><div id "treeChart" style "width: 180px; height:180px;" ><…

实现Map批量赋值,我只需24秒搞定!

函数的功能是将一组键值对批量赋值给Map中的键。在Java中&#xff0c;通常使用Map的put方法逐个将键值对赋值给Map&#xff0c;但在某些场景下&#xff0c;可能需要一次性将多个键值对赋值给Map。 函数功能&#xff1a;Map批量赋值 参数1&#xff1a;参数名称&#xff1a;targ…

VR全景广告——实体商家的营销新选择

前几年&#xff0c;大家出行不便&#xff0c;那个时候实体商家整天苦恼于没有客户&#xff0c;没有销量&#xff0c;一直到引入VR全景广告才算是有所好转。随着VR全景技术不断完善&#xff0c;许多行业、领域开始结合VR全景&#xff0c;例如景区、房地产、车企等都会利用VR全景…

如何防止僵尸 API...

人们越来越依赖Web API。2023 年 Postman API 状况报告发现&#xff0c;整整 92% 的组织计划在明年增加对 API 的投资。API 正在为从内部微服务策略到合作伙伴策略和成熟产品的一切提供动力。 然而&#xff0c;这种新发现的API 蔓延带来了后果&#xff1b;迫在眉睫的威胁可能会…

CSS:屏幕正中间有个元素A,元素A中有文字A,随着屏幕宽度的增加

始终需要满足以下条件&#xff1a; A元素垂直居中于屏幕***&#xff1b;A元素距离屏幕左右边距各10px&#xff1b;A元素里面的文字”A”的font-size:20px&#xff1b;水平垂直居中;A元素的高度始终是A元素宽度的50%; (如果搞不定可以实现为A元素的高度固定为200px;)请用 html及…

【产线故障】线上接口请求过慢如何排查?

文章目录 前言一、内存使用过高导致CPU满载案例代码分析思路 二、出现了类似死循环导致cpu负载案例代码分析思路 三、死锁案例代码分析思路 前言 首先线上接口变慢&#xff0c;原因可能有很多&#xff0c;有可能是网络&#xff0c;有可能是慢 SQL&#xff0c;有可能是服务本身…

3种轻量化框架总结

一般的卷积神经网络的参数量和计算量都很大&#xff0c;很难应用在资源有限的场景中。为了解决这个问题&#xff0c;通常是在训练好的模型上进行优化&#xff0c;如通过对模型压缩减少计算量和存储成本&#xff0c;也可以通过剪枝连接方法去掉了不重要的神经元连接或者通道修剪…

SecureCRT9.1高亮配色设置

参考:http://zh-cjh.com/qita/1623.html https://download.csdn.net/download/qq_45698138/88310255?spm1001.2014.3001.5503 1.创建文件colorful-network.ini,添加如下内容 D:"Match Case"00000000 D:"Regex Line Mode"00000000 Z:"Keyword Lis…

C语言学习:6、C语言程序的循环结构

生活中&#xff0c;有很多循环的东西&#xff0c;比如钟表就是在1到12循环&#xff0c;太阳东升西落也是循环&#xff0c;春夏秋冬也是循环&#xff0c;人生可能也是一个循环。 while C语言中的循环可以这么描述&#xff1a;当某个条件成立&#xff0c;就一直做某件事或某些事…

微信小程序开发---基本组件的使用

目录 一、scroll-view &#xff08;1&#xff09;作用 &#xff08;2&#xff09;用法 二、swiper和swiper-item &#xff08;1&#xff09;作用 &#xff08;2&#xff09;用法 三、text &#xff08;1&#xff09;作用 &#xff08;2&#xff09;使用 四、rich-tex…

煤矿虚拟仿真 | 采煤工人VR虚拟现实培训系统

随着科技的发展&#xff0c;虚拟现实(VR)技术已经逐渐渗透到各个行业&#xff0c;其中包括煤矿行业。VR技术可以为煤矿工人提供一个安全、真实的环境&#xff0c;让他们在虚拟环境中进行实际操作和培训&#xff0c;从而提高他们的技能水平和安全意识。 由广州华锐互动开发的采煤…

如何解决基因行业海量数据传输难题?镭速传输给出答案

基因大数据是指通过基因测序、分析和应用所产生的海量数据&#xff0c;它揭示了生命的奥秘和规律&#xff0c;对于科学研究、医疗健康、生物产业等领域具有重要的价值和意义。 随着高通量测序技术的进步&#xff0c;基因大数据的产量呈现爆炸式增长&#xff0c;预计到 2025 年…

算法笔记--最大连续1的个数Ⅲ

leetcode题目链接:1004. 最大连续1的个数 III 题目描述 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 思路 这里可以转换思路&#xff0c;让题意更加明确:即&#xff0c;求一个最大连续区间…