鉴于昨天写的数据库知识,今天我们就开始怎么调用数据库。因为最近在学习音乐播放器的项目,因此,就写一下怎么调用数据库的音乐文件信息吧!
这里简单先说下理论知识哦:
Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户。当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中。在这个程序中,我们不需要关心如何去扫描手机中的文件,只要了解如何查询和使用这些信息就可以了。
MediaStore中定义了一系列的数据表格,通过ContentResolver提供的查询接口,我们可以得到各种需要的信息。下面我们重点介绍查询SD卡上的音乐文件信息。
先来了解一下ContentResolver的查询接口:
Cursor cursor = query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
Uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考开发文档。
Projection: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。
selection: 指定查询条件
selectionArgs:参数selection里有 ?这个符号是,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null。
SortOrder:指定查询结果的排列顺序
下面的命令将返回所有在外部存储卡上的音乐文件的信息:
2. 得到cursor后,我们可以调用Cursor的相关方法具体的音乐信息:
//歌曲ID:MediaStore.Audio.Media._ID Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)); //歌曲的名称 :MediaStore.Audio.Media.TITLE String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)); 歌曲的专辑名:MediaStore.Audio.Media.ALBUM String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)); //歌曲的歌手名: MediaStore.Audio.Media.ARTIST String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); //歌曲文件的路径 :MediaStore.Audio.Media.DATA String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); //歌曲的总播放时长 :MediaStore.Audio.Media.DURATION Int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); //歌曲文件的大小 :MediaStore.Audio.Media.SIZE Int size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
这就用一个demo一边演示一边介绍下:
1、往模拟器放入音乐文件,我往sd卡里放了5个MP3音乐文件
2、运行项目,查看效果
已经有了数据库的音乐文件了
这中间是一个怎样的过程呢?
1.将MP3文件放入安卓sd卡里,因为这里用的是模拟器,所以,放置的位置在mnt/sdcard,直接拖拽就可以放入了。
2.重启模拟器,记住不要从快照启动,否则系统无法更新你放入MP3文件的数据信息,数据库没有更新,你当然提取不到音乐文件的信息啦
3.检查系统数据库文件是否已经有了音乐文件的信息。安卓系统的多媒体数据库文件位置在:/data/data/com.andorid.providers.media/external.db
放入数据库软件查看,是否已经有了上面5首歌的信息,确定有了之后才进行下一步
4.运行项目,项目调用系统的数据库文件,显示在应用中。
下面我就着重介绍一下项目是怎么实现调用数据库的
1.ListActivity.java
主页显示页面
packagecom.example.native_player; importjava.util.List; importandroid.app.Activity; importandroid.os.Bundle; importandroid.widget.ListView; publicclassListActivity extendsActivity { privateListView listView; @Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.songs); listView = (ListView) this.findViewById(R.id.listView1); List<Music> listMusic = MusicList.getMusicData(getApplicationContext()); MusicAdapter adapter = newMusicAdapter(this, listMusic); listView.setAdapter(adapter); } }
很显然,上面的代码只是做了一个简单的显示加载布局,提取音乐数据和设置适配器的作用,但是并没有详细写出实现的方法,接着看下面
2.Music.java
音乐文件信息类,用来放置保存从数据库加载的音乐信息
packagecom.example.native_player; publicclassMusic { privateString title; privateString singer; privateString album; privateString url; privatelongsize; privatelongtime; privateString name; publicString getName() { returnname; } publicvoidsetName(String name) { this.name = name; } publicString getTitle() { returntitle; } publicvoidsetTitle(String title) { this.title = title; } publicString getSinger() { returnsinger; } publicvoidsetSinger(String singer) { this.singer = singer; } publicString getAlbum() { returnalbum; } publicvoidsetAlbum(String album) { this.album = album; } publicString getUrl() { returnurl; } publicvoidsetUrl(String url) { this.url = url; } publiclonggetSize() { returnsize; } publicvoidsetSize(longsize) { this.size = size; } publiclonggetTime() { returntime; } publicvoidsetTime(longtime) { this.time = time; } }
MusicAdapter.java
适配器的配置
packagecom.example.native_player; importjava.util.List; importandroid.content.Context; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.BaseAdapter; importandroid.widget.TextView; publicclassMusicAdapter extendsBaseAdapter { privateList<Music> listMusic; privateContext context; publicMusicAdapter(Context context, List<Music> listMusic) { this.context = context; this.listMusic = listMusic; } publicvoidsetListItem(List<Music> listMusic) { this.listMusic = listMusic; } @Override publicintgetCount() { returnlistMusic.size(); } @Override publicObject getItem(intarg0) { returnlistMusic.get(arg0); } @Override publiclonggetItemId(intposition) { returnposition; } @Override publicView getView(intposition, View convertView, ViewGroup parent) { if(convertView == null) { convertView = LayoutInflater.from(context).inflate( R.layout.music_item, null); } Music m = listMusic.get(position); // 音乐名 TextView textMusicName = (TextView) convertView .findViewById(R.id.music_item_name); textMusicName.setText(m.getName()); // 歌手 TextView textMusicSinger = (TextView) convertView .findViewById(R.id.music_item_singer); textMusicSinger.setText(m.getSinger()); // 持续时间 TextView textMusicTime = (TextView) convertView .findViewById(R.id.music_item_time); textMusicTime.setText(toTime((int) m.getTime())); returnconvertView; } /** * 时间格式转换 * * @param time * @return */ publicString toTime(inttime) { time /= 1000; intminute = time / 60; inthour = minute / 60; intsecond = time % 60; minute %= 60; returnString.format("%02d:%02d", minute, second); } }
4.MusicList.java获取数据库里的音乐文件信息,并以Music类来保存数据
packagecom.example.native_player; importjava.util.ArrayList; importjava.util.List; importandroid.content.ContentResolver; importandroid.content.Context; importandroid.database.Cursor; importandroid.provider.MediaStore; publicclassMusicList { publicstaticList<Music> getMusicData(Context context) { List<Music> musicList = newArrayList<Music>(); ContentResolver cr = context.getContentResolver(); if(cr != null) { // 获取所有歌曲 Cursor cursor = cr.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); if(null== cursor) { returnnull; } if(cursor.moveToFirst()) { do { Music m = newMusic(); String title = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.TITLE)); String singer = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.ARTIST)); if("<unknown>".equals(singer)) { singer = "未知艺术家"; } String album = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.ALBUM)); longsize = cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.SIZE)); longtime = cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.DURATION)); String url = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.DATA)); String name = cursor .getString(cursor .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); String sbr = name.substring(name.length() - 3, name.length()); // Log.e("--------------", sbr); if(sbr.equals("mp3")) { m.setTitle(title); m.setSinger(singer); m.setAlbum(album); m.setSize(size); m.setTime(time); m.setUrl(url); m.setName(name); musicList.add(m); } } while(cursor.moveToNext()); } } returnmusicList; } }
从上面的步骤代码,我们可以很清楚的知道,重要的提取系统的数据库的音乐信息在最后一个类,
应该挺详细清楚的吧!今天就写到这里吧!还要继续验证,敲打些代码,也该准备准备找工作了,笔试和面试还是一个挺大的问题。。。。。