android - Android Q 上的 AMediaExtractor setDataSource AMEDIA_ERROR_UNSUPPORTED 错误

标签 android media android-mediacodec android-10.0 mediaextractor

我正在使用 AMediaCodecAMediaExtractor,在所有设备上都能正常工作(我希望:),但是如果我在 Android Q 上检查相同的代码(在我的案例 Pixel 2XL)我收到这样的错误 AMEDIA_ERROR_UNSUPPORTED

我在做什么

bool NativeCodec::createStreamingMediaPlayer(const std::string &filename)
{
    AMediaExtractor *ex = AMediaExtractor_new();
    media_status_t err = 
      AMediaExtractor_setDataSource(ex, filename.c_str());;  <-- Here media status I got AMEDIA_ERROR_UNSUPPORTED 

    if (err != AMEDIA_OK)
    {
        __android_log_print(ANDROID_LOG_ERROR, "ERROR", "ERROR ::: %s", std::to_string(err).c_str());
        return false;
    }

    .....
}

也许这与 Android Q 中引入的隐私有(private)某种联系,但我没有找到任何关于它的信息...

如何检查这个问题?

最佳答案

这对我来说似乎是 Android 10 上的一个错误。似乎 android:requestLegacyExternalStorage="true"不会改变这种情况。您可能需要请求 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE/>在 list 上并在运行时请求相同的权限。 AMediaExtractor_setDataSource函数必须在附加到 Java 的线程上调用。正确地完成所有这些将使您可以使其在其他版本的 Android 上运行,但不能在 Android 10 上运行。我已经在 Android Bug Tracker 上报告了这个问题:https://issuetracker.google.com/144837266 根据谷歌的回答,似乎所有使用需要通过路径访问文件的 native 库的应用程序都会受到影响,他们知道这个问题 https://www.youtube.com/watch?v=UnJ3amzJM94 .

我的解决方法是使用 AMediaExtractor_setDataSourceFd ,通过contentResolver获取Java级别的文件描述符及其方法openFileDescriptor .

关于android - Android Q 上的 AMediaExtractor setDataSource AMEDIA_ERROR_UNSUPPORTED 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57653901/

相关文章:

android - 如何在不使用 DatePickerDialog 的情况下使用 OnDateChangedListener、OnDateSetListener?

android - 用于视频输出(HDMI 等)的标准 Android API

iphone - CSS 媒体查询不适用于 iPhone

android - 使用 MediaCodec 录制 Surface

java - Android Webview,仅在链接上启用设置长按?

Android Handlers - 线程间通信

android - Android 上的 Jets3t

c# - 文件夹中所有媒体文件的运行时间/长度信息

java - Android MediaCodec 在异步模式下比在同步模式下慢?

java - 在android中创建一个webm文件