android 简单实现电话的监听

先讲下大致的思路吧,首先是根据监听电话的不同状态来实现的。在接听电话时就开始录音,在电话空闲状态时就停止录音。把录音的文件保存到sd卡上,

电话录音的几个步骤

  1. 首先是实例化MediaRecorder
    mRecorder = new MediaRecorder();
  2. 指定录音机的声音源(MIC表示的是麦克风)
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  3. 设置录制的文件输出的格式
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
  4. 指定录音文件的名称
    File file=new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + “.3gp”);
    mRecorder.setOutputFile(file.getAbsolutePath());

  5. 设置音频的编码
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

  6. 准备开始录音
    mRecorder.prepare();

  7. 开始录音
    mRecorder.start();

  8. 停止录音
    mRecorder.stop();

  9. 释放资源
    mRecorder.release();

我们知道了录音的大致步骤我们就开始实现吧。

先在创建个PhoneService服务,代码如下:

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import java.io.File;

public class PhoneService extends Service {
    // 电话管理器
    private TelephonyManager tm;
    // 监听器对象
    private MyListener listener;
    //声明录音机
    private MediaRecorder mRecorder;

    public PhoneService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    //服务开启调用该方法
    @Override
    public void onCreate() {
        super.onCreate();
        tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        listener = new MyListener();
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    //服务销毁调用该方法
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 取消电话的监听
        tm.listen(listener, PhoneStateListener.LISTEN_NONE);
        listener = null;
    }

    private class MyListener extends PhoneStateListener {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            try {
                switch (state) {
                    case TelephonyManager.CALL_STATE_IDLE://空闲状态。
                        if (mRecorder != null) {
                            //8.停止捕获
                            mRecorder.stop();
                            //9.释放资源
                            mRecorder.release();
                            mRecorder = null;
                        }

                        break;
                    case TelephonyManager.CALL_STATE_RINGING://零响状态。

                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK://通话状态

                        //1.实例化一个录音机
                        mRecorder = new MediaRecorder();
                        //2.指定录音机的声音源
                        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                        //3.设置录制的文件输出的格式
                        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                        //4.指定录音文件的名称
                        File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".3gp");
                        mRecorder.setOutputFile(file.getAbsolutePath());
                        //5.设置音频的编码
                        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                        //6.准备开始录音
                        mRecorder.prepare();
                        //7.开始录音
                        mRecorder.start();

                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}

如果是还是用eclipse的话记得注册服务,我用的是androidstudio,我创建时,as自动为我注册好了。

在activity_main.xml中就是两个按钮。一个是开启, 服务,一个是关闭服务。很简单,为了初学者我也是贴上代码


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.edu.phonetest.MainActivity">

<Button
    android:id="@+id/startService"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="开启服务"/>

    <Button
        android:id="@+id/stopService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="关闭服务"/>
LinearLayout>

在MainActivity.java中,代码如下:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button startServiceButton;
    private Button stopServiceButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWidget();//初始化控件
        //为startServiceButton,stopServiceButton注册监听事件
        startServiceButton.setOnClickListener(this);
        stopServiceButton.setOnClickListener(this);
    }

    /**
     * 初始化控件
     */
    private void initWidget() {
        startServiceButton= (Button) findViewById(R.id.startService);
        stopServiceButton= (Button) findViewById(R.id.stopService);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.startService:
                //开启服务
                Intent intent1=new Intent(this,PhoneService.class);
                startService(intent1);
                break;
            case R.id.stopService:
                //停止服务。
                Intent intent2 = new Intent(this,PhoneService.class);
                stopService(intent2);
                break;
            default:
                break;

        }
    }
}

最后别忘了,记着添加权限,把这三个权限添加到AndroidManifest.xml

  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

这样我们的简单的电话监听器就实现了。

还可以增加的内容有:

1,为了防止用户在应用管理上把你的服务停掉,你可以添加开机广播上,在广播里开启服务,这样用户一开机就会开启你这服务。
2,还可以就是,再写个一样的服务,当用户关闭这服务,在onDestory方法中开启你那个服务,反之在那个服务onDestory方法中,开启服务,这样不管关闭哪个服务都会开启一个服务。

本人还在自学安卓中,难免理解有错。望指正。

你可能感兴趣的:(android一点一滴)