使用Android获取的音乐文件数据库

来源:互联网 发布:自学剑道软件 编辑:程序博客网 时间:2024/05/17 10:40

(转自:caizhiyong的博客)

鉴于前面写的数据库知识【见http://www.linuxidc.com/Linux/2013-07/87234.htm】,今天我们就开始怎么调用数据库。因为最近在学习音乐播放器的项目,因此,就写一下怎么调用数据库的音乐文件信息吧!

这里简单先说下理论知识哦:
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;
}
}

从上面的步骤代码,我们可以很清楚的知道,重要的提取系统的数据库的音乐信息在最后一个类,
应该挺详细清楚的吧!今天就写到这里吧!

更多Android相关信息见Android 专题页面http://www.linuxidc.com/topicnews.aspx?tid=11

linux
0 0
原创粉丝点击