媒体数据库的数据查询

在android中如何查询媒体数据库中的数据

比如在媒体数据库中,如何取得对应音乐专辑的封面图片

先来点实例证据说话:

我就从代码中来一步一步讲解,如何获取需要的数据库内容。

public class SingerActivity extends BaseActivity {

private ListView lv_singer;
private ImageView iv_back;
private TextView tv_title;
private ArrayList<Singer> arrayList;

@Override
protected void initView() {//这里不是重点哦,只是注册控件
    setContentView(R.layout.activity_singer);
    lv_singer = (ListView) findViewById(R.id.lv_singer);
    iv_back = (ImageView) findViewById(R.id.iv_back);
    tv_title = (TextView) findViewById(R.id.tv_title);
    TextView tv_title = (TextView) findViewById(R.id.tv_title);
    tv_title.setText("Singer");
}

@Override
protected void initDate() {//从这里开始就是主要代码了,
    arrayList = new ArrayList<>();//创建arrayList存放singer对象,singer对象中只有两个属性(姓名和专辑图片<Bitmap>类型的图片)
    readInfoFromDB();//从数据库中读取数据
    SingerAdapter adapter = new SingerAdapter(this, arrayList);
    lv_singer.setAdapter(adapter);
}

private void readInfoFromDB() {//从数据库中读取数据
    ContentResolver resolver = getContentResolver();//获取内容观察者
    Uri uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;//获取媒体数据库的外部存储内容的Uri
    Cursor cursorOfAudio = resolver.query(uri, null, null, null, null);//获取该数据库的cursor

    if (cursorOfAudio!=null) {
        while (cursorOfAudio.moveToNext()) {
          String  artist = cursorOfAudio.getString(cursorOfAudio.getColumnIndex("artist"));//获取歌手姓名
            // 专辑封面id,根据该id可以获得专辑图片uri
            long albumId = cursorOfAudio.getLong(cursorOfAudio.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
            String coverUri = getCoverUri(getApplicationContext(), albumId);//该方法在下面
            Bitmap bitmap = convertToBitmap(coverUri, 170, 200);//将uri路径名转换为图片
            Singer singer = new Singer(artist,bitmap);
            arrayList.add(singer);
        }
    }
}
/**
 * 查询专辑封面图片uri
 */
private static String getCoverUri(Context context, long albumId) {
    String uri = null;//下面这几行代码是关键,通过上面获取到的专辑Id,我们必须将其拼接为新的获取album_art
的数据库的uri然后才能查询该数据库,因为该数据库并没有可以如上面的常量获取路径,只能通过uri拼接才能进入数据库
    Cursor cursor = context.getContentResolver().query(
            Uri.parse("content://media/external/audio/albums/" + albumId),
            new String[]{"album_art"}, null, null, null);
    if (cursor != null) {
        cursor.moveToNext();
        uri = cursor.getString(0);
        cursor.close();
    }
    return uri;
}
public Bitmap convertToBitmap(String path, int w, int h) {//该方法是将获取的图片uri转换为图片
    BitmapFactory.Options opts = new BitmapFactory.Options();//通过位图工厂获取图片操作器
    // 设置为ture只获取图片大小
    opts.inJustDecodeBounds = true;//由于通常我们数据库中的图片较大,不能直接显示在界面上,必须要经过从新缩放才能获取
    opts.inPreferredConfig = Bitmap.Config.ARGB_8888;//设置图片的质量,一共有4个类型
    // 返回为空
    BitmapFactory.decodeFile(path, opts);
    int width = opts.outWidth;//图片的原本宽度
    int height = opts.outHeight;
    float scaleWidth = 0.f, scaleHeight = 0.f;
    if (width > w || height > h) {
            // 缩放
            scaleWidth = ((float) width) / w;
            scaleHeight = ((float) height) / h;
    }
    opts.inJustDecodeBounds = false;
    float scale = Math.max(scaleWidth, scaleHeight);
    opts.inSampleSize = (int)scale;
    WeakReference<Bitmap> weak = new WeakReference<Bitmap>(BitmapFactory.decodeFile(path, opts));
    return Bitmap.createScaledBitmap(weak.get(), w, h, true);
}
@Override
protected void initListener() {

}

@Override
protected void processCilck(View v) {

}
}

接下来就是将图片显示到屏幕上,看下面哦,这是适配器Adapter,这个就比较简单了,我就不多解释了,直接贴上代码:

public class SingerAdapter extends BaseAdapter {
ArrayList<Singer> arrayList;
Context mContext;
LayoutInflater inflater;

public SingerAdapter( Context mContext,ArrayList<Singer> arrayList) {
    this.arrayList = arrayList;
    this.mContext = mContext;
    this.inflater = LayoutInflater.from(mContext);
}

@Override
public int getCount() {
    return arrayList.size();
}

@Override
public Object getItem(int position) {
    return arrayList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.item_singers, null);
        TextView tv_singer_realname = (TextView) convertView.findViewById(R.id.tv_singer_realname);
        ImageView iv_singer = (ImageView) convertView.findViewById(R.id.iv_singer);
        viewHolder = new ViewHolder(tv_singer_realname, iv_singer);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    Singer singer = (Singer) getItem(position);
    viewHolder.textView.setText(singer.getName());
    viewHolder.imageView.setImageBitmap(singer.getPath());
    return convertView;
}
}
class ViewHolder
{
TextView textView;
ImageView imageView;

public ViewHolder(TextView textView, ImageView imageView) {
    this.textView = textView;
    this.imageView = imageView;
}

其实数据库中的其他数据,比如专辑数量,歌曲数量等信息,可以通过下面的uri来获取:

MediaStore.Audio.Albums.NUMBER_OF_SONGS;//获取专辑中的歌曲数量

MediaStore.Audio.Artists.NUMBER_OF_ALBUMS;//获取歌手的专辑数量。

还有其他的Uri等,只需要修改最后的常量就可以,看见其他的了。基本上可以获取所有的媒体信息。

发布了16 篇原创文章 · 获赞 2 · 访问量 6183
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览