Android-анализ bMessage для сообщения MIMEAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android-анализ bMessage для сообщения MIME

Сообщение Anonymous »

Мы пытаемся выяснить, как правильно отформатировать put BMSG при отправке его на устройства Android, чтобы он передавал его получателям.
Тип BMSG, который мы пытаемся использовать, — TYPE=MMS, и когда мы отлаживаем его на платформе Android, чтобы посмотреть, как должна выглядеть наша тестовая строка:

Код: Выделить всё

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";
Проблема, с которой мы столкнулись, заключается в том, что библиотека Android, обрабатывающая эти данные, читает каждую строку. Конкретная проблема связана с анализом фактического сообщения MSG. Когда он найдет BEGIN:MSG\r\n, он прочитает каждую строку с помощью этой функции:

Код: Выделить всё

        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();
}
пока не достигнет END:MSG\r\n.
Для каждой строки он добавляет ее к строке, и когда она достигает END:MSG содержит полную строку MSG. Как вы можете видеть в функции getLineAsBytes(), она удалит все \r\n из строк перед их возвратом.
Когда все сообщение прочитано, оно пытается проанализировать его как MIME. В этой части кода это начинается так:

Код: Выделить всё

   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];
}
}

как вы можете видеть, он пытается найти \r\n\r\n в строке, чтобы отделить заголовки от тела. Но предыдущий код, считывающий все данные построчно, уже удалил все \r\n. Итак, мы пытаемся выяснить, есть ли способ по-другому отформатировать нашу строку данных, чтобы этот официальный код Android действительно работал.
Или кто-нибудь знает, известен ли это проблема в Android?

Подробнее здесь: https://stackoverflow.com/questions/793 ... me-message
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»