26

SMS が到着したときに通知を受けてその SMS を処理するアプリを作成したいのですが、createFromPdu関数のリファレンスを読むと、次のように記載されています。

このメソッドはまもなく非推奨になり、SMS_RECEIVED_ACTION ブロードキャスト インテントを処理することによって着信 SMS メッセージを処理するすべてのアプリケーションは、インテントから追加のフォーマット パラメータを受け取る新しいメソッド createFromPdu(byte[], String) に新しいフォーマット文字列エクストラを渡す必要があります。これは、デュアルモード GSM/CDMA および CDMA/LTE 電話など、3GPP と 3GPP2 の両方のフォーマットを同時にサポートする必要があるデバイスで PDU を正しくデコードするために必要です。

ただし、createFromPdu(byte[], String)ドキュメントと SDK の両方に関数がありません。

私は何をすべきか?これらのデュアル SIM デュアルモードの電話をサポートする必要があります。

4

5 に答える 5

5
    public void onReceive(Context context, Intent intent) {
        SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent);
        String format = intent.getStringExtra("format");


        SmsMessage sms = msgs[0];
        Log.v("TAG", "handleSmsReceived" + (sms.isReplace() ? "(replace)" : "") +
                " messageUri: " +
                ", address: " + sms.getOriginatingAddress() +
                ", body: " + sms.getMessageBody());

        String message = sms.getMessageBody();
}

pdu から SmsMessage オブジェクトを作成する場合は、新しい API を使用できます

http://developer.android.com/reference/android/telephony/SmsMessage.html#createFromPdu(byte[], java.lang.String)

  SmsMessage sms2 = SmsMessage.createFromPdu(msgs[0].getPdu(),format);
于 2015-12-17T08:58:12.703 に答える
2

ターゲットにしているAndroidのバージョンについては言及していませんが、質問の日付を考えると、Jelly Bean 4.x.

これを書いている時点で、私たちは Lollipop MR1 を使用しており、フォーマット パラメーターで createFromPdu を使用することに関する非推奨のメモがまだ有効です。

https://android.googlesource.com/platform/frameworks/opt/telephony/+/android-5.1.0_r3/src/java/android/telephony/SmsMessage.java

ただし、その API を直接使用する代わりに、テレフォニー プロバイダー API を使用できますgetMessagesFromIntent: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/ provider/Telephony.java/#686

このメソッドは、PDU 形式 (およびマルチ SIM デバイス用の Lollipop のサブスクリプション ID) を考慮して、SmsMessage インスタンスの配列を提供します。

それがどのように使用されるかの例は、Google の MMS アプリで見ることができます:

https://android.googlesource.com/platform/packages/apps/Mms/+/master/src/com/android/mms/transaction/SmsReceiverService.java (を参照handleSmsReceived)

于 2015-04-08T20:58:46.340 に答える
2

createFromPdu(byte[])は SDK_INT 23 から廃止されるため、使用する必要があります

createFromPdu((byte[]) , format);

ここに着信SMSを取得するための私のコードがあります

SMSReceiverクラスを an のインナークラスとして使用していActivityます。

これは私の作業コードです

public class SamplaActivity extends BaseActivity {
    SMSReceiver otp;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        otp=new SMSReceiver();


........
........
    }

  @Override
    protected void onResume() {
        super.onResume();

//        register broadcast receiver
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(otp, filter);
    }
@Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(otp);
    }

    private class SMSReceiver extends BroadcastReceiver {
        private Bundle bundle;
        private SmsMessage currentSMS;
        private String message;

        @Override
        public void onReceive(Context context, Intent intent) {

            if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
                bundle = intent.getExtras();
                if (bundle != null) {
                    Object[] pdu_Objects = (Object[]) bundle.get("pdus");
                    if (pdu_Objects != null) {

                        for (Object aObject : pdu_Objects) {

                            currentSMS = getIncomingMessage(aObject, bundle);

                            String senderNo = currentSMS.getDisplayOriginatingAddress();

                            message = currentSMS.getDisplayMessageBody();
                            Toast.makeText(OtpActivity.this, "senderNum: " + senderNo + " :\n message: " + message, Toast.LENGTH_LONG).show();
                        }
                        this.abortBroadcast();
                        // End of loop
                    }
                }
            } // bundle null
        }
    }

private SmsMessage getIncomingMessage(Object aObject, Bundle bundle) {
    SmsMessage currentSMS;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        String format = bundle.getString("format");
        currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format);
    } else {
        currentSMS = SmsMessage.createFromPdu((byte[]) aObject);
    }

    return currentSMS;
}

}
于 2016-06-27T10:28:03.313 に答える