gpt4 book ai didi

android - MediaProvider/铃声的外部存储权限问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:54 26 4
gpt4 key购买 nike

我的一些用户在尝试在我的应用中选择铃声时向 Google Play 报告了以下错误。 (还有更多内容,但不相关)

java.lang.SecurityException: Permission Denial: 
reading com.android.providers.media.MediaProvider
uri content://media/external/audio/media
from pid=5738, uid=10122 requires android.permission.READ_EXTERNAL_STORAGE

我认为这个问题是由于外部存储上的某些音调而发生的。除非绝对必要,否则我不想在我的应用中包含 READ_EXTERNAL_STORAGE 权限。

有没有办法规避这个问题,只排除外部存储中可能存在的任何音调?

注意:我正在使用 RingtoneManager 获取铃声并将它们在 StringUri 之间转换。没有其他代码接触用户的媒体。

此外,我没有行号,因为堆栈跟踪来自混淆代码并且重新映射堆栈跟踪没有提供行号。

最佳答案

刚刚遇到同样的问题,想出了以下解决方案:

private Cursor createCursor()
{
Uri uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;

String[] columns = new String[]
{
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.TITLE_KEY
};

String filter = createBooleanFilter(MediaStore.Audio.AudioColumns.IS_ALARM);
String order = MediaStore.Audio.Media.DEFAULT_SORT_ORDER;

return getContext().getContentResolver().query(uri, columns, filter, null, order);
}

private String createBooleanFilter(String... columns)
{
if(columns.length > 0)
{
StringBuilder sb = new StringBuilder();
sb.append("(");
for(int i = columns.length - 1; i > 0; i--)
{
sb.append(columns[i]).append("=1 or ");
}
sb.append(columns[0]);
sb.append(")");
return sb.toString();
}
return null;
}

要获取铃声的 Uri,您需要将 INTERNAL_CONTENT_URI_ID 列值结合起来,您可以使用 ContentUris 来完成此操作类:

Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, cursor.getLong(0));

关于android - MediaProvider/铃声的外部存储权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21196453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com