首页 > 安全资讯 >

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

11-10-31

最近研究源码程序,改了改手机短信铃声的源码,最近总结了下铃声的代码,写个activity继承PreferenceActivity有:手机短信铃声,手机铃声,闹钟铃声,还有sdcard中的铃声,通过选择相应的铃声,然后读取到xml文...

 

   最近研究源码程序,改了改手机短信铃声的源码,最近总结了下铃声的代码,写个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和音乐的名字整个流程大概就是这样。想要源码的请留言留下邮箱!

大明原创,转载请标明出处:http://blog.csdn.net/wdaming1986/article/details/6919653

 

                下面请看截图:            

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

                                                                                                  

 

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

                                                    

 

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

                                                    

 

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

                                                       

 

 

 

     下面代码附上:

 

 

在SoundSettingActivity这个工程下面:

 

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

 

<span style="font-size:16px;color:#000000;">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; 

        } 

    } 

}</span> 

 

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

 

<span style="font-size:16px;"><?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> 

</span> 

 

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

 

<span style="font-size:16px;"><?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> 

</span> 

 

 

四、在AndroidManifest.xml中的代码:

view plainprint?

<span style="font-size:16px;"><?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></span> 

 

 完整代码下载地址:http://download.csdn.net/detail/wdaming1986/3736718

相关文章
最新文章
热点推荐