Android 指定SD卡上一首歌作为程序的背景音乐(进阶篇之PreferenceActivity的使用)
2011-11-27 18:34
597 查看
PreferenceActivity是一种视图化的SharedPreference,同样用于保存Activity的配置。与一般Activity不同的是,它的组件只有如下几种:
PrefereceActivity的组件描述
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/1b5ef159ed5fce54c846d2fc6b91a29e.gif)
这些组件都是以<String,String>这种键值对的形式保存用户的UI方式的选择,所以要为每个组件指定一个key.
要播放SD卡上的音乐,首要任务是获取对应音乐文件的Uri. 目前,有两种方案可以实现这个功能:
唯一的缺点是它的“系统铃声列表”中,默认只有系统的自带铃声。如果要使用用户自身下载的音乐作为铃声,
需要用户手动将目标音乐文件添加为手机铃声(具体操作方法为:长按该音乐文件,在弹出的上下文菜单选项中
选中“设置为手机铃声”)。
xml中,设置它的键值对的参数是:
Java中,设置它的键值对的方法为:
该方案,通过ContentResolver来的query方法来得到一个关于SD卡上音乐列表的索引表。
并通过该索引表获得音乐的歌曲名和ID号,分别存为键和值。
方案一的实现比较简单,但是考虑用户要使用的背景音乐一般是用户自身下载的,所以我选择方案二来实现“将SD卡上指定音乐作为程序背景音乐”的功能。(只要你掌握了这种方法,你肯定有能力实现方案一)
先贴出效果图吧:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/d1ea2102bf0b4f6c937d6238749ddf8a.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/fcaadaa461694df9e145bcfbdd521bcb.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/1721788003bab1e51c763497d4746b6c.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/eb8b9bce5456f5eaf664d3132e4b64d3.gif)
以下是程序清单:(完整代码可以到我SCDN下载频道,免费下载,Android背景音乐代码设置)
两个Java文件:
主程序:BackgroundMusicActivity.java
配置页面:Settings.java
PreferencesActivity的配置文件,settings.xml
程序的一点说明:
这两句是获取Settings.java中相应的SharedPreference的两种方法。
第一种方法,是一种绝对路径的获取方法。意味着,我们可以在其它程序获取该配置。
该方法的一个参数为:包名+"_preferences". 注意了,name不需要加上.xml
其中这个包名为mainfest中的包名:(package后面那一串)
CheckBoxPreference | 复选框 |
EditTextPreference | 文字编辑框 |
ListPreference | 列表 |
PreferenceCategory | 类别分隔 |
PreferenceScreen | Preference组件的容器 |
RingtonePreference | 系统铃声列表项 |
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/1b5ef159ed5fce54c846d2fc6b91a29e.gif)
这些组件都是以<String,String>这种键值对的形式保存用户的UI方式的选择,所以要为每个组件指定一个key.
要播放SD卡上的音乐,首要任务是获取对应音乐文件的Uri. 目前,有两种方案可以实现这个功能:
方案一:使用RingtonePreference组件
该组件的键值对中的值就是所选铃声的Uri的String形式。该组件的效果如右图所示。唯一的缺点是它的“系统铃声列表”中,默认只有系统的自带铃声。如果要使用用户自身下载的音乐作为铃声,
需要用户手动将目标音乐文件添加为手机铃声(具体操作方法为:长按该音乐文件,在弹出的上下文菜单选项中
选中“设置为手机铃声”)。
方案二:使用ListPreference组件
该组件是普通的列表组件,它的键和值都需要用户手动设置。xml中,设置它的键值对的参数是:
android:entries="" android:entryValues=""
Java中,设置它的键值对的方法为:
listPreference.setEntries(String[] entries); listPreference.setEntryValues(String[] entryValues);
该方案,通过ContentResolver来的query方法来得到一个关于SD卡上音乐列表的索引表。
并通过该索引表获得音乐的歌曲名和ID号,分别存为键和值。
方案一的实现比较简单,但是考虑用户要使用的背景音乐一般是用户自身下载的,所以我选择方案二来实现“将SD卡上指定音乐作为程序背景音乐”的功能。(只要你掌握了这种方法,你肯定有能力实现方案一)
先贴出效果图吧:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/d1ea2102bf0b4f6c937d6238749ddf8a.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/fcaadaa461694df9e145bcfbdd521bcb.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/1721788003bab1e51c763497d4746b6c.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/10/eb8b9bce5456f5eaf664d3132e4b64d3.gif)
以下是程序清单:(完整代码可以到我SCDN下载频道,免费下载,Android背景音乐代码设置)
两个Java文件:
主程序:BackgroundMusicActivity.java
private void initPreferenceSettings() { // Play background music from user's choice in Settings.java //SharedPreferences sharedPreferences = getSharedPreferences("keNan.com.music_preferences",MODE_WORLD_READABLE); sp = PreferenceManager.getDefaultSharedPreferences(this); musicEn = sp.getBoolean(getResources().getString(R.string.musicToggleKey), false); final String musicUriString = sp.getString(getResources().getString(R.string.musiclistKey), null); if (musicEn && (null != musicUriString)) { Uri uri = Uri.parse(musicUriString); /** * If this.musicUriString doesn't equal musicUriString, it means that * we change the title of the background music. So we need create a * new mediaPlayer. */ if ((null == mediaPlayer) || false == this.musicUriString.equals(musicUriString)) { this.musicUriString = musicUriString; mediaPlayer = MediaPlayer.create(this, uri); mediaPlayer.setLooping(true); mediaPlayer.start(); } else { mediaPlayer.start(); } } }
配置页面:Settings.java
// For music settings private static Uri URI_SD_MUSIC = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; private static String MUSIC_TITLE = MediaStore.Audio.Media.TITLE; private static String MUSIC_ID = MediaStore.Audio.Media._ID; private ListPreference musiclistPreference; @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); addPreferencesFromResource(R.xml.settings); init(); } private void init() { initUI(); initMusicSettings(); } private void initUI() { String musiclistKey = getResources().getString(R.string.musiclistKey); musiclistPreference = (ListPreference)findPreference(musiclistKey); } private void initMusicSettings() { ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query( URI_SD_MUSIC, new String[]{MUSIC_ID, MUSIC_TITLE}, null, null, null); if (null == cursor) { musiclistPreference.setEntries(new String[]{}); musiclistPreference.setEntryValues(new String[]{}); } else { int count = cursor.getCount(); String[] entries = new String[count]; String[] entryValues = new String[count]; int i = 0; while (cursor.moveToNext()) { entries[i] = cursor.getString(cursor.getColumnIndexOrThrow(MUSIC_TITLE)); String musicID = cursor.getString(cursor.getColumnIndexOrThrow(MUSIC_ID)); Uri musicUri = Uri.withAppendedPath(URI_SD_MUSIC, musicID); entryValues[i] = musicUri.toString(); i ++; } musiclistPreference.setEntries(entries); musiclistPreference.setEntryValues(entryValues); } cursor.close(); } }
PreferencesActivity的配置文件,settings.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/settingsTitle"> <!-- For background music --> <PreferenceCategory android:title="@string/musicCategoryTitle"> <ListPreference android:key="@string/musiclistKey" android:title="@string/musiclistTitle" android:summary="@string/musiclistSummary" android:dialogTitle="@string/musiclistTitle"/> <CheckBoxPreference android:key="@string/musicToggleKey" android:title="@string/musicToggleTitle" android:defaultValue="true"/> </PreferenceCategory> </PreferenceScreen>
程序的一点说明:
//SharedPreferences sharedPreferences = getSharedPreferences("keNan.com.music_preferences",MODE_WORLD_READABLE); sp = PreferenceManager.getDefaultSharedPreferences(this);
这两句是获取Settings.java中相应的SharedPreference的两种方法。
第一种方法,是一种绝对路径的获取方法。意味着,我们可以在其它程序获取该配置。
该方法的一个参数为:包名+"_preferences". 注意了,name不需要加上.xml
其中这个包名为mainfest中的包名:(package后面那一串)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="keNan.com.music" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" />第二种方法,是相对路径的获取方法。即该配置文件与要获取该配置的文件属于一个应用程序。
相关文章推荐
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- Android PreferenceActivity使用
- android 不同Activity使用一个SharedPreference
- android 使用壁纸作为当前Activity的背景
- android 屏蔽指定activity启动(程序锁)
- android 屏蔽指定activity启动(程序锁)
- android应用开发程序使用网络及SD卡
- Android Preference Activity使用
- Android Preference的使用总结(很全很详细)以及SharedPreferences多个程序之间共享数据
- android View使用shape作为背景不能指定单边圆角的xml
- Android 播放SD卡上指定的一首歌(初级版)
- android开发 有2个Activity,想先指定哪个activity作为主窗口,怎么实现?
- android 屏蔽指定activity启动(程序锁)
- Android Preference的使用总结(很全很详细)以及SharedPreferences多个程序之间共享数据
- Android 屏蔽指定activity启动(程序锁)
- Android开发之PreferenceActivity的使用
- Android studio设置activity主题程序崩溃解决办法