首页 > 其他分享 >Android 11 sim卡来电不弹出悬浮通知,默认来电默认全屏

Android 11 sim卡来电不弹出悬浮通知,默认来电默认全屏

时间:2023-12-11 19:23:39浏览次数:27  
标签:11 java notification 默认 来电 return android com

默认情况下,来电android是以通知窗口的形式显示,只在屏幕的顶部弹出一个悬浮通知,现在改为全屏显示,直接跳转来电界面InCallActivity

\packages\apps\Dialer\java\com\android\incallui\StatusBarNotifier.java

 /**
   * Helper method for updateInCallNotification() and updateNotification(): Update the phone app's
   * status bar notification based on the current telephony state, or cancels the notification if
   * the phone is totally idle.
   */
  private boolean firstShow = true;//add
  @RequiresPermission(Manifest.permission.READ_PHONE_STATE)
  private void updateInCallNotification() {
    LogUtil.d("StatusBarNotifier.updateInCallNotification", "");

    final DialerCall call = getCallToShow(CallList.getInstance());
    // don't show Notification, if call has already been rejected
    if (call != null && !call.isRejected()) {
      // add 当去电或者来电是会一直重复调用这个方法,要做一个判断,防止重复进入InCallActivity
      showNotification(call);
      if (firstShow) {
        context.startActivity(InCallActivity.getIntent(context, false/*showDialpad*/, false/*newOutgoingCall*/, true /* forFullScreen */));
        firstShow = false;
      }
      //add end
    } else {
      firstShow = true;//add
      cancelNotification();
    }
  }


Android 11 通知是否弹出,有两个因素决定,
一个是通知的优先级(setPriority(NotificationCompat.PRIORITY_MIN)),

另一个是通知渠道(通道)的优先级(NotificationManager.IMPORTANCE_HIGH)
public NotificationChannel(String id, CharSequence name, @Importance int importance) {
        this.mId = getTrimmedString(id);
        this.mName = name != null ? getTrimmedString(name.toString()) : null;
        this.mImportance = importance;
    }


\packages\apps\Dialer\java\com\android\dialer\notification\NotificationChannelManager.java
这是通话app 为通知渠道的管理和创建

private static void createIncomingCallChannel(@NonNull Context context) {
    NotificationChannel channel =
        new NotificationChannel(
            NotificationChannelId.INCOMING_CALL,
            context.getText(R.string.notification_channel_incoming_call),
            NotificationManager.IMPORTANCE_MAX);
    ......
  }
  

实际修改 :来电通知弹出悬浮 
/** Sets up the main Ui for the notification */
  @RequiresPermission(Manifest.permission.READ_PHONE_STATE)
  private void buildAndSendNotification(CallList callList, DialerCall originalCall, ContactCacheEntry contactInfo) {
    
   ...........
   switch (notificationType) {
      case NOTIFICATION_INCOMING_CALL:
        if (BuildCompat.isAtLeastO()) {
          builder.setChannelId(NotificationChannelId.ONGOING_CALL);// add old -> NotificationChannelId.INCOMING_CALL
        }
        ......
        }
        break;
      case NOTIFICATION_INCOMING_CALL_QUIET:
        if (BuildCompat.isAtLeastO()) {
          builder.setChannelId(NotificationChannelId.ONGOING_CALL);
        }
        break;

    ............
  }
  
按钮接听方式
修改位置
packages\apps\Dialer\java\com\android\incallui\answer\impl\answermethod\AnswerMethodFactory.java

@NonNull
  public static AnswerMethod createAnswerMethod(@NonNull Activity activity) {
    if (needTwoButton(activity)) {
      return new TwoButtonMethod();
    } else {
      //return new FlingUpDownMethod();
      return new TwoButtonMethod();//add 
    }
  }

参考1
参考2

其实通知和SystemUI 相关,也可以在它哪里拦截!!!


SystemIU关于悬浮通知
  modified:   packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java
	modified:   packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
	modified:   packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
	
//HeadsUpManager.java
@Override
    protected void onAlertEntryAdded(AlertEntry alertEntry) {
        NotificationEntry entry = alertEntry.mEntry;
        if(entry.getSbn().getPackageName().equals("com.xx.xxx")){
            return;
        }
        entry.setHeadsUp(true);
        setEntryPinned((HeadsUpEntry) alertEntry, shouldHeadsUpBecomePinned(entry));
        for (OnHeadsUpChangedListener listener : mListeners) {
            listener.onHeadsUpStateChanged(entry, true);
        }
    }

参考3

在Frameworks层拦截Home键
https://blog.csdn.net/abc6368765/article/details/132164705

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

/** {@inheritDoc} */
     @Override
     public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
......
// First we always handle the home key here, so applications
         // can never break it, although if keyguard is on, we do let
         // it handle it, because that gives us the correct 5 second
         // timeout.
        if (keyCode == KeyEvent.KEYCODE_HOME) {

             // If we have released the home key, and didn't do anything else
             // while it was pressed, then it is time to go home!
             if (!down) {
                 //添加的判断当前前台运行APP代码
                 if (!isBackgroundActivity(mContext, PKG_NAME_xxxxx)) {
                         Log.d(TAG, "xxxx app is foreground");
                         if (!getTopActivity(mContext).equals(ACTIVITY_NAME_xxxx)) {
                                 Log.d(TAG, "xxxxx app is foreground activity");
                                 return -1;
                         }
                        return -1;
                 }

                 cancelPreloadRecentApps();

                 mHomePressed = false;
                 if (mHomeConsumed) {
                     mHomeConsumed = false;
                     return -1;
                 }
                 ......

标签:11,java,notification,默认,来电,return,android,com
From: https://www.cnblogs.com/kato-T/p/17895341.html

相关文章

  • 修改Postgresql默认账号postgres的密码
    1.修改用户postgres的密码PostgreSQL数据库默认创建管理员账号:postgres;修改其密码,仅需一下三步:1、首先,登录PostgreSQLsudo-upostgrespsqlpostgres-p54322、然后,修改账号postgres的密码ALTERUSERpostgresWITHPASSWORD'Lpf65BsDhDNdaJmH';3、最后,退出pgsql客户端exi......
  • 装完Ubuntu后默认root用户的密码是多少?如何修改root密码
    1、Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码。可以在终端输入命令:sudopasswd然后输入当前用户的密码。2、终端会提示输入新的密码并确认,此时的密码就是root新密码。修改成功后,输入命令:suroot再输入新的密码就ok了。......
  • Linux修改conda默认环境位置,引发故障及解决方案
    参考资料:服务器管理-Linux修改conda默认环境位置-知乎(zhihu.com)服务器home目录过大,被管理员提示了,排查了磁盘占用后,觉得将conda位置调整一下腾出的空间最大,就找到了参考资料改了conda的默认环境位置。修改完后condainfo查看的信息也符合预期,就把env和pkgs文件夹直......
  • 2023.12.11——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.c#明日计划:学习......
  • 题解 QOJ1173【Knowledge Is...】 / accoders::NOI 5681【interval】
    https://qoj.ac/contest/537/problem/1173problem给定\(n\leq10^6\)个区间,你需要求出能够最多选出多少对区间,使得两个区间不交(区间为闭区间)。要求一个区间最多属于一对选出的区间。solution这是一般图匹配问题的特殊情况,所以放弃dp,考虑贪心、网络流、匹配等。按照左端点......
  • 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.11)
    一、百度网盘SVIP超级会员共享账号可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答。我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免了U盘的物理载体,直接在网上就实现文件传输。百度网盘SVIP会员可以让自己百度账......
  • arm架构下,VMware Fusion 13.0.1 安装 windows11 踩的坑
    一、提示网络安装出错虚拟机-设置-选择用于启动虚拟机的设备:硬盘NVMe(之间尝试过启动到bios等操作)二、提示不满足win11安装条件1、将cpu设置为4核2、磁盘设置为100g且为提前分配3、虚拟机-设置-加密-选择了只有TPM所需的文件已加密并设置密码4、添加设备,将“可信平台模块”添......
  • 关键字 开发-11 yaml文件中添加fixture功能
    前言每一条pytest用例都可以添加fixture的前置功能,只需要在用例的参数中传入在conftest.py文件中写的函数的名称就可以实现每条用例的前置和后置。1.yaml文件中加入fixture的功能因为我们实现了动态生成测试用例,所以我们可以直接通过在生成动态用例的时候就传入该fixture函数......
  • 112. 路径总和
    目录题目法一、DFS法二、回溯题目给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则,返回false。法一、DFS判断当前节点是否为叶子节......
  • win11桌面图标去掉小箭头
    regadd"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIcons"/v29/d"%systemroot%\system32\imageres.dll,197"/treg_sz/ftaskkill/f/imexplorer.exeattrib-s-r-h"%userprofile%\AppDat......