Как получить доступ к Android-ресурсам MMS, таким как видео / аудио и т. Д.? - PullRequest
2 голосов
/ 03 апреля 2012

Я начал разрабатывать приложение для Android, которое должно взаимодействовать с вложениями MMS, в частности получать вложения, такие как текст, растровые изображения, аудио, видео и т. Д., И сохранять их на телефоне в определенной папке.

Итак, я начал читать в Интернете некоторые книги и посты, но это не очень распространенный аргумент, и я не нашел официального способа сделать то, что хочу.

Здесь я нашел довольно хорошую статью о переполнении стека: Как читать данные MMS в Android? ... у меня это очень хорошо работает, но есть 2 проблемы:

  1. В статье показано, как получить MMS-данные, выполняя запросы к «скрытому» поставщику контента SMS-MMS, и, насколько я знаю, Google не гарантирует, что они сохранят текущую структуру.в будущем каждого андроида.
  2. В статье только объясняется, как получить текстовые данные и растровые данные из MMS ... как насчет видео / аудио?Я пытался получить видео / аудио поток из InputStream, как, например, в примере с растровыми изображениями, к сожалению, безуспешно ...

Я очень разочарован отсутствием официального учебника или "Как-Для этого аргумента, потому что управление SMS и MMS является очень распространенной потребностью в разработке мобильных приложений.Я надеюсь, что кто-то может помочь мне ....

Заранее спасибо !!

1 Ответ

5 голосов
/ 06 апреля 2012

Я нашел довольно простой способ чтения видео / аудио данных из MMS, поэтому я решил опубликовать эту часть своего класса, которая содержит вложения MMS, для всех пользователей, которым это необходимо.

private static final int RAW_DATA_BLOCK_SIZE = 16384; //Set the block size used to write a ByteArrayOutputStream to byte[]
public static final int ERROR_IO_EXCEPTION = 1;
public static final int ERROR_FILE_NOT_FOUND = 2;



public static byte[] LoadRaw(Context context, Uri uri, int Error){
    InputStream inputStream = null;
    byte[] ret = new byte[0];

    //Open inputStream from the specified URI
    try {
        inputStream = context.getContentResolver().openInputStream(uri);

        //Try read from the InputStream
        if(inputStream!=null)
            ret = InputStreamToByteArray(inputStream);

    } 
    catch (FileNotFoundException e1) {
        Error = ERROR_FILE_NOT_FOUND;
    } 
    catch (IOException e) {
        Error = ERROR_IO_EXCEPTION;
    }
    finally{
        if (inputStream != null) {
            try {
                inputStream.close();
            } 
            catch (IOException e) {
                //Problem on closing stream. 
                //The return state does not change. 
                Error = ERROR_IO_EXCEPTION;
            }
        }
    }


    //Return
    return ret;
}


//Create a byte array from an open inputStream. Read blocks of RAW_DATA_BLOCK_SIZE byte
private static byte[] InputStreamToByteArray(InputStream inputStream) throws IOException{
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    int nRead;
    byte[] data = new byte[RAW_DATA_BLOCK_SIZE];

    while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
      buffer.write(data, 0, nRead);
    }
    buffer.flush();
    return buffer.toByteArray();
}

Таким образом, вы можете извлечь «сырые» данные, такие как аудио / видео / изображения из MMS, передав:

  1. контекст, в котором вам нужно использовать эту функцию
  2. URI части MMS, которая содержит данные, которые вы хотите извлечь (например, "content: // mms / part / 2")
  3. параметр byref, который возвращает возможный код ошибки, выданный процедурой.

Получив свой байт [], вы можете создать пустой файл и затем использовать FileOutputStream, чтобы записать в него байт []. Если путь к файлу \ расширение является правильным и если ваше приложение имеет все права разрешения, вы сможете хранить свои данные.

PS. Эта процедура была протестирована несколько раз, и она работала, но я не исключаю, что могут быть некоторые неуправляемые исключения, которые могут привести к ошибочным состояниям. ИМХО это тоже можно импровизировать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...