打开开关监听来电,来电时控制闪光灯闪烁

1、SystemUI/ext/src/com/mediatek/systemui/ext/QuickSettingsTileViewId.java

增加ID   :

在 QuickSettingsTileViewId 方法中加上此开关的ID: ID_INCALL_FLASHING_LED,

2、SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java

确认开关的位置

在 addSystemTiles 方法中加上要加入的 代码

private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {

...
            addInCallFlashingLedTile(parent, inflater);
        }

addInCallFlashingLedTile的具体实现

private void addInCallFlashingLedTile(ViewGroup parent, LayoutInflater inflater) {
        final QuickSettingsBasicTile  inCallFlashLed = new QuickSettingsBasicTile(mContext);
        boolean enabled = Settings.System.getInt(mContext.getContentResolver(), "incall_flashing_led", 0) != 0;  //开关默认关闭
        if (enabled) {
            inCallFlashLed.setImageResource(R.drawable.ic_incall_flashing_led_enabled);
        } else {
            inCallFlashLed.setImageResource(R.drawable.ic_incall_flashing_led_disenabled);
        }
        inCallFlashLed.setTextResource(R.string.quick_settings_incall_flashing_led);
        inCallFlashLed.setTileViewId(QuickSettingsTileViewId.ID_INCALL_FLASHING_LED);
        inCallFlashLed.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean enabled = Settings.System.getInt(mContext.getContentResolver(), "incall_flashing_led", 0) != 0;
                if (enabled) {
                    Settings.System.putInt(mContext.getContentResolver(), "incall_flashing_led", 0);
                    inCallFlashLed.setImageResource(R.drawable.ic_incall_flashing_led_disenabled);
                } else {
                    Settings.System.putInt(mContext.getContentResolver(), "incall_flashing_led", 1);
                    inCallFlashLed.setImageResource(R.drawable.ic_incall_flashing_led_enabled);
                }
            }
        });
        parent.addView(inCallFlashLed);
    }

图片和字符串资源需添加

3、SystemUI/src/com/android/systemui/SystemUIService.java

监听来电及打开摄像头闪光灯的关键代码

添加代码:

private static final long OPEN_DELAYED_TIME = 300;  // 闪烁频率
    private static final long CLOSE_DELAYED_TIME = 500;//间隔
    
    private TelephonyManager mTelephonyManager;
    private Camera mCamera;
    private Parameters mParameter;
    private Handler mFlashHandler;
    
    private boolean mIsInCall = false;
    private boolean mIsOpen = false;
    
    private void initInCallFlashLed() {
        mIsInCall = false;
        mIsOpen = false;
        if (true) {
            mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            mTelephonyManager.listen(MyPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
            mFlashHandler = new Handler();
        }
    }
    
    private void releaseInCallFlashLed() {
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
            mParameter = null;
            mCamera = null;
        }
        mFlashHandler.removeCallbacks(mFlashRunnable);
        mTelephonyManager = null;
        mFlashHandler = null;
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        releaseInCallFlashLed();
    }
    
    private PhoneStateListener MyPhoneStateListener = new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                mIsInCall = false;
                closeFlashLight();
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                mIsInCall = true;
                openFlashLight();
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                closeFlashLight();
                break;
            }
        }
    };
    
    private void openFlashLight() {
        if (mIsInCall) {
            try {
                if(mCamera == null){
                    mCamera = Camera.open();
                }
                mCamera.startPreview();
                mParameter = mCamera.getParameters();
                boolean enabled = Settings.System.getInt(getContentResolver(), "incall_flashing_led", 0) != 0;
                if (enabled) {
                    mFlashHandler.post(mFlashRunnable);
                }
            } catch (java.lang.RuntimeException e) {
                Log.d(TAG, "openFlashLight=>error: " + e.toString());
            }
        }
    }
    
    private void closeFlashLight() {
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
            mParameter = null;
            mCamera = null;
        }
        mFlashHandler.removeCallbacks(mFlashRunnable);
    }
    
    private Runnable mFlashRunnable = new Runnable() {
        @Override
        public void run() {
            if (mIsOpen) {
                mIsOpen = false;
                if (mCamera != null && mParameter != null) {
                    mParameter.setFlashMode(Parameters.FLASH_MODE_OFF);
                    mCamera.setParameters(mParameter);
                    mFlashHandler.postDelayed(mFlashRunnable, OPEN_DELAYED_TIME);
                }
            } else {
                mIsOpen = true;
                if (mCamera != null && mParameter != null) {
                    mParameter.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    mCamera.setParameters(mParameter);
                    mFlashHandler.postDelayed(mFlashRunnable, CLOSE_DELAYED_TIME);
                }
            }
        }
    };

导入包:

import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.os.Handler;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.content.Context;
import android.provider.Settings;

最后在onCreate()方法中加上  initInCallFlashLed();

public void onCreate() {

...

initInCallFlashLed();

}

注意在AndroidManifest.xml中加入权限:

<uses-permission android:name="android.permission.FLASHLIGHT" />  
    <uses-permission android:name="android.permission.CAMERA"/>

6572KK下栏状态栏增加来电闪烁开关相关推荐

  1. android增加来电闪光灯功能吗,苹果/安卓手机闪光灯提醒功能:手机来电闪光灯提醒怎么设置?...

    为了不影响身边的朋友.同事,相信许多人在室内使用手机的时候,都会自觉打开静音模式.不过静音模式也让不少朋友感到烦恼,手机放在桌面.裤兜都有可能错过重要电话和消息,那么有没有可以代替铃声的方法呢?现在不 ...

  2. SystemUI 状态栏增加移动数据开启图标

    原生设计中,移动数据图标只有在网络活动(下载/上传)时,才显示相应的小白色三角图标,如果没有网络活动则没有任何显示.需要在不活动时也显示灰色的三角图标. 系统导航栏中常见信号图标包括:SIM卡信号(移 ...

  3. android volte功能,Android 7.1 关于Volte新增加一些功能开关

    7.1新增加功能开关(CarrierConfigManager) 1.默认不插卡紧急号码走ims,设置开关: // SetKEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY ...

  4. android增加来电闪光灯功能吗,安卓关于来电与短信闪光灯功能研究

    手机来电或者通话时闪烁的LED效果,比较绚丽,找了机会,研究了一下.. 一 .  分析过程 1.  既然是闪光,那肯定是跟Light有关系了,于是乎,找到了一个LightService.java的文件 ...

  5. android下拉列表添加开关,下拉菜单界面增加了Nearby开关

    适用产品: HUAWEI Mate 30(全网通版 8gb+256gb.移动定制版 6gb+128gb.全网通版 6gb+128gb.全网通版 8gb+128gb.移动定制版 8gb+128gb),H ...

  6. 给FootSwitch脚踏板增加静音开关

    简 介: 对于USB接口的FootSwitch塑料静音脚踏版, 增加了架子鼓静音脚踏版,效果得到明显的提高. 这位之后进一步进行改造提供了经验. 关键词: USB,Footswitch,脚踏板,静音 ...

  7. Android悬浮窗滤镜,屏幕滤镜(PWM防闪烁)

    屏幕滤镜(PWM防闪烁)app是一款不错的手机护眼工具,特别适合用户夜间在低亮度环境下游玩手机,不怕低亮度下PWM调光伤眼.屏幕滤镜让各位用户可以在夜晚睡觉前等场景更舒适地玩手机,需要的朋友赶紧下载吧 ...

  8. 第八篇:稳定性之提升团队潜意识【及时复盘、开关设计】

    及时复盘 复盘,本是一个围棋术语.指下完棋,棋手重新摆一遍下棋的过程,探讨得失,总结有无更好的应对招数.而现在,这个词已经被泛化,许多企业把它赋予了管理学意义.联想最早引入"复盘" ...

  9. Android 8.0 状态栏信号显示、信号定制

    之前发了下拉通知栏开关修改的一篇文章. 这篇文章呢,主要介绍一下Android状态栏信号图标显示的流程. 便于在Android源生上开发的碰到问题的朋友,希望能对读者有所帮助.内容可能比较长 首先还是 ...

最新文章

  1. matlab金属槽有限差分法程序,有限差分法MATLAB程序
  2. 配置ISA Server 2006 ×××使用户轻松连接内网
  3. 【Git笔记3】关于撤销、删除、恢复的那些事儿
  4. 用shell批量转储表
  5. VTK:libvtkGUISupportQt-6.3.so.1: cannot open shared object
  6. Ranger-AdminServer安装(开启Kerberos)
  7. PowerDesigner(三)-企业架构模型
  8. c语言自定义函数案例情景,第4周 C语言及程序设计提高例程-3 体验自定义函数...
  9. 2022年ADB 命令知多少?一文2000字详细 ADB 命令大全来啦
  10. 集线器与交换机的区别
  11. 3.0_Linux如何连接网络
  12. 小程序与公众号共用服务器端,小程序和公众号能否共用同一个数据库
  13. IJ下的JavaWeb的搭建
  14. 一个语法分析器的实现
  15. Linux压力测试工具—Siege命令
  16. Tailscale 开源版中文部署指南(支持无限设备数、自定义多网段 、自建中继等高级特性)...
  17. 微信小程序修改switch组件的大小
  18. el-select 内如何渲染彩色IconFont图标
  19. 计算机毕业设计springboot+vue基本微信小程序的水库巡检系统
  20. 渗透测试 学习笔记 思维导图

热门文章

  1. 双卡双待 android,支持双卡双待+运行Android 5.1系统 华为Mate 8或9月2日登场
  2. linux pptp 服务器搭建,Linux搭建pptp ***服务器
  3. @Validated注解校验
  4. NetCore使用Dapper查询数据
  5. 【linux】查看文件目录大小
  6. 基于显扬科技自主研发3D机器视觉HY-MX在卫浴柔性打磨中的应用
  7. java去掉两层双引号
  8. 恢复系统设置或计算机无法点击进入,系统还原步骤_教您系统还原操作方法
  9. 关于iOS提交审核的IDFA
  10. fel 文档_FEL诱导半导体材料非线性光吸收