2012-06-15 1 views
1

J'essaie d'envoyer un sms binaire dans Android. Mais quand la taille du message dépasse un sms, j'obtiens des erreurs différentes selon l'appareil.Comment envoyer des sms binaires multipart dans Android?

J'ai vu qu'il existe une méthode pour envoyer des SMS en plusieurs parties, mais pas pour envoyer des sms binaires en plusieurs parties. Alors, qu'est-ce que je dois faire?

+0

Avez-vous été en mesure d'envoyer un message binaire dont la longueur est inférieure à un message. Aussi, si vous avez une réponse à cette question, il serait utile de la poster. ou dites un autre moyen alternatif. –

Répondre

1

Il semble qu'il n'y ait vraiment aucun moyen de le faire.

J'ai trouvé quelqu'un qui a demandé la même chose sur la liste des développeurs Android il y a deux ans et n'a reçu aucune réponse jusqu'à maintenant. Malheureusement, je ne suis pas trouver le poste en ce moment, mais il y a beaucoup d'autres questions à ce sujet:

Android Developers › Sending big binary sms

Android Developers › Missing API functionallity sending binary data sms with more that 1

Android Developers › more SMS questions

La meilleure solution que je pouvais suis tombé sur était de coder le message en tant que BASE64 et envoyer en tant que SMS TEXTE en plusieurs parties.

J'espère que cette réponse aidera quelqu'un à chercher la même chose à l'avenir.

1

vous pouvez le faire par SMS de données, je l'ai fait et fonctionne! vous devez diviser vos données à la limite de paquets et en utilisant:

smsManager.sendDataMessage(_phoneNumber, null, SMS_PORT, 
s.getBytes(), sent, deliveredPI); 

pour chaque partie. il envoie des données séparément et vous pouvez recevoir normalement :)

0

@ amin10043 vous avez raison mais pour gérer le message de données divisé vous devez faire quelque chose de plus parce que le récepteur ne sait pas combien de parties du message sera. J'ai préparé une fonction qui envoie un message de données et sur multipart premier octet du message qu'il placé un certain nombre de pièces:

private void sendEncryptedMessage(String plainMessage) throws IOException { 

    Integer PDU_SIZE = 130; 

    EncryptedMessage encryptedMessage = new EncryptedMessage(plainMessage, recipientEncryptionKey); 
    byte[] messageSerialized = EncryptedMessage.serialize(encryptedMessage); 

    PendingIntent sent = this.createPendingResult(MainConfig.SMS_SENT, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT); 
    SmsManager smsManager = SmsManager.getDefault(); 

    byte[] preparedMessage = new byte[messageSerialized.length + 1]; 
    preparedMessage[0] = 1; 
    System.arraycopy(messageSerialized, 0, preparedMessage, 1, messageSerialized.length); 


    if (preparedMessage.length > PDU_SIZE) { 

     Boolean equalChunks; 
     Integer mLength = preparedMessage.length; 
     Integer numOfChunks = mLength/PDU_SIZE; 

     if (mLength % PDU_SIZE == 0) { 
      preparedMessage[0] = numOfChunks.byteValue(); 
      equalChunks = true; 
     } else { 
      Integer tmpChunks = numOfChunks + 1; 
      preparedMessage[0] = tmpChunks.byteValue(); 
      equalChunks = false; 
     } 


     for (int i = 0; i < numOfChunks; i++) { 
      byte[] chunkArray = Arrays.copyOfRange(messageSerialized, i * PDU_SIZE, (i + 1) * PDU_SIZE); 
      smsManager.sendDataMessage(phoneNo, null, MainConfig.SMS_PORT, chunkArray, sent, null); //todo: dodać jeszcze PendingDeliveryIntent 
     } 

     if (!equalChunks) { 
      byte[] chunkArray = Arrays.copyOfRange(messageSerialized, numOfChunks * PDU_SIZE, mLength); 
      smsManager.sendDataMessage(phoneNo, null, MainConfig.SMS_PORT, chunkArray, sent, null); //todo: dodać jeszcze PendingDeliveryIntent 
     } 


    } else { 
     smsManager.sendDataMessage(phoneNo, null, MainConfig.SMS_PORT, preparedMessage, sent, null); //todo: dodać jeszcze PendingDeliveryIntent 
    } 

} 

Ce travaille copie de ma méthode, mais cela fonctionne. Dans le récepteur, vous devez lire le premier octet du message pour obtenir des informations sur le nombre de parties du message auquel il doit s'attendre.