80,350
社区成员
发帖
与我相关
我的任务
分享
package com.demo;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.gsm.SmsMessage;
public class ListenService extends Service {
public static final String SvrId = "RARNU.SERVICE.DEMO";
public static final String strACT = "android.provider.Telephony.SMS_RECEIVED";
private SMSMsgReceiver recv;
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onCreate() {
IntentFilter filter = new IntentFilter(strACT);
recv = new SMSMsgReceiver();
registerReceiver(recv, filter);
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
unregisterReceiver(recv);
super.onDestroy();
}
public class SMSMsgReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(strACT)) {
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage currMsg : msg) {
sb.append("From:");
sb.append(currMsg.getDisplayOriginatingAddress());
sb.append("\nMessage:");
sb.append(currMsg.getDisplayMessageBody());
}
}
Intent i = new Intent(SvrId);
i.putExtra("PARAM", sb.toString());
sendBroadcast(i);
}
}
}
}
要监听android打电话和接电话,只需下面2步骤
1.第一步,写一个Receiver继承自BroadcastReceiver
public class PhoneStatReceiver extends BroadcastReceiver{
private static final String TAG = "PhoneStatReceiver";
// private static MyPhoneStateListener phoneListener = new MyPhoneStateListener();
private static boolean incomingFlag = false;
private static String incoming_number = null;
@Override
public void onReceive(Context context, Intent intent) {
//如果是拨打电话
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
incomingFlag = false;
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, "call OUT:"+phoneNumber);
}else{
//如果是来电
TelephonyManager tm =
(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
incomingFlag = true;//标识当前是来电
incoming_number = intent.getStringExtra("incoming_number");
Log.i(TAG, "RINGING :"+ incoming_number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if(incomingFlag){
Log.i(TAG, "incoming ACCEPT :"+ incoming_number);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if(incomingFlag){
Log.i(TAG, "incoming IDLE");
}
break;
}
}
}
}
第二步:在AndroidManifest.xml,配置写好的Receiver,并拦截相应的BroadCastAction,
另外注意加上相应的权限。
<receiver android:name=".filter.PhoneStatReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
E/AndroidRuntime( 1216): java.lang.RuntimeException: Unable to instantiate receiver com.KT.MAP100_MainService.MainService$myBroadcastReceiver: java.lang.InstantiationException: com.KT.MAP100_MainService.MainService$myBroadcastReceiver
E/AndroidRuntime( 1216): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2520)
E/AndroidRuntime( 1216): at android.app.ActivityThread.access$3000(ActivityThread.java:116)
E/AndroidRuntime( 1216): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1843)
E/AndroidRuntime( 1216): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1216): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 1216): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 1216): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1216): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 1216): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 1216): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 1216): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1216): Caused by: java.lang.InstantiationException: com.KT.MAP100_MainService.MainService$myBroadcastReceiver
E/AndroidRuntime( 1216): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime( 1216): at java.lang.Class.newInstance(Class.java:1472)
E/AndroidRuntime( 1216): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2513)
E/AndroidRuntime( 1216): ... 10 more