我正在使用 AMediaCodec
和 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 中引入的隐私有(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/