Android Q 上的 AMediaExtractor setDataSource AMEDIA_ERROR_UNSUPPORTED 错误

Ale*_*nko 3 media android mediaextractor android-mediacodec android-10.0

我正在使用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;
    }

    .....
}
Run Code Online (Sandbox Code Playgroud)

也许这与 Android Q 中引入的隐私有关,但我没有找到任何有关它的信息......

如何检查这个问题呢?

And*_*oom 5

对我来说,这似乎是 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 根据 google 答案,似乎所有使用需要通过路径访问文件的本机库的应用程序都会受到影响,并且他们知道这个问题https://www.youtube.com/watch?v=UnJ3amzJM94

在我的例子中,一个解决方法是使用通过及其方法AMediaExtractor_setDataSourceFd获取 Java 级别的文件描述符。contentResolveropenFileDescriptor