首页 > 解决方案 > Android Q 上的 AMediaExtractor setDataSource AMEDIA_ERROR_UNSUPPORTED 错误

问题描述

我正在使用AMediaCodecand AMediaExtractor,在所有设备上都可以正常工作(我希望:),但是如果我在 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中引入的隐私有关,但我没有找到任何有关它的信息......

如何检查这个问题?

标签: androidmediaandroid-mediacodecandroid-10.0mediaextractor

解决方案


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

在我的情况下,一种解决方法是使用,通过及其方法AMediaExtractor_setDataSourceFd获取 Java 级别的文件描述符。contentResolveropenFileDescriptor


推荐阅读