Android 开发 ContentProvider 获取歌曲列表和联系人的例子

ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

以下这段是Google Doc中对ContentProvider的大致概述。内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

1.ContentProviderAndroid提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。主要方法:public boolean onCreate() 在创建ContentProvider时调用public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursorpublic Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型*如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。*如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。

2.ContentResolver当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

ContentResolver cr = getContentResolver();

ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法。public Uri insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的ContentProvider。

3.UriUri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。第一部分是"content://"。可以看作是网址中的""。第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如"blog.csdn.net"。第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

// 查找sdcard卡上的所有歌曲信息public List

// 加入封装音乐信息的代码// 查询所有歌曲ContentResolver musicResolver = this.getContentResolver();Cursor musicCursor = musicResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,null);

int musicColumnIndex;

if (null != musicCursor && musicCursor.getCount() > 0) {for (musicCursor.moveToFirst(); !musicCursor.isAfterLast(); musicCursor.moveToNext()) {Map musicDataMap = new HashMap();

Random random = new Random();int musicRating = Math.abs(random.nextInt()) % 10;

musicDataMap.put("musicRating", musicRating);

// 取得音乐播放路径musicColumnIndex = musicCursor.getColumnIndex(MediaStore.Audio.AudioColumns.DATA);musicPath = musicCursor.getString(musicColumnIndex);musicDataMap.put("musicPath", musicPath);

// 取得音乐的名字musicColumnIndex = musicCursor.getColumnIndex(MediaStore.Audio.AudioColumns.TITLE);musicName = musicCursor.getString(musicColumnIndex);musicDataMap.put("musicName", musicName);

// 取得音乐的专辑名称musicColumnIndex = musicCursor.getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM);musicAlbum = musicCursor.getString(musicColumnIndex);musicDataMap.put("musicAlbum", musicAlbum);

// 取得音乐的演唱者musicColumnIndex = musicCursor.getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST);musicArtist = musicCursor.getString(musicColumnIndex);musicDataMap.put("musicArtist", musicArtist);

// 取得歌曲对应的专辑对应的KeymusicColumnIndex = musicCursor.getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM_KEY);musicAlbumKey = musicCursor.getString(musicColumnIndex);

人的不幸缘于欲望,所以知足者长乐。

Android 开发 ContentProvider 获取歌曲列表和联系人的例子

相关文章:

你感兴趣的文章:

标签云: