您的位置:首页 > 移动开发 > Android开发

Android中铃声总结【安卓源码解析一】

2011-10-30 22:10 351 查看
最近研究源码程序,改了改手机短信铃声的源码,最近总结了下铃声的代码,写个activity继承PreferenceActivity有:手机短信铃声,手机铃声,闹钟铃声,还有sdcard中的铃声,通过选择相应的铃声,然后读取到xml文件里面,通过读取preference.xml文件,intent传个参数进去intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI,
phoneUri);打开对话框的时候就默认选中上次被选中的音乐。程序流程:在onCreate()方法中加入addPreferencesFromResource(R.xml.preferences);加载xml文件。@Override重写onPreferenceTreeClick()方法,处理点击事件,在打开对话框铃声的时候,先读取xml文件,判断是否有值,如果有值,就传值intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, phoneUri);然后进行选择铃声。通过onActivityResult()接受传递过来的uri,系统默认的铃声是通过data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);方法来获取uri的,而sdcard中的铃声通过Uri
pickedUri = data.getData();来获得选中的uri的,再然后通过editor.commit(); 来提交接受过来的uri和音乐的名字整个流程大概就是这样。想要代码的请留言留下邮箱!

大明原创,转载请标明出处:/article/1393510.html




下面请看截图:

第一次打开程序的界面: 点击“选择短信铃声”后的界面:









选择铃声的dialog后的界面: 点击“选择手机铃声”后的界面:








点击“选择手机铃声”后的界面: 点击“选择闹钟铃声”后的dialog界面:








点击“选择sdcard中的铃声”后的界面: 点击“选择曲目”后弹出sdcard的界面:









下面代码附上:

在SoundSettingActivity这个工程下面:



一、在com.cn.android.daming包的SoundSettingMainActivity.java类中的代码:

package com.cn.android.daming;

import android.content.Intent;
import android.content.SharedPreferences;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;

public class SoundSettingMainActivity extends PreferenceActivity  {

	private static final int SMS_RINGTONE_PICKED = 1;
	private static final int PHONE_RINGTONE_PICKED = 2;
	private static final int ALARM_RINGTONE_PICKED = 3;
	private static final int SDCARD_RINGTONE_PICKED = 4;
	
	public static final String NOTIFICATION_RINGTONE    = "pref_notification_ringtone";
	public static final String NOTIFICATION_RINGTONE_TITLE_NAME = "pref_notification_ringtone_name";
	public static final String PHONE_RINGTONE    = "pref_phone_ringtone";
	public static final String PHONE_RINGTONE_TITLE_NAME    = "pref_phone_ringtone_title_name";
	public static final String ALARM_RINGTONE    = "pref_alarm_ringtone";
	public static final String ALARM_RINGTONE_TITLE_NAME    = "pref_alarm_ringtone_title_name";
	public static final String SDCARD_RINGTONE    = "pref_sdcard_ringtone";
	public static final String SDCARD_RINGTONE_TITLE_NAME    = "pref_sdcard_ringtone_title_name";
	
	private String notificationStr;
	private String phoneStr;
	private String alarmStr;
	private String sdcardStr;
	
	private Preference mMmsSoundsPref;
	private Preference mPhoneSoundsPref;
	private Preference mAlarmSoundsPref;
	private Preference mSdcardSoundsPref;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        setMessagePreferences();
        setDefaultPreferences();
    }
    
    private void setMessagePreferences() {
    	mMmsSoundsPref = findPreference("pref_sms_ringtone");
    	mPhoneSoundsPref = findPreference("pref_phone_ringtone");
    	mAlarmSoundsPref = findPreference("pref_alarm_ringtone");
    	mSdcardSoundsPref = findPreference("pref_sdcard_ringtone");
    }
    
    private void setDefaultPreferences(){
    	SharedPreferences innersharedPreferences = PreferenceManager.getDefaultSharedPreferences(SoundSettingMainActivity.this);
    	String notificationRingtoneTitleName = innersharedPreferences.getString(NOTIFICATION_RINGTONE_TITLE_NAME, null);
    	if(notificationRingtoneTitleName!=null){
    		mMmsSoundsPref.setSummary(notificationRingtoneTitleName);
    	}else{
    		mMmsSoundsPref.setSummary(getString(R.string.pref_summary_notification_ringtone));
    	}
    	
    	String phoneRingtoneTitleName = innersharedPreferences.getString(PHONE_RINGTONE_TITLE_NAME, null);
    	if(phoneRingtoneTitleName!=null){
    		mPhoneSoundsPref.setSummary(phoneRingtoneTitleName);
    	}else{
    		mPhoneSoundsPref.setSummary(getString(R.string.pref_summary_phone_ringtone));
    	}
    	
    	String alarmRingtoneTitleName = innersharedPreferences.getString(ALARM_RINGTONE_TITLE_NAME, null);
    	if(alarmRingtoneTitleName!=null){
    		mAlarmSoundsPref.setSummary(alarmRingtoneTitleName);
    	}else{
    		mAlarmSoundsPref.setSummary(getString(R.string.pref_summary_alarm_ringtone));
    	}
    	
    	String sdcardRingtoneTitleName = innersharedPreferences.getString(SDCARD_RINGTONE_TITLE_NAME, null);
    	if(sdcardRingtoneTitleName!=null){
    		mSdcardSoundsPref.setSummary(sdcardRingtoneTitleName);
    	}else{
    		mSdcardSoundsPref.setSummary(getString(R.string.pref_summary_sdcard_ringtone));
    	}
    }

	@Override
	public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
			Preference preference) {
		if (preference == mMmsSoundsPref){
			doPickSmsRingtone();
		}
		else if(preference == mPhoneSoundsPref){
			doPickPhoneRingtone();
		}
        else if(preference == mAlarmSoundsPref){
        	doPickAlarmRingtone();
		}
        else if(preference == mSdcardSoundsPref){
        	doPickSdcardRingtone();
        }
		return super.onPreferenceTreeClick(preferenceScreen, preference);
	}
	
	private void doPickSmsRingtone(){
		SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);  
		notificationStr = sharedPreferences.getString(NOTIFICATION_RINGTONE, null); 
    	
        Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
        // Allow user to pick 'Default'
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
        // Show only ringtones
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
        //set the default Notification value
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
        // Don't show 'Silent'
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);

        Uri notificationUri;
        if (notificationStr != null) {
        	notificationUri = Uri.parse(notificationStr);
            // Put checkmark next to the current ringtone for this contact
            intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, notificationUri);
        } else {
            // Otherwise pick default ringtone Uri so that something is selected.
        	notificationUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            // Put checkmark next to the current ringtone for this contact
            intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, notificationUri);
        }

        // Launch!
        startActivityForResult(intent, SMS_RINGTONE_PICKED);
	}
	
	private void doPickPhoneRingtone(){
		SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);  
		phoneStr = sharedPreferences.getString(PHONE_RINGTONE, null); 
		
		Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
        // Allow user to pick 'Default'
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
        // Show only ringtones
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
        //set the default Notification value
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE));
        // Don't show 'Silent'
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
        
        Uri phoneUri;
        if (phoneStr != null) {
        	phoneUri = Uri.parse(phoneStr);
            // Put checkmark next to the current ringtone for this contact
            intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, phoneUri);
        } else {
            // Otherwise pick default ringtone Uri so that something is selected.
        	phoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
            // Put checkmark next to the current ringtone for this contact
            intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, phoneUri);
        }
        
        startActivityForResult(intent, PHONE_RINGTONE_PICKED);
	}
	
	private void doPickAlarmRingtone(){
		SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);  
		alarmStr = sharedPreferences.getString(ALARM_RINGTONE, null); 
		
		Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
        // Allow user to pick 'Default'
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
        // Show only ringtones
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM);
        //set the default Notification value
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM));
        // Don't show 'Silent'
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
        
        Uri alarmUri;
        if (alarmStr != null) {
        	alarmUri = Uri.parse(alarmStr);
            // Put checkmark next to the current ringtone for this contact
            intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, alarmUri);
        } else {
            // Otherwise pick default ringtone Uri so that something is selected.
        	alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
            // Put checkmark next to the current ringtone for this contact
            intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, alarmUri);
        }
        
        startActivityForResult(intent, ALARM_RINGTONE_PICKED);
	}
	
	private void doPickSdcardRingtone(){
		SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);  
		sdcardStr = sharedPreferences.getString(SDCARD_RINGTONE, null); 
		
		Uri sdcardUri = null;
    	if (sdcardStr != null) {
    		sdcardUri = Uri.parse(sdcardStr);
    	} 
		
        Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);
        innerIntent.setType("audio/*");
        //you could lookup the framework the type of audio,if you don`t want use the Recorder use the note code
//        innerIntent.setType("audio/aac");
//        innerIntent.setType("audio/mp3");
//        innerIntent.setType("audio/midi");
        // Put checkmark next to the current ringtone for this contact
        innerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, sdcardUri);
        Intent wrapperIntent = Intent.createChooser(innerIntent, null);
        startActivityForResult(wrapperIntent, SDCARD_RINGTONE_PICKED);
	}

	@Override
	protected void onResume() {
		setDefaultPreferences();
		super.onResume();
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);  
        SharedPreferences.Editor editor = sharedPreferences.edit();  
		if (resultCode != RESULT_OK) {
            return;
        }
		
		switch (requestCode) {
		      case SMS_RINGTONE_PICKED:{
		    	  Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
		    	  if(null == pickedUri){
		    		  editor.putString(NOTIFICATION_RINGTONE_TITLE_NAME, getString(R.string.select_ringtone_slient));
		    		  editor.putString(NOTIFICATION_RINGTONE, null); 
		    		  editor.commit(); 
		    	  }else{
		    		  Ringtone ringtone =  RingtoneManager.getRingtone(SoundSettingMainActivity.this, pickedUri);
		    		  String strRingtone = ringtone.getTitle(SoundSettingMainActivity.this);
		    		  editor.putString(NOTIFICATION_RINGTONE_TITLE_NAME, strRingtone);
		    		  editor.putString(NOTIFICATION_RINGTONE, pickedUri.toString());  
		    		  editor.commit();  
		    	  }
		    	  break;
		      }
		      case PHONE_RINGTONE_PICKED:{
		    	  Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
		    	  if(null == pickedUri){
		    		  editor.putString(PHONE_RINGTONE_TITLE_NAME, getString(R.string.select_ringtone_slient));
		    		  editor.putString(PHONE_RINGTONE, null); 
		    		  editor.commit(); 
		    	  }else{
		    		  phoneStr = pickedUri.toString();
		    		  Ringtone ringtone =  RingtoneManager.getRingtone(SoundSettingMainActivity.this, pickedUri);
		    		  String strRingtone = ringtone.getTitle(SoundSettingMainActivity.this);
		    		  editor.putString(PHONE_RINGTONE_TITLE_NAME, strRingtone);
		    		  editor.putString(PHONE_RINGTONE, pickedUri.toString());  
		    		  editor.commit();  
		    	  }
		    	  break;
		      }
		      case ALARM_RINGTONE_PICKED:{
		    	  Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
		    	  if(null == pickedUri){
		    		  editor.putString(ALARM_RINGTONE_TITLE_NAME, getString(R.string.select_ringtone_slient));
		    		  editor.putString(ALARM_RINGTONE, null); 
		    		  editor.commit(); 
		    	  }else{
		    		  Ringtone ringtone =  RingtoneManager.getRingtone(SoundSettingMainActivity.this, pickedUri);
		    		  String strRingtone = ringtone.getTitle(SoundSettingMainActivity.this);
		    		  editor.putString(ALARM_RINGTONE_TITLE_NAME, strRingtone);
		    		  editor.putString(ALARM_RINGTONE, pickedUri.toString());  
		    		  editor.commit();  
		    	  }
		    	  break;
		      }
		      case SDCARD_RINGTONE_PICKED:{
		    	  Uri pickedUri = data.getData();
		    	  if(null != pickedUri){
		    		  notificationStr = pickedUri.toString();
		    		  Ringtone ringtone =  RingtoneManager.getRingtone(SoundSettingMainActivity.this, pickedUri);
		    		  String strRingtone = ringtone.getTitle(SoundSettingMainActivity.this);
		    		  editor.putString(SDCARD_RINGTONE_TITLE_NAME, strRingtone);
		    		  editor.putString(SDCARD_RINGTONE, pickedUri.toString());  
		    		  editor.commit();  
		    	  }
		    	  break;
		      }
		      default:break;
		}
	}
}



二、在res目录下加入xml文件,加入preferences.xml中的代码:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">
	  <PreferenceCategory android:title="@string/pref_sounds_storage_title"
	                      android:key="pref_key_storage_settings">
	           <Preference         
	                    android:layout="?android:attr/preferenceLayoutChild"
                        android:key="pref_sms_ringtone"
                        android:ringtoneType="notification"
                        android:title="@string/pref_title_notification_ringtone"
                        android:summary="@string/pref_summary_notification_ringtone"
               />
               <Preference         
	                    android:layout="?android:attr/preferenceLayoutChild"
                        android:key="pref_phone_ringtone"
                        android:ringtoneType="notification"
                        android:title="@string/pref_title_phone_ringtone"
                        android:summary="@string/pref_summary_phone_ringtone"
               />
               <Preference         
	                    android:layout="?android:attr/preferenceLayoutChild"
                        android:key="pref_alarm_ringtone"
                        android:ringtoneType="notification"
                        android:title="@string/pref_title_alarm_ringtone"
                        android:summary="@string/pref_summary_alarm_ringtone"
               />
               <Preference         
	                    android:layout="?android:attr/preferenceLayoutChild"
                        android:key="pref_sdcard_ringtone"
                        android:ringtoneType="notification"
                        android:title="@string/pref_title_sdcard_ringtone"
                        android:summary="@string/pref_summary_sdcard_ringtone"
               />
	  </PreferenceCategory>
</PreferenceScreen>



三、在values目录下的string中的代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, SoundSettingMainActivity!</string>
    <string name="app_name">SoundSettingApp</string>
    <string name="pref_sounds_storage_title">大明原创SoundSetting</string>
    <string name="pref_title_notification_ringtone">选择短信铃声</string>
    <string name="pref_summary_notification_ringtone">默认短信铃声</string>
    <string name="pref_title_phone_ringtone">选择手机铃声</string>
    <string name="pref_summary_phone_ringtone">默认手机铃声</string>
    <string name="pref_title_alarm_ringtone">选择闹钟铃声</string>
    <string name="pref_summary_alarm_ringtone">默认闹钟铃声</string>
    <string name="pref_title_sdcard_ringtone">选择Sdcard中的铃声</string>
    <string name="pref_summary_sdcard_ringtone">默认Sdcard铃声</string>
    <string name="select_ringtone_slient">静音</string>
</resources>




四、在AndroidManifest.xml中的代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.cn.android.daming"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SoundSettingMainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>


完整代码下载地址:http://download.csdn.net/detail/wdaming1986/3736718
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: