Android8.1 MTK平台 Dialer修改(通话常亮、按钮接听)

简介: Android8.1 MTK平台 Dialer修改(通话常亮、按钮接听)

通话保持常亮(不息屏)


在网上搜索的 Android保持屏幕常亮的方法,一种是 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);


另一种是通过 wakeLock, 经过测试发现在 InCallActivity.java 中 onCreate()使用第一种并不生效,看网上说的要放到 setContentView()之前


然而试了也没生效,放到自己写的测试demo中,继承自 AppCompatActivity, setFlags需要传递两个参数,如下的方法生效了


getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);


修改 InCallActivity 中的方法,编译时发现报错了,参数不合法,看到 InCallActivity 继承自 FragmentActivity, 不知道跟这个有没有关系,


于是采用第二种方法。


修改位置

alps\vendor\mediatek\proprietary\packages\apps\Dialer\java\com\android\incallui\InCallActivity.java

private PowerManager.WakeLock mWakeLock;
 @Override
  protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    //getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    //add keep inCallActivity keepScreenOn
    PowerManager powerManager= (PowerManager) getSystemService(Context.POWER_SERVICE);    
    mWakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "keep_screen_on_tag");
  }
  @Override
  protected void onResume() {
    super.onResume();
    mWakeLock.acquire();
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    mWakeLock.release();
  }


android.permission.WAKE_LOCK 权限 AndroidManifest 文件中已经存在,就不用添加了


Android系统中的WakeLoke类型有以下几种:

PARTIAL_WAKE_LOCK:保持COU正常运转,屏幕和键盘灯有可能会关闭。


SCREEN_DIM_WAKE_LOCK:保存CPU运转,允许保存屏幕显示但有可能变暗,允许关闭键盘灯。


FULL_WAKE_LOCK:保持CPU运转,保持屏幕高亮显示,键盘灯也保持亮度。


ACQUIRE_CAUSES_WAKEUP:强制屏幕亮起,这种锁主要用于一些必须通知用的操作。


ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间。


接听方式上下滑动,改为按钮接听


安卓源码中提供了两种接听方式,一种为上下滑动,另一种为按钮接听。有点像苹果手机接听一样,有时候是滑动接听,

有时候是两个按钮,一个绿色的接听,一个红色的挂断。效果图如下


20190508193304771.png


滑动接听方式

20190508193312738.png


按钮接听方式

修改位置

vendor\mediatek\proprietary\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();
    }
}

TwoButtonMethod.java 对应按钮接听方式


FlingUpDownMethod.java 对应滑动接听方式


简单说下逻辑,接听界面对应的类为 AnswerFragment,布局文件为 fragment_incoming_call,


接听部分布局id为 answer_method_container,通过加载 Fragment 进行替换


AnswerMethodFactory.createAnswerMethod(getActivity()),此方法去实例化按钮接听方式和滑动接听方式


接通时发送广播通知app(通话界面开始计时)


为啥需要这么干,通过监听状态改变也能判断电话接通,但是没有系统优先级高,这就需要我们来改源码了

**8.1 修改位置 **


vendor\mediatek\proprietary\packages\apps\Dialer\java\com\android\incallui\contactgrid\ContactGridManager.java

public void setCallState(PrimaryCallState primaryCallState) {
    this.primaryCallState = primaryCallState;
    if (DialerCall.State.ACTIVE == primaryCallState.state) {
        Log.e("InCallFragment", "sendBrocast Call.State.ACTIVE =" + primaryCallState.state);
        //cczheng add  , send broadcast when is active
        Intent broIntent = new Intent();
        broIntent.setAction("com.call.state.active");   
        context.sendBroadcast(broIntent);
        //cczheng add  , send broadcast when is active
    }
    updatePrimaryNameAndPhoto();
    updateBottomRow();
    updateTopRow();
  }


6.0 修改位置

packages\apps\InCallUI\src\com\android\incallui\CallCardFragment.java

@Override
public void setCallState(
        int state,
        int videoState,
        int sessionModificationState,
        DisconnectCause disconnectCause,
        String connectionLabel,
        Drawable callStateIcon,
        String gatewayNumber,
        boolean isWifi,
        boolean isConference) {
    boolean isGatewayCall = !TextUtils.isEmpty(gatewayNumber);
    CallStateLabel callStateLabel = getCallStateLabelFromState(state, videoState,
            sessionModificationState, disconnectCause, connectionLabel, isGatewayCall, isWifi,
            isConference);
....
if (Call.State.ACTIVE == state) {
        Log.d(this, "sendBrocast Call.State.ACTIVE " + state);
        //cczheng add  , send broadcast when is active
        Intent broIntent=new Intent();
        broIntent.setAction("com.call.state.active");   
        getActivity().sendBroadcast(broIntent);
        if(CallUtils.isVideoCall(videoState)){
            //videoCall
            final View buttonsView=getView().findViewById(R.id.buttons_container);
            buttonsView.setBackgroundColor(Color.argb(0x99,0xff,0xff,0xff));
            videoFragment.setBGColor(Color.argb(0xff,0x00,0x00,0x00));
        }
    }
}


简单说下,通过打印日志可以看到8.1的接通状态值变化为


CONNECTING(13)->DIALING(6)->ACTIVE(3)->DISCONNECTING(9)->DISCONNECTED(10)->IDLE(2)


alps\vendor\mediatek\proprietary\packages\apps\Dialer\java\com\android\incallui\call\DialerCall.java

public static class State {
public static final int INVALID = 0;
public static final int NEW = 1; /* The call is new. */
public static final int IDLE = 2; /* The call is idle.  Nothing active */
public static final int ACTIVE = 3; /* There is an active call */
public static final int INCOMING = 4; /* A normal incoming phone call */
public static final int CALL_WAITING = 5; /* Incoming call while another is active */
public static final int DIALING = 6; /* An outgoing call during dial phase */
public static final int REDIALING = 7; /* Subsequent dialing attempt after a failure */
public static final int ONHOLD = 8; /* An active phone call placed on hold */
public static final int DISCONNECTING = 9; /* A call is being ended. */
public static final int DISCONNECTED = 10; /* State after a call disconnects */
public static final int CONFERENCED = 11; /* DialerCall part of a conference call */
public static final int SELECT_PHONE_ACCOUNT = 12; /* Waiting for account selection */
public static final int CONNECTING = 13; /* Waiting for Telecom broadcast to finish */
public static final int BLOCKED = 14; /* The number was found on the block list */
public static final int PULLING = 15; /* An external call being pulled to the device */
/// M: [Modification for finishing Transparent InCall Screen if necessary]
/// such as:ALPS02302461,occur JE when MT call arrive at some case. @{
public static final int WAIT_ACCOUNT_RESPONSE = 100;
}


目录
相关文章
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
121 1
|
3月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
18天前
|
IDE 开发工具 Android开发
移动应用开发之旅:探索Android和iOS平台
在这篇文章中,我们将深入探讨移动应用开发的两个主要平台——Android和iOS。我们将了解它们的操作系统、开发环境和工具,并通过代码示例展示如何在这两个平台上创建一个简单的“Hello World”应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧,帮助你更好地理解和掌握移动应用开发。
41 17
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
113 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
119 6
|
3月前
|
开发工具 Android开发 iOS开发
安卓与iOS开发环境对比:选择适合你的平台
【9月更文挑战第26天】在移动应用开发的广阔天地中,安卓和iOS是两大巨头。它们各自拥有独特的优势和挑战,影响着开发者的选择和决策。本文将深入探讨这两个平台的开发环境,帮助你理解它们的核心差异,并指导你根据个人或项目需求做出明智的选择。无论你是初学者还是资深开发者,了解这些平台的异同都至关重要。让我们一起探索,找到最适合你的那片开发天地。
|
3月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
3月前
|
安全 API 开发工具
Android平台RTMP推送|轻量级RTSP服务如何实现麦克风|扬声器声音采集切换
Android平台扬声器播放声音的采集,在无纸化同屏等场景下,意义很大,早期低版本的Android设备,是没法直接采集扬声器audio的(从Android 10开始支持),所以,如果需要采集扬声器audio,需要先做系统版本判断,添加相应的权限。
|
3月前
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
|
3月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
87 0