android - Android Q 上的 AMediaExtractor setDataSource AMEDIA_ERROR_UNSUPPORTED 错误
问题描述
我正在使用AMediaCodec
and 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中引入的隐私有关,但我没有找到任何有关它的信息......
如何检查这个问题?
解决方案
在我看来,这似乎是 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 级别的文件描述符。contentResolver
openFileDescriptor
推荐阅读
- python-3.x - 为什么内置函数 id(constant) 在 Python 中获取值?
- regex - 如何使用 awk 找到一个模式,然后向下移动一定数量的行,然后打印?
- python - 在 spacy 标记器评估中获取 pos 标记器的特定于标记的准确性
- python - 如何在 aws 中使用 boto3 创建不可公开访问的存储桶和对象?
- c# - 如何在使用 C# 将文档作为项目上传到 SharePoint 文档库时为自定义列添加值?
- kubernetes - 如何检测 Kubernetes liveness/readiness 探针何时失败并调用端点传递有关 pod 的一些信息
- c# - Microsoft 的 Service Broker 可以用于生产者-消费者场景吗?
- hive - 通过 databricks 笔记本插入覆盖 Hive 表抛出错误
- javascript - 如何使用 Storybook 的旋钮将组件动态插入到模板中
- excel - Excel - 如何添加在同一列但不同行具有值的单元格?