欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android系统设置之勿扰模式

程序员文章站 2022-06-26 15:14:47
项目场景:智能车载机问题描述:车载机使用4G流量,但客户接入的是带通话功能的sim卡,客户测试过程中遇到有人拨号,来电音量不是静音情况下,居然通了。客户提出禁止来电功能。原因分析:尽管系统进行了裁剪,去掉了拨号和来电APP,但是来电等功能还是可以使用的,最后无人接通,系统通知栏出现了来电未接图标。解决方案:方案1,求助系统开发人员在系统层修改代码,禁止来电及拨号功能,当然是行的通的,但是被告知不能及时修改,那么进行OTA升级可能要过段时间,可是应用马上到了发布日,就先自己想想办法了...

项目场景:

智能车载机

问题描述:

车载机使用4G流量,但客户接入的是带通话功能的sim卡,客户测试过程中遇到有人拨号,来电音量不是静音情况下,居然通了。客户提出禁止来电功能。


原因分析:

尽管系统进行了裁剪,去掉了拨号和来电APP,但是来电等功能还是可以使用的,最后无人接通,系统通知栏出现了来电未接图标。


解决方案:

方案1,求助

系统开发人员在系统层修改代码,禁止来电及拨号功能,当然是行的通的,但是被告知不能及时修改,那么进行OTA升级可能要过段时间,可是应用马上到了发布日,就先自己想想办法了。当然如果你的小伙伴很给力,那么直接进行OTA升级就可以解决,应用层无需更改。

方案2,实现来电自动拒接

监听来电通知,在有电话进来的时候,拒接,注意:权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />

实现方法(注意我这边因为有系统编译的SDK包,所以可以直接调用,没有的话,可通过反射实现)

反射实现参考点击我

    private void  endCall(){
        AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        TelephonyManager  tm = (TelephonyManager) getSystemService(Service.TELEPHONY_SERVICE);
        tm.listen(new PhoneStateListener(){

            @Override
            public void onCallStateChanged(int state, String phoneNumber) {
                super.onCallStateChanged(state, phoneNumber);
                Log.e("onCallStateChanged","state = "+state +"  phoneNumber = "+phoneNumber);
                if(state==TelephonyManager.CALL_STATE_RINGING){
                    am.setRingerMode(AudioManager.RINGER_MODE_SILENT);//设置为静音模式,解决延迟导致的响铃问题
                    tm.endCall();
                    am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复普通模式,恢复声音
                }
            }
        },PhoneStateListener.LISTEN_CALL_STATE);

    }

方案3,设置勿扰模式

通过设置勿扰模式策略,设置在一些场景下,忽略来电,短信,通知,闹铃等,此处参考android 7.0的源码,路径com.android.settings.notification.ZenModePrioritySettings。

还是那个前提,因为是定制系统,我有系统SDK的jar包,并且是系统签名的app,所以直接调用。

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
public class ZenModePriorityUtils {



    public static void zenMode_switch(Context context,int categoryType,boolean allowed){
        NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        nm.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY);
        NotificationManager.Policy policy = nm.getNotificationPolicy();
        int priorityCategories = getNewPriorityCategories(policy,allowed,categoryType);
        NotificationManager.Policy newPolicy = new NotificationManager.Policy(priorityCategories, policy.priorityCallSenders, policy.priorityMessageSenders,
                policy.suppressedVisualEffects);
        NotificationManager.from(context).setNotificationPolicy(newPolicy);
    }


    private static boolean isPriorityCategoryEnabled(NotificationManager.Policy mPolicy,int categoryType) {
        return (mPolicy.priorityCategories & categoryType) != 0;
    }

    private static int getNewPriorityCategories(NotificationManager.Policy mPolicy,boolean allow, int categoryType) {
        int priorityCategories = mPolicy.priorityCategories;
        if (allow) {
            priorityCategories |= categoryType;
        } else {
            priorityCategories &= ~categoryType;
        }
        return priorityCategories;
    }

       //设置勿扰模式---重复来电者
        ZenModePriorityUtils.zenMode_switch(this,NotificationManager.Policy.PRIORITY_CATEGORY_REPEAT_CALLERS,false);
        //设置勿扰模式---来电
        ZenModePriorityUtils.zenMode_switch(this,NotificationManager.Policy.PRIORITY_CATEGORY_CALLS,false);
        //设置勿扰模式---媒体(设备有广告,媒体音量不加入勿扰模式)
        ZenModePriorityUtils.zenMode_switch(this,NotificationManager.Policy.PRIORITY_CATEGORY_MEDIA,true);
        //设置勿扰模式---讯息
        ZenModePriorityUtils.zenMode_switch(this,NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES,false);
        //设置勿扰模式---闹铃
        ZenModePriorityUtils.zenMode_switch(this,NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS,false);
        //设置勿扰模式---提醒
        ZenModePriorityUtils.zenMode_switch(this,NotificationManager.Policy.PRIORITY_CATEGORY_REMINDERS,false);
        //设置勿扰模式---活动
        ZenModePriorityUtils.zenMode_switch(this,NotificationManager.Policy.PRIORITY_CATEGORY_EVENTS,false);

总结:

最终采用方案3,但需要注意的,由于7.0到9.0这部分代码,android进行了较大改动,部分设置需要在9.0上才能有效果。

感谢这几位:

https://www.jianshu.com/p/ab88284384e9
https://blog.csdn.net/ty_phone8/article/details/78193055

https://www.jianshu.com/p/a5662fad84b5

https://blog.csdn.net/u010381752/article/details/48113083
https://blog.csdn.net/guduxiake1106/article/details/51065633?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

本文地址:https://blog.csdn.net/lucky_tom/article/details/108854046