我开始开发一个必须与 MMS 附件交互的 Android 应用程序,特别是获取文本、位图、音频、视频等附件,并将它们存储在手机上的特定文件夹中。
所以我开始阅读一些书籍和网络上的一些帖子,但这不是一个很常见的论点,而且我没有找到一个正式的方法来做我想做的事情。
我在这里找到了一篇关于堆栈溢出的相当不错的文章:How to Read MMS Data in Android? ...它对我来说效果很好,但有两个问题:
- 这篇文章向您展示了如何通过查询“隐藏的”SMS-MMS 内容提供程序来获取 MMS 数据,据我所知,Google 不保证他们会在每个 android 的 future 版本中保持当前结构.
- 这篇文章只解释了如何从彩信中获取文本数据和位图数据……视频/音频呢?我试图从 InputStream 获取视频/音频流,例如使用位图所做的示例,不幸的是没有运气......
我对官方教程或“操作方法”的缺席感到非常失望,因为短信和彩信管理是移动开发中非常普遍的需求。 我希望有人能帮助我....
提前致谢!
最佳答案
我找到了一种从 MMS 读取视频/音频数据的相当简单的方法,因此我决定发布我的类(class)的这一部分,为所有需要它的用户提供 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 中提取“原始”数据,例如音频/视频/图像:
- 您需要使用此功能的上下文
- 包含您要提取的数据的 MMS 部分的 URI(例如“content://mms/part/2”)
- 返回过程抛出的最终错误代码的 byref 参数。
一旦有了 byte[],就可以创建一个空文件,然后使用 FileOutputStream 将 byte[] 写入其中。如果文件路径\扩展名正确并且您的应用程序具有所有正确的 权限,您将能够存储您的数据。
附言。这个过程已经过几次测试并且有效,但我不排除一些可能产生错误状态的非托管异常情况。恕我直言,它也可以改进......
关于android - 如何访问 android 彩信资源,如视频/音频等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999866/