2016-09-27 20 views
1

私はポートからSMSを受け取ることができるアプリを作成したい!しかしそれを実行すると、私のmsg.getMessageBody()はnullを返します。どうすれば修正できますか?ポートからSMSを受信

manifext.xml

<receiver android:name="data.SMSReceiver" android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.provider.telephony.SMS_RECEIVED" /> 
      <data android:scheme="sms" 
       android:host="*" 
       android:port="4030"/> 
     </intent-filter> 

放送受信コード

public class SMSReceiver extends BroadcastReceiver { 

private static final String SHORTCODE = "+9810004473"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 

    Object[] messages = (Object[])bundle.get("pdus"); 
    SmsMessage[] sms = new SmsMessage[messages.length]; 
    for(int n=0; n < messages.length; n++) { 
     sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
    } 
    for(SmsMessage msg : sms) { 
     if(TextUtils.equals(msg.getOriginatingAddress(), SHORTCODE)) { 
      Toast.makeText(context, "SMS: " + msg.getMessageBody(), Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

}

マイToastショー:SMS: null

+1

データSMSメッセージにメッセージ本文はありません。 'SmsMessage#getUserData()'メソッドを使用してデータを取得します。データは、上記のリンクされたポストで受け入れられた答えに示されているように、 'byte'配列の形になります。 –

+0

tnx!そのとおり! –

答えて

0

あなたはonReceiveにあなたのコードでこのコードを置き換えることができます。

// Get the object of SmsManager 
final SmsManager sms = SmsManager.getDefault(); 

public void onReceive(Context context, Intent intent) { 

    // Retrieves a map of extended data from the intent. 
    final Bundle bundle = intent.getExtras(); 

    try { 

     Bundle bundle = intent.getExtras(); 

     String recMsgString = "";    
     String fromAddress = ""; 
     SmsMessage recMsg = null; 
     byte[] data = null; 
     if (bundle != null) 
     { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      for (int i=0; i<pdus.length; i++){ 
       recMsg = SmsMessage.createFromPdu((byte[])pdus[i]); 

       try { 
        data = recMsg.getUserData(); 
       } catch (Exception e){ 

       } 
       if (data!=null){ 
        for(int index=0; index<data.length; ++index) 
        { 
          recMsgString += Character.toString((char)data[index]); 
        } 
       } 

       fromAddress = recMsg.getOriginatingAddress(); 
      } 

    } catch (Exception e) { 
     Log.e("SmsReceiver", "Exception smsReceiver" +e); 

    } 
}  

[OK]を、あなたが前にあなたのメッセージをエンコードしているし、あなたが今、あなただけの手順を吹いた、しかし、そうでない場合は従わなければならない、それをデコードする場合onReceive全体を削除し、私のコードを置き換えてください。 あなたが間違った場所であなたのメッセージを解読しているのですが、あなたが書いた正確な手順に従わなければなりません。あなたはここに(dataを取得した後)メッセージを取得する必要があります。

if (data!=null){ 
        for(int index=0; index<data.length; ++index) 
        { 
          recMsgString += Character.toString((char)data[index]); 
        } 
       } 
String decryptedData = Base64.decode(recMsgString ,...)//add this line 

をそしてrecMsgStringにメッセージ文字列を取得した後、あなたはBase64クラスを使用して、それを復号化することができます。

+1

いいえ!あなたのコードでは、メッセージはnullです! : –

+0

TNX Milad!data = recMsg.getUserData()からバイト配列を取得できますが、recMsgStringにはByte Formatがあり、新しいString(データ、 "UTF-8")は機能しません:| –

+0

recMsgStringは次のように定義されています。この行はメッセージを文字列 'for(int index = 0; index

関連する問題