0

SMS コマンドを使用してデバイスを管理できるアプリケーションを開発しています。アプリケーションは SMS からコマンドを実行し、この SMS を削除する必要があります。したがって、管理用のコードは動作しますが、SMS を削除できません。次の BroadcastReceiver があります。

public class SmsReceiver extends BroadcastReceiver {

    private static final Uri SMS_INBOX_URI = Uri.parse("content://sms");

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String body = "";
        String number = "";

        Bundle bundle = intent.getExtras();
        SmsMessage[] msgs = null;
        if (bundle != null) {
            // ---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];
            for (int i = 0; i < msgs.length; i++) {
                msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                body += msgs[i].getMessageBody().toString();
                number +=msgs[i].getOriginatingAddress();
            }
        }

        SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(context);
        String key=prefs.getString(context.getString(R.string.acc_key_key), "");

        if (body.trim().equals("#"+key)) {
            sendGPSCoordinates(context, number);
        } else if (body.trim().equals("?"+key)){
            sendResponces(context);
        }
        deleteSms(body, number, context);
    }

    private void deleteSms(String body, String number, Context context) {

        ContentResolver resolver=context.getContentResolver();
        int count=resolver.delete(SMS_INBOX_URI, "body = ? AND address = ?", new String[]{body, number});
        Log.e("count", String.valueOf(count));
/*      Cursor results=resolver.query(SMS_INBOX_URI, null, null, null, null);
        for (String str:results.getColumnNames()) {
            Log.e("column", str);
        }
}

必要な権限を持つ AndroidManifest.xml があります。アプリケーションは SMS を受信し、インテントから SMS データを取得し、電話を管理し、この SMS を削除しようとしますが、常に count is equals 0 を返します。sms/inbox の URI を変更しようとしましたが、機能しません. 教えてください、どうすればいいですか?ありがとうございました。

4

3 に答える 3

1

ご存じのとおり、SMS メッセージは順序付けられたブロードキャストとして送信されます。したがって、レシーバーは、ネイティブの SMS アプリが取得する前にそれらを取得することができます (マニフェスト内でネイティブのものよりも高い優先順位を設定するだけです)。したがってcancel、SMS がネイティブの sms-app に到達しないように、ブロードキャストが送信されるだけで機能するはずです。

次のように試すことができます。

public class SmsReceiver extends BroadcastReceiver {

private static final Uri SMS_INBOX_URI = Uri.parse("content://sms");

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    String body = "";
    String number = "";

    Bundle bundle = intent.getExtras();
    SmsMessage[] msgs = null;
    if (bundle != null) {
        // ---retrieve the SMS message received---
        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];
        for (int i = 0; i < msgs.length; i++) {
            msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            body += msgs[i].getMessageBody().toString();
            number +=msgs[i].getOriginatingAddress();
        }
    }

    SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(context);
    String key=prefs.getString(context.getString(R.string.acc_key_key), "");

    if (body.trim().equals("#"+key)) {
        sendGPSCoordinates(context, number);
    } else if (body.trim().equals("?"+key)){
        sendResponces(context);
    }
    abortBroadcast();
}
于 2012-05-22T11:32:06.107 に答える
0
@Override
    public final void onReceive(final Context context, final Intent intent) {
        final String action = intent.getAction();
         Bundle extras = intent.getExtras();

            String messages = "";


            if ( extras != null )
            {
                // Get received SMS array
                Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );

                // Get ContentResolver object for pushing encrypted SMS to the incoming folder
               // ContentResolver contentResolver = context.getContentResolver();

                for ( int i = 0; i < smsExtra.length; ++i )
                {
                    SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);

                    String body = sms.getMessageBody().toString();
                    String address = sms.getOriginatingAddress();
                    long date = sms.getTimestampMillis();

}

この書き込みクエリの後、最後のメッセージを取得します

次に、削除メソッドを起動します。

最後の受信メッセージを削除するのはうまくいきます。

あなたがそれを理解できることを願っています。

于 2012-05-22T11:25:07.470 に答える