Android: что делать с типом MIME приложения/smil

Я использую код, похожий на другой SO post. Но мой тип MIME для каждого MMS - это "приложение/smil". Как определить, содержит ли MMS изображение, аудио, текст и т.д.?

Вот код, который я использую в данный момент:

        String selectionPart = "mid =" + id;
        Uri ur = Uri.parse("content://mms/part");
        Cursor cur = getContentResolver().query(ur, null, selectionPart, null, null);
        if (cur.moveToFirst()) {
            do {
                String[] values = new String[cur.getColumnCount()];

                for (int i = 0; i < cur.getColumnCount(); i++) {
                    values[i] = cur.getString(i);
                }

                String partId = cur.getString(cur.getColumnIndex("_id"));
                String type = cur.getString(cur.getColumnIndex("ct"));

Это то, что содержится в значениях String [] для аудио MMS:

[56, 98, -1, application/smil, smil.xml, null, null, null, <0000>, smil.xml, null, null, null, <smil>
<smil>
  <head>
    <layout>
      <root-layout height="480px" width="320px"/>
      <region fit="meet" height="160px" id="Text" left="0" top="320" width="320px"/>
    </layout>
  </head>
  <body>
    <par dur="11000ms">
      <audio dur="11000ms" src="cid:171"/>
      <text region="Text" src="cid:172"/>
    </par>
  </body>
</smil>
]

Ответ 1

Проблема в том, что вы предполагаете, что ваш курсор имеет только 1 запись. На самом деле это не так.

Для MMS-сообщений вы обнаружите, что есть 3 (или более) записи, соответствующие одному и тому же mid. Они описаны ниже:

  • Одна запись будет соответствовать файлу SMIL. SMIL - это формат файла, содержащий xml, который помогает наблюдателю MMS знать, как отображать MMS (это то, что вы напечатали выше). Тип MIME для этой записи application/smil, если вы посмотрите на столбец с именем ct (сокращение для типа содержимого)

  • Другая запись будет соответствовать текстовому файлу, содержащему любой текст в этом MMS, помимо приложения. Тип MIME будет text/plain

  • Наконец, вы найдете еще одну запись, на самом деле имеющую вложение. Это вложение может иметь различные типы MIME в зависимости от того, какой файл. Если это будет jpeg, это будет image/jpeg, если png будет image/png и т.д. (Вы получите точку)

Итак, проблема заключалась в том, что вы предполагали, что курсор имеет 1 строку. Если вы перебираете три строки, вы найдете то, что ищете.

Как правило, я бы отфильтровывал столбец _data для непустого значения, чтобы сразу перейти к строке вложения. (Столбец _data будет содержать путь uri для того, где вложение сохраняется на телефоне. Эта строка будет null для всех других строк, которые не соответствуют вложению MMS. Поэтому вы должны искать строку, которая соответствует ваш mid и где _data column value is not null). Когда вы найдете эту строку, вы можете просто прочитать столбец ct этой строки, чтобы найти тип MIME строки. Это скажет вам, какой тип файла передается в MMS-сообщении, будь то image/xyz или audio/abc или video/qwe и т.д.