我想创建一个应用程序来监视用户呼叫(传出/传入)和短信(传入)。关于BroadcastReceivers的几个问题:
所以我创建了3个广播接收机:
IncomingCallReceiver
public class IncomingCallReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
MyPhoneStateListener phoneListener = new MyPhoneStateListener(context);
TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
OutgoingCallReceiver
public class OutgoingCallReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.d("DEBUG", "RINGING (outgoing call) with number: " + number);
Toast.makeText(context, "Outgoing call number: " + number, Toast.LENGTH_LONG).show();
}
}
IncomingSmsReceiver
public class IncomingSmsReceiver extends BroadcastReceiver
{
final SmsManager sms = SmsManager.getDefault();
@Override
public void onReceive(Context context, Intent intent) {
// Retrieves a map of extended data from the intent.
final Bundle bundle = intent.getExtras();
try
{
if (bundle != null)
{
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++)
{
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
String message = currentMessage.getDisplayMessageBody();
Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message);
Toast.makeText(context, "senderNum: " + senderNum + ", message: " + message, Toast.LENGTH_LONG).show();
}
}
// bundle is null
}
catch (Exception e)
{
Log.e("SmsReceiver", "Exception smsReceiver" + e);
}
}
}
,并定义它们的所有IM我的清单文件:
<receiver android:name=".IncomingSmsReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<receiver android:name=".IncomingCallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<receiver android:name=".OutgoingCallReceiver" >
<intent-filter>
<action android:name="android.intent.action.ACTION_NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
这一切伟大的工作,但现在我有一些问题,我需要一些指针:
1。如果我在清单文件中以这种方式定义BroadcastReceivers
,那么纠正我,如果我错了,但如果我的应用程序已关闭/杀死,那么我将不会继续监视这些操作,对?
2.什么利兹我认为我需要创建一个Service
将运行/注册这些BroadcastReceivers
,所以我创建了以下Service
:
CallAndSMSDetectService
public class CallAndSMSDetectService extends Service {
IncomingCallReceiver incomingCallReceiver;
OutgoingCallReceiver outgoingCallReceiver;
IncomingSmsReceiver incomingSmsReceiver;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int res = super.onStartCommand(intent, flags, startId);
outgoingCallReceiver = new OutgoingCallReceiver();
incomingCallReceiver = new IncomingCallReceiver();
incomingSmsReceiver = new IncomingSmsReceiver();
IntentFilter outgoingCallIntentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(outgoingCallReceiver, outgoingCallIntentFilter);
return res;
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(outgoingCallReceiver);
}
@Override
public IBinder onBind(Intent intent) {
// not supporting binding
return null;
}
}
我这里的问题是,我找不到合适的IntentFilters SMS_RECEIVED
和PHONE_STATE
,所以我不知道如何注册他们progra像我对Intent.ACTION_NEW_OUTGOING_CALL
一样。
我会很高兴,如果有人可以告诉我在这一个正确的方向?以及它应该如何正确完成。
谢谢。
你不需要服务注销接收者我认为问题可以在清单文件中的权限你有没有添加这个 –
DjHacktorReborn
我没有创建服务为了注销接收者,我已经创建了它,以便即使我的应用程序被系统杀死(当它不在前台时),显示器也将继续运行。因为据我所知如果我使用清单文件注册接收者,他们将在我的应用程序被杀后立即停止接收广播。 –