2012-04-03 43 views
1

我开始开发一个android应用程序,它必须与MMS附件进行交互,特别是获取诸如文本,位图,音频,视频等附件并将它们存储在手机中的特定文件夹中。如何访问android彩信资源,如视频/音频等?

所以我开始在网上看一些书和一些文章,但这不是一个非常普遍的论点,而且我也没有找到正式的方式去做我想做的事。

我发现了一个相当不错的文章在这里堆栈溢出这里:How to Read MMS Data in Android? ...它的作品对我非常好,但也有2个问题:

  1. 该文介绍了如何获得通过彩信数据查询“隐藏”的SMS-MMS内容提供商,据我所知,Google并不保证他们将保持当前每个Android未来发展的结构。
  2. 该文章仅解释如何从MMS获取文本数据和位图数据......视频/音频怎么样?我试图从InputStream中获得视频/音频流,比如Bitmap的例子,遗憾的是没有运气......

对于没有官方教程或“如何做”因为SMS和MMS管理是移动开发中非常普遍的需求。 我希望有人能帮助我....

在此先感谢!

回答

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. 的URI上下文包含要提取的数据的MMS部分(例如“content:// mms/part/2”)
  3. byref参数返回过程抛出的最终错误代码。

一旦你有了你的byte [],你可以创建一个空文件,然后使用FileOutputStream将byte []写入它。如果文件路径\扩展名正确,并且您的应用具有所有权限 权限,则可以存储您的数据。

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

+1

感谢此代码段!它真的帮了我很多。访问MMS附件的代码示例很难找到! – jenzz 2012-09-08 22:25:13

+0

感谢它为我工作。 :) – 2015-05-13 11:44:35