获取音频时出现性能问题
Performance issue while fetching Audio
我正在使用以下代码在 android 中获取设备的音频数据
public void getSongList()
{
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
ContentResolver contentResolver = getActivity().getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = contentResolver.query(uri,null,null,null,null);
if(cursor!=null && cursor.moveToFirst())
{
do {
mediaMetadataRetriever.setDataSource(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
Bitmap image = null;
try
{
byte[] art = mediaMetadataRetriever.getEmbeddedPicture();
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inSampleSize = 2;
image = BitmapFactory.decodeByteArray(art, 0, art.length, opt);
}catch(Exception e){}
mSongModel.add(new SongModel(id,title,artist,image));
}while(cursor.moveToNext());
}
}
问题是,它会显着影响启动时间。
因此,我们将不胜感激任何改进性能的建议。
或者,我应该为此目的使用异步任务吗?
谢谢。
我猜您正在使用 metamediaDataRetriever 从曲目本身而不是从媒体数据库中获取专辑封面。在我的应用程序新播放列表管理器中,我根本不使用 metamediaDataRetriever,而是使用 Glide 库获取专辑封面
// loading album cover using Glide library
String stralbumId = c.getString(c
.getColumnIndex(MediaStore.Audio.Playlists.Members.ALBUM_ID));
Uri ImageUrl = getAlbumUri(mContext, stralbumId);
if (ImageUrl != null) {
Glide.with(mContext)
.asBitmap()
.load(ImageUrl)
.into(image);
}
和
public Uri getAlbumUri(Context mContext,String album_id){
Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
Uri imageUri = Uri.withAppendedPath(sArtworkUri, String.valueOf(album_id));
return imageUri;
}
不再处理字节或内存不足错误等。它完成了所有繁重的工作。
在您的应用程序模块中添加 build.gradle:
implementation 'com.github.bumptech.glide:glide:4.5.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'
例如
@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) {
switch (loaderID) {
case LOADER:
return new CursorLoader(getActivity(),
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
dataColumns,
selection, selectionArgs,
sort_order);
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
mAdapter = new new_showallTracksAdapter(new_showallTracksFragment.this.getActivity(),c, listener);
mRecyclerView.setAdapter(mAdapter);
mAdapter.swapCursor(c);
mAdapter.setLayout(currentlayout);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
我正在使用以下代码在 android 中获取设备的音频数据
public void getSongList()
{
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
ContentResolver contentResolver = getActivity().getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = contentResolver.query(uri,null,null,null,null);
if(cursor!=null && cursor.moveToFirst())
{
do {
mediaMetadataRetriever.setDataSource(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
Bitmap image = null;
try
{
byte[] art = mediaMetadataRetriever.getEmbeddedPicture();
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inSampleSize = 2;
image = BitmapFactory.decodeByteArray(art, 0, art.length, opt);
}catch(Exception e){}
mSongModel.add(new SongModel(id,title,artist,image));
}while(cursor.moveToNext());
}
}
问题是,它会显着影响启动时间。
因此,我们将不胜感激任何改进性能的建议。 或者,我应该为此目的使用异步任务吗?
谢谢。
我猜您正在使用 metamediaDataRetriever 从曲目本身而不是从媒体数据库中获取专辑封面。在我的应用程序新播放列表管理器中,我根本不使用 metamediaDataRetriever,而是使用 Glide 库获取专辑封面
// loading album cover using Glide library
String stralbumId = c.getString(c
.getColumnIndex(MediaStore.Audio.Playlists.Members.ALBUM_ID));
Uri ImageUrl = getAlbumUri(mContext, stralbumId);
if (ImageUrl != null) {
Glide.with(mContext)
.asBitmap()
.load(ImageUrl)
.into(image);
}
和
public Uri getAlbumUri(Context mContext,String album_id){
Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
Uri imageUri = Uri.withAppendedPath(sArtworkUri, String.valueOf(album_id));
return imageUri;
}
不再处理字节或内存不足错误等。它完成了所有繁重的工作。
在您的应用程序模块中添加 build.gradle:
implementation 'com.github.bumptech.glide:glide:4.5.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'
例如
@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) {
switch (loaderID) {
case LOADER:
return new CursorLoader(getActivity(),
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
dataColumns,
selection, selectionArgs,
sort_order);
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
mAdapter = new new_showallTracksAdapter(new_showallTracksFragment.this.getActivity(),c, listener);
mRecyclerView.setAdapter(mAdapter);
mAdapter.swapCursor(c);
mAdapter.setLayout(currentlayout);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}