• 【Android】自制静音App,解决他人手机外放问题


    契源

    看到一个粉丝留言,吐槽舍友深夜手机外放,打扰别人休息,想设计一款软件阻止舍友行径。于是我就来简单设计一下。

    在这里插入图片描述

    需求实现分析

    实际上,我之前有篇博文提到过一个类似的Android APP,主要功能是将手机声音强制开到最大,然后播放背景音乐。再之前的那个基础上,删除音乐文件,然后将手机声音调小就满足了此需求。

    效果演示

    这个软件很快就做出来了,效果演示如下:

    轻轻一键,世界清净了

    软件下载地址:https://www.pgyer.com/ikCz
    软件源码:https://github.com/zstar1003/Mute

    具体功能分析

    软件本身比较简单,主要包含下面几个部分

    音量调节

    软件核心功能是设置音量为0,这在Android中,可以使用AudioManager这个类中的相关API,核心代码:

    am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    //启动线程循环设置音量
    new Thread() {
    	@TargetApi(Build.VERSION_CODES.P)
              public void run() {
    		//这儿是耗时操作,完成之后更新UI;
    		while(true){
                      final int m = am.getStreamMinVolume(AudioManager.STREAM_MUSIC);  //设置静音
    			runOnUiThread(new Runnable(){
    					@Override
    					public void run() {
    						//更新UI
    						am.setStreamVolume(AudioManager.STREAM_MUSIC, m, AudioManager.FLAG_PLAY_SOUND);
    					}
    				});
    			try {
    				sleep(500);
    			} catch (InterruptedException e) {}
    		}
    	}
    }.start();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    监听按钮

    此次功能是监听返回主页,调节音量按钮,监听到之后弹出气泡框提示

    核心代码:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    	if(keyCode==KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_BACK || keyCode== KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP){
    		Toast toast = Toast.makeText(this,null,Toast.LENGTH_LONG);
    		toast.setText("别试了,没用的!");
               toast.show();
    		return true;
    	}
    	return super.onKeyDown(keyCode, event);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    按钮点击

    在主页上加了个功能,点击按钮切换图片,并且达到指定次数后,退出软件

    //按钮点击事件
    final Button bt = findViewById(R.id.activitymainButton);
    final ImageView kt = findViewById(R.id.kt);
    bt.setOnClickListener(new View.OnClickListener(){
    		@Override
    		public void onClick(View p1) {
    			if(num != 0){
    				num--;
    				bt.setText("对不起,我错了\n"+"再点"+num+"下就关闭程序");
    			}else{
    				finish();
    			}
                      if(num % 2 == 0){
                          kt.setImageResource(R.drawable.xu1);
                      }else{
                          kt.setImageResource(R.drawable.xu2);
                      }
                  }
    	});
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    隐藏标题栏/修改通知栏颜色

    下面再做点小优化,让UI看起来更舒适

    隐藏标题栏:

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    
    • 1
    • 2

    修改通知栏颜色:

    Window window = this.getWindow();
    window.setStatusBarColor(0xFFcfde29);
    
    • 1
    • 2

    按钮美化

    按钮美化,在drawable中,新建一个按钮皮肤xml文件,为按钮点击和非点击状态设置不同颜色

    
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true">
            <shape>
                <solid android:color="#64AFFA"/>
                <corners android:radius="10dp"/>
                <padding
                    android:bottom="2dp"
                    android:left="33dp"
                    android:right="33dp"
                    android:top="2dp">
                padding>
            shape>
        item>
        <item android:state_pressed="false">
            <shape>
                <solid android:color="#99CCFF"/>
                <corners android:radius="10dp"/>
                <padding
                    android:bottom="2dp"
                    android:left="33dp"
                    android:right="33dp"
                    android:top="2dp">
                padding>
            shape>
        item>
    selector>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    拓展思考

    开发过程中,我发现部分手机已经做的相当“智能”,即便监听阻止返回按键,手机还是可以轻易调出清除进程等方式来退出软件。

    我试图想把软件做的更“流氓”一些,想到了以下思路:

    • 加入一个系统级服务,不停地设置音量静音
    • 加入一个系统级服务,监听Activity是否被Kill,若被Kill则重启
    • 加入一个系统级服务,监听开机广播,开机自启软件
    • 在软件界面中增加更多手势的识别,以防止用户呼出软件管理界面

    不过经过一番调研,以上思路均无办法实现,很多能找到的方法基本都不适配Android10以后的版本,在手机厂商的不断迭代中,除非将软件加入到系统的白名单,否则还是会被用户所管理。

    最后总结,此软件仅供娱乐,解决舍友手机外放问题靠软件手段无法从根源上解决,在此呼吁读者在非单人空间切勿手机外放,影响他人生活休息。

  • 相关阅读:
    楼盘小程序具备哪些功能板块?
    喜报 | 热烈祝贺思腾合力成功挂牌天津OTC专精特新板
    #define 的神奇操作
    git学习
    Mybatis-注解开发
    大数据1星笔试题_220621
    快速学会ansible的安装
    Flink 基础 -- 应用开发(项目配置)
    win32:第一个窗口程序-应用程序入口点(part.6)
    如何区分一个项目是react还react native
  • 原文地址:https://blog.csdn.net/qq1198768105/article/details/127481552