权限:
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
public class MainActivity extends AppCompatActivity {

    AudioManager audioManager;
int currVolume;//当前音量 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
TelListner listener = new TelListner();
telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
} public void click(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (MainActivity.this.checkSelfPermission(Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
callPhone();
} else {
//
Toast.makeText(this, "没有权限", Toast.LENGTH_LONG).show();
}
} else {
callPhone();
}
} void callPhone() {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:10086"));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(callIntent);
} private class TelListner extends PhoneStateListener {
boolean comingPhone = false;//标识 @Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:/* 无任何状态 */
if (this.comingPhone) {
this.comingPhone = false;
setSpeekModle(false);
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:/* 接起电话 */
this.comingPhone = true;
setSpeekModle(true);
break;
case TelephonyManager.CALL_STATE_RINGING:/* 电话进来 */
this.comingPhone = true;
setSpeekModle(true);
break;
}
}
} void setSpeekModle(boolean open) {
audioManager.setMode(AudioManager.ROUTE_SPEAKER);
currVolume = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
//5.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); } else {
audioManager.setMode(AudioManager.MODE_IN_CALL);
} if (!audioManager.isSpeakerphoneOn() && open) {
Toast.makeText(MainActivity.this, "免提模式", Toast.LENGTH_LONG).show();
audioManager.setSpeakerphoneOn(true);//开启免提
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL),
AudioManager.STREAM_VOICE_CALL);
} else if (audioManager.isSpeakerphoneOn() && open) {
audioManager.setSpeakerphoneOn(false);
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, currVolume,
AudioManager.STREAM_VOICE_CALL);
}
}
}

ps:此方式在华为手机上不兼容

Android拨打接听电话自动免提的更多相关文章

  1. android代码实现免提功能

    初始化AudioManager: private static AudioManager audioManager; 实现免提功能方法 protected void setSpeekModle() { ...

  2. Android开发——短信电话拦截/接听电话

    1.短信拦截 首先需要声明的是,Android4.4版本以上,如果想做到短信拦截,必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截.但这种做法,适配性和兼容性的工作是非常 ...

  3. 手把手教你Android来去电通话自动录音的方法

    我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能. 来去电自动录音的关键在 ...

  4. 模拟接听电话的方法,兼容华为android5.0以上设备

    /** * 通过反射调用的方法,接听电话,该方法只在android 2.3之前的系统上有效. * * @param context */private static void answerRingin ...

  5. Android Tasker应用之自动查询并显示话费流量套餐信息

    Android Tasker应用之自动查询并显示话费流量套餐信息 虽然Android平台有非常多的流量监控软件,但最准确的流量数据还是掌握在运营商手里.有些朋友可能像我一样时不时地发短信查询流量信息, ...

  6. Flutter实战视频-移动电商-14.首页_url_launcher一键拨打店长电话

    14.首页_url_launcher一键拨打店长电话 首页拨打电话的功能. 接收连个值,一个是店长的头像,一个是电话号码, 然后开始写我们的build方法.点击图片的时候要有一个拨打电话的动作.我们要 ...

  7. Android实例-使用电话拨号器在移动设备上(官方)(XE8+小米2)

    源文地址: http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Using_the_Phone_Dialer_on_Mob ...

  8. HTC仅限拨打紧急电话

    问题描述: 我手上有台 HTC One V 没碰没撞,突然打不出电话,信号上显示一个叉,屏幕上显示“仅限拨打紧急电话” 解决办法:经百度,原来很多HTC机子都有这种情况,幸好不是硬件坏了,只需按以下步 ...

  9. iOS OC环信实时语音切换听筒免提听不到声音报错:AVAudioSessionErrorCodeBadParam

    出现这个报错:AVAudioSessionErrorCodeBadParam 先看看你的问题是不是在切换听筒免提的时候 听不到声音了, 不是的可以继续搜索去了   问题在这里 把圈住的那个货换成这个就 ...

随机推荐

  1. MySQL--字符集基础

    ========================================================================= 字符集和编码规则 字符集:特定类型或用途的字符集合, ...

  2. golang 版本 gearman 试用

    g2 是golang 版的gearman 实现,包含了server (支持leveldb,以及metrics).client 代码.worker 代码 使用上还是很方便的,同时部署也比较简单,结合do ...

  3. Dynamics CRM Solution

    Default solution Dynamics comes pre-loaded with a Default Solution Contains all the base objects, en ...

  4. Pycharm主题设置以及导入方式

    主题下载链接: http://www.themesmap.com/ pycharm -- 导入主题(theme) and 修改背景颜色(护眼色)   前情提要 众所周知,随着python语言的不断流行 ...

  5. powerdesigner-ER图建模

    PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...

  6. activiti 委派和转办的区别

    委派 委派:是将任务节点分给其他人处理,等其他人处理好之后,委派任务会自动回到委派人的任务中 将hr的任务进行委派: taskService.delegateTask(taskId, userId); ...

  7. direct3d

    DirectX for .Net procedure 1, install DXSDK  https://www.microsoft.com/en-us/download/details.aspx?i ...

  8. kafka 知识点

    Replica如何分布 为了尽量做好负载均衡和容错能力,需要将同一个Partition的Replica尽量分散到不同的机器.如果所有的Replica都在同一个Broker上,那一旦该Broker宕机, ...

  9. pyquery的使用

    常用的三种初始化方法: 1.字符串初始化: from pyquery import PyQuery as pq html=""" <html> <hea ...

  10. 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...