ユーザーの通話 (発信/着信) と SMS (着信) を監視するアプリケーションを作成したいと考えています。
したがって、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();
}
}
着信SMS受信者
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);
}
}
}
それらすべてを私のマニフェストファイルで定義しました:
<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;
}
}
SMS_RECEIVED
ここでの私の問題は、との適切な IntentFilters が見つからないことPHONE_STATE
ですIntent.ACTION_NEW_OUTGOING_CALL
。
誰かがこれについて正しい方向に私を導くことができればうれしいですか? そして、それがどのように正しく行われるべきか。
ありがとう。