Android实战简易教程-第七十三枪(拨打、接听电话自动免提)
2016-04-23 16:48
591 查看
开车时接电话十分危险,这时可以考虑开发一款APP,拨打电话或接听电话时自动免提,原理也比较简单,监听电话接通状态,电话接通时打开扬声器即可,代码如下:package demo.androidwar.com.test;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;
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);
}
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);
audioManager.setMode(AudioManager.MODE_IN_CALL);
if(!audioManager.isSpeakerphoneOn()&&open) {
audioManager.setSpeakerphoneOn(true);//开启免提
Toast.makeText(MainActivity.this,"免提模式",Toast.LENGTH_LONG).show();
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);
}
}
}
需要配置权限,AndroidMainfest.xml文件代码如下:<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="demo.androidwar.com.test">
<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" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
运行项目实例,在真机上进行调试,我进行调试的机型有三星的Note3、S6 edge+和魅族都测试成功,唯独华为手机没有测试成功,希望有经验的读者留言告知原因,谢谢。
我的电子书上线了,欢迎阅读:
http://yuedu.baidu.com/ebook/284b41a1e518964bce847c90
喜欢的朋友可以关注我!
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;
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);
}
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);
audioManager.setMode(AudioManager.MODE_IN_CALL);
if(!audioManager.isSpeakerphoneOn()&&open) {
audioManager.setSpeakerphoneOn(true);//开启免提
Toast.makeText(MainActivity.this,"免提模式",Toast.LENGTH_LONG).show();
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);
}
}
}
需要配置权限,AndroidMainfest.xml文件代码如下:<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="demo.androidwar.com.test">
<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" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
运行项目实例,在真机上进行调试,我进行调试的机型有三星的Note3、S6 edge+和魅族都测试成功,唯独华为手机没有测试成功,希望有经验的读者留言告知原因,谢谢。
我的电子书上线了,欢迎阅读:
http://yuedu.baidu.com/ebook/284b41a1e518964bce847c90
喜欢的朋友可以关注我!
相关文章推荐
- Android封装支付宝支付
- android 5.0 自动接听电话
- 如何把AChartEngine加载到view视图?
- 40条Android开发优化建议
- 推荐提升 Android 性能的建议
- android 5.0 自动接听电话
- Android课程---序列化与反序列化(转)
- 最新Android & iOS设计尺寸规
- 更改android项目名字
- 在SQL数据库中保存数据Saving Data in SQL Databases——翻译自developer.android.com Training
- Android MeasureSpec介绍及使用详解
- 【转】 viewpage禁止滑动--android
- android AIDL(草稿)
- Android 继承ViewGroup必须重写onMeasure方法和onLayout方法
- Android tips
- android屏幕适配
- Android基础:Android权限
- android之AlertDialog 点击其它区域自己主动消失
- Android Volley详细解析(一):Volley基本用法
- Android 基本属性绘制文本对象FontMetrics介绍