android - 如何访问 android 彩信资源,如视频/音频等?

标签 android audio video get mms

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

所以我开始阅读一些书籍和网络上的一些帖子,但这不是一个很常见的论点,而且我没有找到一个正式的方法来做我想做的事情。

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

  1. 这篇文章向您展示了如何通过查询“隐藏的”SMS-MMS 内容提供程序来获取 MMS 数据,据我所知,Google 不保证他们会在每个 android 的 future 版本中保持当前结构.
  2. 这篇文章只解释了如何从彩信中获取文本数据和位图数据……视频/音频呢?我试图从 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 中提取“原始”数据,例如音频/视频/图像:

  1. 您需要使用此功能的上下文
  2. 包含您要提取的数据的 MMS 部分的 URI(例如“content://mms/part/2”)
  3. 返回过程抛出的最终错误代码的 byref 参数。

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

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

关于android - 如何访问 android 彩信资源,如视频/音频等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999866/

相关文章:

Android Gradle Sync 同步项目失败

ios - iOS-系统声音未播放

audio - 计算 WAV 文件中的样本数

html - 来自与 youtube 不同的来源的视频进入花式盒

android - Android 可以在没有 SD 卡的情况下将照片保存到 RAM 中吗

android - 是否可以通过导航组件深层链接传递 Parcelable 对象?

android - 用户界面问题android

python - 将stft转换为色度并绘制结果

video - 如何提高来自 IPFS 的文件的下载速度?

linux - 一堆图片转视频