2013-06-27 6 views
3

В настоящее время я просто использую CheckBoxPreference для активации/деактивации звука. Звук воспроизводится из сырого ресурса.RingtonePreference with custom Ringtone from raw-resources

Теперь я хочу заменить этот CheckBoxPreference с помощью RingtonePreference, но мой пользовательский звук из моих ресурсов должен быть по умолчанию и выбираться из ringtonepreference.

Как я могу это сделать?

+0

См http://stackoverflow.com/a/31004356/909406 – almisoft

ответ

2

я написал Preference класса, который подходит к моим потребностям, здесь, возможно, это поможет другим народам:

public class SoundPreference extends ListPreference implements 
      PreferenceManager.OnActivityResultListener, OnPreferenceChangeListener { 

    private NotificationPrefs mAct; 

    public SoundPreference(NotificationPrefs act) { 
      super(act); 
      mAct = act; 
      setEntries(new String[] { "Silent", 
          "Custom", 
          "Picker" }); 
      setEntryValues(new String[] { "silent", "custom", "picker" }); 

      setOnPreferenceChangeListener(this); 
    } 

    @Override 
    public boolean onActivityResult(int requestCode, int resultCode, Intent data) { 
      if (data != null) { 
        Uri uri = data 
            .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 
        if (uri != null) { 
          persistString(uri.toString()); 
          return true; 
        } 
      } 
      return false; 
    } 

    @Override 
    public void setValue(String value) { 

      List<CharSequence> vals = new ArrayList<CharSequence>(
          Arrays.asList(getEntryValues())); 
      if (!vals.contains(value)) { 
        List<CharSequence> ents = new ArrayList<CharSequence>(
            Arrays.asList(getEntries())); 
        Ringtone r = RingtoneManager.getRingtone(getContext(), 
            Uri.parse(value)); 
        String name = r.getTitle(getContext()); 
        vals.add(value); 
        ents.add(name); 

        this.setEntries(ents.toArray(new CharSequence[ents.size()])); 
        this.setEntryValues(vals.toArray(new CharSequence[vals.size()])); 

      } 
      super.setValue(value); 
    } 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
      if ("picker".equals(newValue)) { 

        Intent i = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 
        i.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false); 
        i.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); 
        Intent chooserIntent = Intent.createChooser(i, getContext() 
            .getString(R.string.sound)); 
        mAct.startActivityForResult(chooserIntent, 0); 
        mAct.setActivityResultListener(this); 
        return false; 
      } 

      return true; 

    } 
}