0

ユーザーの通話 (発信/着信) と 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

誰かがこれについて正しい方向に私を導くことができればうれしいですか? そして、それがどのように正しく行われるべきか。

ありがとう。

4

2 に答える 2

0

スティッキー サービスを作成して、ブロードキャストを利用できるようにすることができます。これにより、アプリケーションを閉じたり強制終了したりしても、ブロードキャストが常に実行されていることが保証されます。

于 2013-10-01T10:55:42.190 に答える
0

実際、あなたは完全に正しいです。アプリケーションを起動したら、サービスを作成する必要があります。のインスタンスを作成する必要はありません

IncomingCallReceiver 着信CallReceiver;

OutgoingCallReceiver 発信CallReceiver;

IncomingSmsReceiver 着信SmsReceiver;

受信者のマニフェスト優先度を設定してみてください。

<receiver android:name=".OutgoingCallReceiver">
            <intent-filter android:priority="2147483647">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
</receiver>

お役に立てば幸いです。ご不明な点がございましたら、お問い合わせください。

于 2013-10-01T10:49:18.840 に答える