如何访问Android MMS资源,如视频/音频等?

时间:2012-04-03 19:16:03

标签: android audio video get mms

我开始开发一个必须与MMS附件交互的Android应用程序,特别是获取文本,位图,音频,视频等附件,并将它们存储在特定文件夹中的手机上。

所以我开始在网上阅读一些书籍和一些帖子,但这不是一个非常普遍的论点,我没有找到正式的方式去做我想做的事情。

我在这里找到了一篇关于堆栈溢出的相当不错的文章:How to Read MMS Data in Android? ...它对我很有用,但有2个问题:

  1. 本文向您展示了如何通过查询“隐藏的”SMS-MMS内容提供商来获取MMS数据,据我所知,Google并不保证他们会保留当前每个机器人未来的结构
  2. 本文仅介绍如何从MMS获取文本数据和位图数据......视频/音频怎么样?我试图从InputStream获取视频/音频流,例如Bitmaps的例子,遗憾的是没有运气......
  3. 由于短信和彩信管理是移动开发中非常普遍的需求,我对这个论点缺乏官方教程或“操作方法”感到非常失望。 我希望有人可以帮助我......

    提前致谢!!

1 个答案:

答案 0 :(得分:4)

我找到了一种从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. 包含您要提取的数据的MMS部分的URI(例如“content:// mms / part / 2”)
  3. 返回由过程抛出的最终错误代码的byref参数。
  4. 获得byte []后,可以创建一个空文件,然后使用FileOutputStream将byte []写入其中。如果文件路径\扩展名是正确的,并且您的应用程序具有所有权限 权限,您将能够存储您的数据。

    PS。此过程已经过几次测试并且有效,但我不排除可能是一些可能产生错误状态的非托管异常情况。恕我直言,它也可以改进......