Android ALBUM_ART column不推荐使用API 29等,如何获取路径?
我们目前正在使用:Android ALBUM_ART column不推荐使用API 29等,如何获取路径?,android,deprecated,android-10.0,albumart,Android,Deprecated,Android 10.0,Albumart,我们目前正在使用:MediaStore.Audio.AlbumColumns.album\u art获取相册艺术的路径,并且正在成功获取路径,pixel 3a(Android 10)上的路径除外。经过一些研究,专辑《艺术》在API 29及以上被弃用,如图所示: 在这个链接中,它说:“应用程序可能没有直接访问此路径的文件系统权限。应用程序应该使用ContentResolver#loadThumbnail来获得访问权限,而不是试图直接打开此路径。” 我的问题是: 1) 我已经在应用程序清单上声明了外
MediaStore.Audio.AlbumColumns.album\u art
获取相册艺术的路径,并且正在成功获取路径,pixel 3a(Android 10)上的路径除外。经过一些研究,专辑《艺术》在API 29及以上被弃用,如图所示:
在这个链接中,它说:“应用程序可能没有直接访问此路径的文件系统权限。应用程序应该使用ContentResolver#loadThumbnail来获得访问权限,而不是试图直接打开此路径。”
我的问题是:1) 我已经在应用程序清单上声明了外部存储访问(读取外部存储)的权限,并在应用程序中导航时请求权限。我必须提供哪些权限才能访问相册艺术才能获得路径 2) 我似乎在loadThumbnail在线上找不到任何内容(甚至在我使用target和compile SDK 29时,通过代码在ContentResolver类上也找不到),如果1)无法完成,那么我如何使用loadThumbnail以及为什么它没有显示在代码上
提前感谢。要使用ContentResolver方法,请确保已安装最新的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_innose_Coder不介意我在这里包括他的评论:
作为安卓Q上范围存储功能的一部分,谷歌宣布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)
}
}
尝试此操作,它将使用glide imageView工作并加载
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和targetSdkVersion更新至30作为Android Q上范围存储功能的一部分,谷歌宣布SAF(存储访问框架)将取代正常的存储权限。这意味着,即使您尝试使用存储权限,它也只会授予您访问特定类型文件的权限,以便使用文件和文件路径。我不认为有必要在ContentResolver类中重载loadThumbnail方法。此外,值得注意的是,传递给loadThumbnail方法的Size对象应该是相册艺术位图的所需输出大小(与加载到的任何视图相匹配)。此外,对于使用MediaStore的