您的位置:首页 > 移动开发 > Android开发

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
喜欢的朋友可以关注我!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: