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

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

2013-08-09 17:03 316 查看
文章出处:http://blog.csdn.net/wdaming1986/article/details/6919653

最近研究源码程序,改了改手机短信铃声的源码,最近总结了下铃声的代码,写个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类中的代码:

[java] view
plaincopyprint?

<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());

 
1b5db
; 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中的代码:

[html] view
plaincopyprint?

<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中的代码:

[html] view
plaincopyprint?

<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中的代码:

[html] view
plaincopyprint?

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: