web-dev-qa-db-ja.com

Android-作成SMS PDU非推奨APIから?

SMSが到着し、そのSMSを処理するときに通知を受け取るアプリを作成したいが、 createFromPd 関数のリファレンスを読んでいると、

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

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

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

26
zacsek

要するに、これを使用してください:

SmsMessage smsMessage;

if (Build.VERSION.SDK_INT >= 19) { //KitKat         
    SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent);              
    smsMessage = msgs[0];            
} else {             
    Object pdus[] = (Object[]) bundle.get("pdus");             
    smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]);          
}
27
Eran Katsav
    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);
5
AnhSirk Dasarp

createFromPdu(byte[])はSDK_INT 23から非推奨であるため、使用する必要があります

createFromPdu((byte[]) , format);

これが着信SMSを取得するためのコードです

SMSReceiverクラスを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;
}

}
2
sivaBE35

対象としているAndroid=バージョンについては言及していませんが、質問の日付を考えると、私はJelly Bean 4.xを想定しています。

これを書いている時点では、私たちはLollipop MR1にいるので、createFromPduをformatパラメーターと共に使用することに関する非推奨のメモはまだ残っています。

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

ただし、そのAPIを直接使用する代わりに、テレフォニープロバイダーAPI getMessagesFromIntenthttp://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.JavahandleSmsReceivedを参照)

2
fejd

返信が遅れて申し訳ありませんが、とにかくそれが役立つことがあります。 Android=バージョンをチェックすることと、それがMを上回っており、歌うフォーマットを抽出していることを除いて、私は以下を使用することをお勧めします。

compile 'me.everything:providers-Android:1.0.1'

マニフェスト

<uses-permission Android:name="Android.permission.READ_SMS" />

そしてあなたのコードで

public List<Sms> mySmses(Context context)throws Exception{
    TelephonyProvider telephonyProvider = new TelephonyProvider(context);
    List<Sms> smses = telephonyProvider.getSms(TelephonyProvider.Filter.INBOX).getList();
    if(smses.isEmpty()){
        throw new Exception("No SMS found");
    }
    return smses;
}

これは長時間実行される操作であるため、AsyncTaskを使用してSMSes(上記のメソッドを使用)をフェッチすることを忘れないでください。アプリがUIスレッドで実行された場合、アプリがクラッシュする可能性があります(特定の場合)。

このライブラリーは私の時間を節約しました。それが誰かに同じことをすることを願っています。