Android实战简易教程-第七十三枪(拨打、接听电话自动免提)

开车时接电话十分危险,这时可以考虑开发一款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

喜欢的朋友可以关注我!

你可能感兴趣的:(Android实战简易教程-第七十三枪(拨打、接听电话自动免提))