ALBUM_ART列已从 API 29 中弃用,依此类推,如何获取路径?



我们目前正在使用以下方法获取专辑封面的路径:MediaStore.Audio.AlbumColumns.ALBUM_ART,并且正在成功获取路径,但 Pixel 3a (Android 10( 除外。经过一些研究,ALBUM_ART被弃用 API 29 及以上,如下所示: 这里

在此链接中,它说:"应用程序可能没有文件系统权限来直接访问此路径。应用不应尝试直接打开此路径,而应使用 ContentResolver#loadThumbnail 来获取访问权限。

我的问题是:
1(我已经在应用程序清单上声明了外部存储访问的权限(READ_EXTERNAL_STORAGE(,并且在应用程序内导航时正在请求权限。我必须提供哪些权限才能允许访问唱片集封面才能获取路径?

2(我似乎无法在线在loadThumbnail上找到任何内容(甚至在ContentResolver类上找不到代码,当我使用目标和编译SDK 29时(,如果1(无法完成,那么我如何使用loadThumbnail以及为什么它没有显示在代码上?

提前谢谢。

为了使用内容解析程序的方法,请确保已安装最新的SDK和相关工具,并在代码中首先实例化ContentResolver对象,然后相应地使用它:

public class MainActivity extends AppCompatActivity {
public ContentResolver resolver;
Bitmap albumArt;
Size size;
Uri uriOfItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resolver = new ContentResolver(this) {
@NonNull
@Override
public Bitmap loadThumbnail(@NonNull Uri uri, @NonNull Size size, @Nullable CancellationSignal signal) throws IOException {
return super.loadThumbnail(uri, size, signal);
}
};
//uriOfItem = uri of your file
size = new Size(100, 100);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
try {
albumArt = resolver.loadThumbnail(uriOfItem, size, null);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

编辑:当谈到你的第一个问题时,如果@Rj_Innocent_Coder不介意我在这里包括他的评论:

作为Android Q上作用域存储功能的一部分,Google宣布SAF(存储访问框架(将取代正常的存储权限。这意味着即使您尝试使用存储权限,它也只会授予对要使用的文件和文件路径的特定类型文件的访问权限

编辑2:在@hetoan2的评论之后,我再次检查了文档,我注意到ContentResolver是抽象的,因此无法将ContentResolver.loadThumbnail()用作方法调用。这意味着在活动中,您也可以简单地使用以下方法

Bitmap albumArt = getContentResolver().loadThumbnail(uriOfFile, sizeOfAreaThatDisplaysThumbnail, cancellationSignalOrNull);

对于在这里遇到问题的其他人,这是对我有用的解决方案:

if(android.os.Build.VERSION.SDK_INT >= 29)
{
val album = "Name Of Album"
val artist = "Name of Artist"
// Determine album ID first
val cursor = context.contentResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
MediaStore.Audio.Albums.ALBUM_ID,
"${MediaStore.Audio.Albums.ALBUM} = '$album' AND 
${MediaStore.Audio.Albums.ARTIST} = '$artist'"
,null,null)
val uri = if(cursor != null && cursor.count > 0)
{
cursor.moveToFirst()
ContentUris.withAppendedId(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, cursor.getString(0).toLong())
}
else
{
// Dummy URI that will not return an image
// If you end up here, the album is not in the DataStore
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI
}
val bm = try
{
// Set size based on size of bitmap you want returned
context.contentResolver.loadThumbnail(uri, Size(50,50), null)
}
catch(e: java.lang.Exception)
{
// Return default image indicating no image available from DataStore
BitmapFactory.decodeResource(context.resources, R.drawable.no_image)
}
}

试试这个它将工作并加载与滑动图像视图

int thumbColumn = audioCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID);
int _thumpId = audioCursor.getInt(thumbColumn);
imgFilePath = "content://media/external/audio/albumart/"+_thumpId;  
audioCursor.moveToPosition(i);
Glide.with(getContext()).load(imgFilePath).placeholder(R.drawable.missed).into(tracksAlbumArt);

将Andriod Studio最新的4.2.X和targetSdk版本更新到30

相关内容

  • 没有找到相关文章

最新更新