Android 指定SD卡上一首歌作为程序的背景音乐(进阶篇之PreferenceActivity的使用)...

PreferenceActivity是一种视图化的SharedPreference,同样用于保存Activity的配置。与一般Activity不同的是,它的组件只有如下几种:

PrefereceActivity的组件描述
CheckBoxPreference复选框
EditTextPreference文字编辑框
ListPreference列表
PreferenceCategory类别分隔
PreferenceScreenPreference组件的容器
RingtonePreference系统铃声列表项

这些组件都是以<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卡上指定音乐作为程序背景音乐”的功能。(只要你掌握了这种方法,你肯定有能力实现方案一)


先贴出效果图吧:


以下是程序清单:(完整代码可以到我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" />
第二种方法,是相对路径的获取方法。即该配置文件与要获取该配置的文件属于一个应用程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值