获取音频时的性能问题

时间:2018-04-13 17:52:49

标签: android performance audio android-contentresolver mediastore

我使用以下代码在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());
    }
}

问题是,它会显着影响启动时间。

因此,任何有关性能改进的建议都将受到赞赏。 或者,我应该为此目的使用异步任务吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

我猜你正在使用metamediaDataRetriever从轨道本身而不是从媒体数据库中获取albumart。在我的应用程序新播放列表管理器中,我根本不使用metamediaDataRetriever并使用Glide库获取albumart

                  //  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;

}

不再操纵字节或内存不足等错误。它完成了所有繁重的工作。

添加你的app模块的build.gradle:

   implementation 'com.github.bumptech.glide:glide:4.5.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'

答案 1 :(得分:1)

例如

     @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);

}