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;
}


目录
相关文章
|
5天前
|
Java 开发工具 Android开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计、性能优化以及市场覆盖等方面。通过对这些关键因素的比较分析,旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和目标受众做出明智的平台选择。
|
23天前
|
XML IDE 开发工具
【Android UI】自定义带按钮的标题栏
【Android UI】自定义带按钮的标题栏
30 7
【Android UI】自定义带按钮的标题栏
|
4天前
|
监控 Android开发 iOS开发
探索Android与iOS开发的差异:平台、工具和用户体验的比较
【6月更文挑战第25天】在移动应用开发的广阔天地中,Android和iOS两大平台各领风骚,它们在开发环境、工具选择及用户体验设计上展现出独特的风貌。本文将深入探讨这两个操作系统在技术实现、市场定位和用户交互方面的关键差异,旨在为开发者提供一个全景式的视图,帮助他们在面对项目决策时能够更加明智地选择适合自己项目需求的平台。
|
11天前
|
Java Android开发 Swift
探索Android与iOS开发的差异:平台选择对项目成功的影响
【6月更文挑战第18天】在移动应用开发的广阔天地中,Android和iOS两大平台各据一方,它们在市场份额、用户群体及开发环境上各有千秋。本文将深入分析这两个操作系统的开发差异,探讨如何根据项目需求选择合适的平台,并讨论跨平台解决方案的可行性与挑战。我们将通过实际案例,揭示平台选择对项目成功的关键性影响,为开发者提供决策支持。
|
12天前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。
|
12天前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
15天前
|
安全 Android开发 iOS开发
探索Android与iOS开发的差异:平台特性与用户体验的对比分析
在移动应用开发的广阔天地中,Android和iOS两大阵营各据一方。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计及市场分布等方面的主要区别。通过比较分析,我们将揭示各自平台的特有优势,并讨论如何根据目标受众和业务需求选择适合的开发平台。
|
17天前
|
安全 Android开发 iOS开发
探索Android与iOS开发平台的差异
【6月更文挑战第12天】在移动应用开发的广阔天地中,Android和iOS两大阵营各具特色,它们之间的差异不仅体现在技术层面,更影响着开发者的选择和用户的体验。本文将深入探讨这两大平台在开发环境、用户界面设计、市场策略及安全性方面的主要区别,为开发者提供一份实用的指南,帮助他们在这两个不同的世界中做出明智的决策。
17 3
|
18天前
|
存储 Android开发
安卓app,MediaPlayer播放本地音频 | 按钮控制播放和停止
在Jetpack Compose中,不直接操作原生Android组件如`Button`和`MediaPlayer`,而是使用Compose UI构建器定义界面并结合ViewModel管理音频播放逻辑。以下示例展示如何播放本地音频并用按钮控制播放/停止:创建一个`AudioPlayerViewModel`管理`MediaPlayer`实例和播放状态,然后在Compose UI中使用`Button`根据`isPlaying`状态控制播放。记得在`MainActivity`设置Compose UI,并处理相关依赖和权限。
|
23天前
|
Java Android开发 Swift
探索安卓与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的浩瀚宇宙中,安卓和iOS这两大星系以其独特的引力影响着开发者的航向。本文将穿梭于这两个平台的开发环境、编程语言、用户界面设计、性能优化以及市场分布等方面,揭示它们之间的核心差异。我们将通过比较分析,为开发者提供决策时的参考坐标,帮助他们根据项目需求和目标受众选择合适的平台。加入我们,一起揭开安卓与iOS开发的神秘面纱,探索它们如何塑造移动应用的未来。