android铃声选择开发,android – 在首选项中,选择我的声音就像铃声优先

这里我的铃声优先替换.

列出所有系统铃声和您的自定义铃声(以xml定义,存储在res / raw中)

ExtraRingtonePreference.java

package de.almisoft.test;

import java.util.Arrays;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.TreeMap;

import de.almisoft.test.R;

import android.app.AlertDialog.Builder;

import android.content.Context;

import android.content.DialogInterface;

import android.content.res.TypedArray;

import android.database.Cursor;

import android.media.Ringtone;

import android.media.RingtoneManager;

import android.net.Uri;

import android.preference.DialogPreference;

import android.util.AttributeSet;

public class ExtraRingtonePreference extends DialogPreference {

private Context mContext;

private String mValue;

private Ringtone ringtone;

private int mRingtoneType;

private boolean mShowSilent;

private boolean mShowDefault;

private CharSequence[] mExtraRingtones;

private CharSequence[] mExtraRingtoneTitles;

public ExtraRingtonePreference(Context context, AttributeSet attrs) {

super(context, attrs);

mContext = context;

final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ExtraRingtonePreference, 0, 0);

mRingtoneType = a.getInt(R.styleable.ExtraRingtonePreference_ringtoneType, RingtoneManager.TYPE_RINGTONE);

mShowDefault = a.getBoolean(R.styleable.ExtraRingtonePreference_showDefault, true);

mShowSilent = a.getBoolean(R.styleable.ExtraRingtonePreference_showSilent, true);

mExtraRingtones = a.getTextArray(R.styleable.ExtraRingtonePreference_extraRingtones);

mExtraRingtoneTitles = a.getTextArray(R.styleable.ExtraRingtonePreference_extraRingtoneTitles);

a.recycle();

}

public ExtraRingtonePreference(Context context) {

this(context, null);

}

public String getValue() {

return mValue;

}

private Map getSounds(int type) {

RingtoneManager ringtoneManager = new RingtoneManager(mContext);

ringtoneManager.setType(type);

Cursor cursor = ringtoneManager.getCursor();

Map list = new TreeMap();

while (cursor.moveToNext()) {

String notificationTitle = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);

Uri notificationUri = ringtoneManager.getRingtoneUri(cursor.getPosition());

list.put(notificationTitle, notificationUri);

}

return list;

}

private Uri uriFromRaw(String name) {

int resId = mContext.getResources().getIdentifier(name, "raw", mContext.getPackageName());

return Uri.parse("android.resource://" + mContext.getPackageName() + "/" + resId);

}

private String getExtraRingtoneTitle(CharSequence name) {

if (mExtraRingtones != null && mExtraRingtoneTitles != null) {

int index = Arrays.asList(mExtraRingtones).indexOf(name);

return mExtraRingtoneTitles[index].toString();

}

return null;

}

@Override

public CharSequence getSummary() {

String ringtoneTitle = null;

if (mValue != null) {

if (mValue.length() == 0)

ringtoneTitle = mContext.getString(R.string.silent);

if (ringtoneTitle == null && mExtraRingtones != null && mExtraRingtoneTitles != null) {

for (int i = 0; i < mExtraRingtones.length; i++) {

Uri uriExtra = uriFromRaw(mExtraRingtones[i].toString());

if (uriExtra.equals(Uri.parse(mValue))) {

ringtoneTitle = mExtraRingtoneTitles[i].toString();

break;

}

}

}

if (ringtoneTitle == null) {

Ringtone ringtone = RingtoneManager.getRingtone(mContext, Uri.parse(mValue));

String title = ringtone.getTitle(mContext);

if (title != null && title.length() > 0)

ringtoneTitle = title;

}

}

CharSequence summary = super.getSummary();

if (ringtoneTitle != null) {

if (summary != null)

return String.format(summary.toString(), ringtoneTitle);

else

return ringtoneTitle;

} else return summary;

}

@Override

protected void onPrepareDialogBuilder(Builder builder) {

final Map sounds = new LinkedHashMap();

if (mExtraRingtones != null) {

for (CharSequence extraRingtone : mExtraRingtones) {

Uri uri = uriFromRaw(extraRingtone.toString());

String title = getExtraRingtoneTitle(extraRingtone);

sounds.put(title, uri);

}

}

if (mShowDefault) {

Uri uriDefault = RingtoneManager.getDefaultUri(mRingtoneType);

if (uriDefault != null) {

Ringtone ringtoneDefault = RingtoneManager.getRingtone(mContext, uriDefault);

if (ringtoneDefault != null) {

sounds.put(ringtoneDefault.getTitle(mContext), uriDefault);

}

}

}

if (mShowSilent)

sounds.put(mContext.getString(R.string.silent), Uri.parse(""));

sounds.putAll(getSounds(RingtoneManager.TYPE_NOTIFICATION));

final String[] titleArray = sounds.keySet().toArray(new String[0]);

final Uri[] uriArray = sounds.values().toArray(new Uri[0]);

int index = mValue != null ? Arrays.asList(uriArray).indexOf(Uri.parse(mValue)) : -1;

builder.setSingleChoiceItems(titleArray, index, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

if (ringtone != null)

ringtone.stop();

String title = titleArray[which];

Uri uri = uriArray[which];

if (uri != null) {

if (uri.toString().length() > 0) {

ringtone = RingtoneManager.getRingtone(mContext, uri);

ringtone.play();

}

mValue = uri.toString();

} else mValue = null;

}

});

builder.setPositiveButton(R.string.ok, this);

builder.setNegativeButton(R.string.cancel, this);

}

@Override

protected void onDialogClosed(boolean positiveResult) {

super.onDialogClosed(positiveResult);

if (ringtone != null)

ringtone.stop();

if (positiveResult && callChangeListener(mValue)) {

persistString(mValue);

notifyChanged();

}

}

@Override

protected Object onGetDefaultValue(TypedArray a, int index) {

return a.getString(index);

}

@Override

protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {

if (restoreValue)

mValue = getPersistedString("");

else {

if (mExtraRingtones != null && defaultValue != null && defaultValue.toString().length() > 0) {

int index = Arrays.asList(mExtraRingtones).indexOf((CharSequence) defaultValue);

if (index >= 0)

mValue = uriFromRaw(defaultValue.toString()).toString();

else mValue = (String) defaultValue;

} else mValue = (String) defaultValue;

persistString(mValue);

}

}

}

RES /值/ attrs.xml

RES /值/ strings.xml中

Silent

OK

Cancel

Ringtone

Ringtone: %s

deichkind_sone_musik

madonna_like_a_virgin

Sone Musik

Like A Virgin

RES /生

res

↳ raw

↳ deichkind_sone_musik.mp3

↳ madonna_like_a_virgin.mp3

RES / XML /的preferences.xml

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:auto="http://schemas.android.com/apk/res-auto">

android:key="ringtone"

android:title="@string/ringtoneTitle"

android:summary="@string/ringtoneSummary"

android:defaultValue="deichkind_sone_musik"

auto:ringtoneType="notification"

auto:showSilent="true"

auto:showDefault="true"

auto:extraRingtones="@array/extraRingtones"

auto:extraRingtoneTitles="@array/extraRingtoneTitles"/>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值