Android-Analyse von bMessage für MIME-NachrichtAndroid

Forum für diejenigen, die für Android programmieren
Guest
 Android-Analyse von bMessage für MIME-Nachricht

Post by Guest »

Wir versuchen herauszufinden, wie ein eingegebenes BMSG beim Senden an ein Android-Gerät richtig formatiert wird, damit es an die Empfänger weitergeleitet wird.
Der BMSG-Typ, den wir versuchen, ist TYPE=MMS und wann Wir debuggen es auf der Android-Plattform, um zu sehen, wie es formatiert werden sollte. Unsere Testzeichenfolge sieht so aus:

Code: Select all

String testMsgStr ="BEGIN:BMSG\r\nVERSION:1.0\r\nSTATUS:UNREAD\r\nTYPE:MMS\r\nFOLDER:\r\nBEGIN:BENV\r\nBEGIN:VCARD\r\nVERSION:2.1\r\nN:0706500000\r\nTEL:0706500000\r\nEND:VCARD\r\nBEGIN:BBODY\r\nENCODING:8BIT\r\nCHARSET:UTF-8\r\nLANGUAGE:UNKNOWN\r\nLENGTH:1050\r\nBEGIN:MSG\r\nDate: Fri, 17 Jan 2025 12:12:57 +0100\r\nFrom: ;\r\nTo: Test Test ;\r\nContent-Type: application/vnd.wap.multipart.related; boundary=--=_cd6e9876-cee0-4260-b62a-84793cc623d4\r\n\r\n----=_cd6e9876-cee0-4260-b62a-84793cc623d4\r\nContent-Type: application/smil; charset=\"utf-8\"\r\nContent-Location: smil.xml\r\nContent-ID: \r\nContent-Transfer-Encoding: 8BIT\r\n\r\n

[img]\[/img]
\r\n----=_cd6e9876-cee0-4260-b62a-84793cc623d4\r\nContent-Type: image/gif\r\nContent-Location: image000000.gif\r\nContent-ID: \r\nContent-Transfer-Encoding: Base64\r\n\r\nR0lGODlhMgAyAIAAAAAAAP///yH5BAAAAAAALAAAAAAyADIAAAJ5jI+py+0Po5y02ouz3rz7D27A\nCI7AZJpdSj5q0Ipn6rzwyan2Yscai6vpgrIdA0gMQVjKpvMJjUqnF1ySikX4stot9+ZFXatjSdhi\nFHvSyzO53HC/4Qr2z57A3+VgKK2ut8YERqeEVPj097XI2Oj4CBkpOUlZaelYAAA7\n\r\n----=_cd6e9876-cee0-4260-b62a-84793cc623d4--\r\nEND:MSG\r\nEND:BBODY\r\nEND:BENV\r\nEND:BMSG\r\n";
Das Problem, mit dem wir konfrontiert sind, besteht darin, dass die Android-Bibliothek, die diese Daten verarbeitet, jede Zeile liest. Das spezifische Problem betrifft das Parsen der tatsächlichen MSG. Wenn BEGIN:MSG\r\n gefunden wird, liest es jede Zeile mit dieser Funktion:

Code: Select all

        private byte[] getLineAsBytes() {
int readByte;
/* TODO: Actually the vCard spec. allows to break lines by using a newLine
* followed by a white space character(space or tab). Not sure this is a good idea to
* implement as the Bluetooth MAP spec. illustrates vCards using tab alignment,
* hence actually showing an invalid vCard format...
* If we read such a folded line, the folded part will be skipped in the parser
* UPDATE: Check if we actually do unfold before parsing the input stream
*/
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
while ((readByte = mInStream.read()) != -1) {
System.out.print((char) readByte);
if (readByte == '\r') {
if ((readByte = mInStream.read()) != -1 && readByte == '\n') {
if (output.size() == 0) {
continue; /* Skip empty lines */
} else {
break;
}
} else {
output.write('\r');
}
} else if (readByte == '\n' && output.size() == 0) {
/* Empty line - skip */
continue;
}
output.write(readByte);
}
} catch (IOException e) {
Log.w(TAG, e);
return null;
}
return output.toByteArray();
}
bis es END:MSG\r\n erreicht.
Für jede Zeile wird es an eine Zeichenfolge angehängt und wenn es erreicht wird END:MSG enthält den vollständigen MSG-String. Wie Sie in der Funktion getLineAsBytes() sehen können, werden dadurch alle \r\n aus den Zeilen entfernt, bevor sie zurückgegeben werden.
Wenn die gesamte Nachricht gelesen wurde, wird dies versucht Analysieren Sie es als MIME. In diesem Teil des Codes beginnt es so:

Code: Select all

   private void parseMime(String message) {
// Check for null String, otherwise NPE will cause BT to crash
if (message == null) {
Log.e(TAG, "parseMime called with a NULL message, terminating early");
return;
}
/* Overall strategy for decoding:
* 1) split on first empty line to extract the header
* 2) unfold and parse headers
* 3) split on boundary to split into parts (or use the remaining as a part,
*    if part is not found)
* 4) parse each part
* */
String[] messageParts;
String[] mimeParts;
String remaining = null;
String messageBody = null;
message = message.replaceAll("\\r\\n[ \\\t]+", ""); // Unfold
messageParts = message.split("\r\n\r\n", 2); // Split the header from the body
if (messageParts.length != 2) {
// Handle entire message as plain text
messageBody = message;
} else {
remaining = parseMimeHeaders(messageParts[0]);
// If we have some text not being a header, add it to the message body.
if (remaining != null) {
messageBody = remaining + messageParts[1];
if (D) {
Log.d(TAG, "parseMime remaining=" + remaining);
}
} else {
messageBody = messageParts[1];
}
}

Wie Sie sehen können, versucht es, \r\n\r\n im String zu finden, damit es die Header vom Text trennen kann. Aber der vorherige Code, der alle Daten Zeile für Zeile liest, hat bereits alle \r\n entfernt. Wir versuchen also herauszufinden, ob es eine Möglichkeit gibt, unsere Datenzeichenfolge anders zu formatieren, damit dieser offizielle Android-Code tatsächlich funktioniert.
Oder weiß jemand, ob das bekannt ist? Problem in Android?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post