我开始开发一个必须与MMS附件交互的Android应用程序,特别是获取文本,位图,音频,视频等附件,并将它们存储在特定文件夹中的手机上。
所以我开始在网上阅读一些书籍和一些帖子,但这不是一个非常普遍的论点,我没有找到正式的方式去做我想做的事情。
我在这里找到了一篇关于堆栈溢出的相当不错的文章:How to Read MMS Data in Android? ...它对我很有用,但有2个问题:
由于短信和彩信管理是移动开发中非常普遍的需求,我对这个论点缺乏官方教程或“操作方法”感到非常失望。 我希望有人可以帮助我......
提前致谢!!
答案 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中提取“原始”数据,如音频/视频/图像获得byte []后,可以创建一个空文件,然后使用FileOutputStream将byte []写入其中。如果文件路径\扩展名是正确的,并且您的应用程序具有所有权限 权限,您将能够存储您的数据。
PS。此过程已经过几次测试并且有效,但我不排除可能是一些可能产生错误状态的非托管异常情况。恕我直言,它也可以改进......