一:申请默认电话应用代码

这只是设置你的APP为默认电话应用

A:

Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER);
intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME,getPackageName());
startActivity(intent);

要创建一个 Activity 然后在 menifest 中注册,不过注册时至少需要添加这两个 <intent-filter>,否则不能吊起弹窗

<activity android:name=".XXactivity"><!-- 提供打电话的UI --><intent-filter><action android:name="android.intent.action.DIAL" /><data android:scheme="tel" /></intent-filter><!-- region provides dial UI --><intent-filter><action android:name="android.intent.action.DIAL" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

第一个 <intent-filter> 是用来提供打电话UI的 ,而第二个用于提供拨号功能,至于为什么要分开呢?可以参考 DefaultDialerManager,这是安卓源码里的一个隐藏的类。方法 getInstalledDialerApplications() 上的注释写的很清楚,想要让系统检测到可供拨号的应用就必须至少要添加这两个 <intent-filter>。

B:

申请成功后,一些6.0之后需要动态获取的权限会自动给予,下面列出我测试给予的一些权限

Permission.READ_PHONE_STATE
Permission.READ_CONTACTS
Permission.WRITE_CONTACTS
Permission.READ_CALL_LOG
Permission.WRITE_CALL_LOG
Permission.PROCESS_OUTGOING_CALLS
Permission.CALL_PHONE
Permission.GET_ACCOUNTS

下面的不可以

Permission.WRITE_EXTERNAL_STORAGE
Permission.READ_EXTERNAL_STORAGE

C:

/*** Android M 以上检查是否是系统默认电话应用*/
public static boolean isDefaultPhoneCallApp(Context context) {if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {TelecomManager manger = (TelecomManager) context.getSystemService(TELECOM_SERVICE);if (manger != null) {String name = manger.getDefaultDialerPackage();return name.equals(context.getPackageName());}}return false;
}

二:接听系统来去电广播,并接管来去电的界面

A:InCallService服务接听来去电的广播

<serviceandroid:name=".defaultphone.PhoneCallService"android:permission="android.permission.BIND_INCALL_SERVICE"><meta-dataandroid:name="android.telecom.IN_CALL_SERVICE_UI"android:value="true" /><intent-filter><action android:name="android.telecom.InCallService" /></intent-filter></service>

代替系统默认通话应用并不需要添加特殊的权限,但是要在你实现的 InCallService 上声明 android.permission.BIND_INCALL_SERVICE 权限,另外还要加上 <meta-data> 用于表明我们的应用提供了接听电话的 UI,android.telecom.InCallService 的 <intent-filter> 当然就是用于在电话拨出或打进的时候,让系统发送的广播能够直接启动我们的电话服务。

@RequiresApi(api = Build.VERSION_CODES.M)
public class PhoneCallService extends InCallService {private Call.Callback callback = new Call.Callback() {@Overridepublic void onStateChanged(Call call, int state) {super.onStateChanged(call, state);switch (state) {case Call.STATE_ACTIVE: {Log.e("wjjj","通话中");break; // 通话中}case Call.STATE_DISCONNECTED: {//  ActivityStack.getInstance().finishActivity(PhoneCallActivity.class);Log.e("wjjj","通话结束");break; // 通话结束}}}};// 电话进来时会被调用@Overridepublic void onCallAdded(Call call) {super.onCallAdded(call);call.registerCallback(callback);//  PhoneCallManager.call = call; 拿到它可以实现系统的接听挂断的功能CallType callType = null;if (call.getState() == Call.STATE_RINGING) {callType = CallType.CALL_IN;} else if (call.getState() == Call.STATE_CONNECTING) {callType = CallType.CALL_OUT;}if (callType != null) {Call.Details details = call.getDetails();String phoneNumber = details.getHandle().getSchemeSpecificPart();// 这里开启一个自定义的我们的界面}}// 电话断开时会被调用@Overridepublic void onCallRemoved(Call call) {super.onCallRemoved(call);call.unregisterCallback(callback);// PhoneCallManager.call = null;}注册了这个服务,系统来去电的广播就可以监听到,监听到去开启我们的自定义界面即可,通过测试,发现小米6.0不写开启界面代码,还是系统的界面,而我的荣耀8 8.0,则没有来电界面。

安卓代替系统默认电话应用相关推荐

  1. uni-app 声音/震动提示,播放系统默认消息声音 安卓(Android)测试通过

    uni-app 声音/震动提示,播放系统默认消息声音 安卓(Android)测试通过 可以跟据自己需求使用,有不足的地方希望大家帮忙补充 参数 type Options vibrate:震动 othr ...

  2. 安卓小米系统开发一些适配问题

    开发最佳实践与兼容性建议(适配常见问题) MIUI是基于Android深度定制的操作系统,和Android保持100%兼容,我们准备了一些在Android开发过程中哦给你可能遇到的问题,也许对您有所帮 ...

  3. 手机中geetest是什么文件_安卓手机系统中各类英文文件夹的含义详解,不知道的尽快熟知!...

    说到手机,不管是安卓版还是苹果版的手机,总是会有很多地方让人头疼,不是因为不好用,而是因为不认识,完全不知道干嘛用的.看来使用手机,还需要将自己的英文学好,这样才不会导致自己的手机内存不够用和误删除一 ...

  4. android 获取当前输入法,关于获取安卓手机系统输入法和设置输入法

    关于获取安卓手机系统输入法和设置输入法 获取输入法列表 adb shell ime list -s 出来下面的 io.appium.android.ime/.UnicodeIME com.sec.an ...

  5. 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索. 首先要添加权限 <uses-permission andro ...

  6. 安卓日志系统初探(带你了解Android日志系统的概貌)

    目录 1 介绍 2 ADB的原理 2.1 adbd服务进程 2.2 ADB 服务端 2.2.1 USB方式 2.2.2 网络方式 2.2.3串口方式 2.3 ADB 客户端 3 安卓框架中日志的收集和 ...

  7. 使用系统默认声音、震动

    导入框架: 代码: [cpp] view plaincopy #import <UIKit/UIKit.h> #import <AudioToolbox/AudioToolbox.h ...

  8. java 切换系统输入法,Android7.0更换系统默认输入法

    更换安卓7.0系统默认输入法的方法: 首先我们需要在 frameworks/base/packages/SettingsProvider/src/com/android/providers/setti ...

  9. 安卓程序 静默 截屏工具_安卓定制系统开放性对比测试:到底谁最自由?

    国内的安卓环境相当特殊,由于谷歌服务的缺位,各大厂商都要推出自己的定制化UI,以满足国内用户更加本地化的需求.这样一来,不同品牌的手机,系统体验上也会有很多不同. 相比iOS等封闭系统,安卓的一大优势 ...

最新文章

  1. Ollydbg 中断方法浅探
  2. 微型计算机中数据总线既可以传输数据信息,计算机考试题库精简版
  3. c语文编程提取郑码的单字码表
  4. SAP UI5 sap.ui.core.OpenState.CLOSED Dialog open and close
  5. mysql中触发器中分隔符_php – 在触发器中使用分隔符的Mysql错误
  6. [机器学习]-K近邻-最简单的入门实战例子
  7. CSS3 写的个小东西
  8. 无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本
  9. kubernetes挂载ceph rbd和cephfs的方法
  10. python-property、docstring--笔记
  11. Python股票历史数据下载
  12. 易语言x64驱动鼠标键盘操作技术-支持全系统(win7-win11)
  13. VM ware下载教程
  14. 渗透之SQL注入-MYSQL常用语法
  15. 并发编程(四)---设计模式
  16. iOS m3u8本地缓存播放(控制下载并发、暂停恢复)
  17. Lesson 3 Please send me a card 请给我寄一张明信片
  18. 对项目经理而言,PMP认证是否对职业生涯的发展有帮助?
  19. 微信小程序开发实战9_3 小程序URL Scheme
  20. 申请微信小程序需要的材料

热门文章

  1. 《置身事内》中国政府与经济发展读后梳理
  2. 微信 请求校验(确认请求来自微信服务器)
  3. 线性代数的本质(1)——基底、向量、线性变换、逆阵、行列式
  4. Java基础 - 坦克大战(第五章,坦克移动、与被击中效果功能)
  5. 没事做!还是来写写吧!
  6. 贝叶斯方法(实例1)——概率分布
  7. plsql报错,缓存超限制(ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes) 解决方法
  8. 扇贝编程python学习笔记-基础篇10
  9. STM32笔记——ADC模数转换
  10. 去西湖赴妖娆的荷影盛宴