2011-05-19 95 views
6

我以下偏好:如何从代码设置RingtonePreference值?

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <RingtonePreference 
    android:showDefault="true" 
    android:showSilent="true" 
    android:title="@string/feed_alert_ringtone" 
    android:ringtoneType="ringtone|notification|alarm|all" 
    android:key="alertringtone" 
    android:persistent="false"> 
    </RingtonePreference>  
</PreferenceScreen> 

当用户改变这种偏好,我手动开放的保存到数据库:

public boolean onPreferenceChange(Preference pref, Object change) { 
    String ringtone = change.toString(); 

    // save it to a db 
    ... 

    return true; 
} 

我的问题是,当用户关闭,然后得到回到PreferenceScreenRingtonePreference的默认值始终为Silence。当然,我必须手动设置值。

想这一个在我PreferenceActivity

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.settings); // the XML above 

    String database_ringtone = ... // get the string saved above from db 
            // and according to some parameters passed 
            // to the intent 

    Preference ringtone = findPreference("alertringtone"); 
    ringtone.setDefaultValue(database_ringtone); 

    // also tried: 
    ringtone.setDefaultValue(Uri.parse(database_ringtone)); 
} 

不幸的是偏爱停留在 “沉默”(意为空)。我想,当Preference不是persistent时,将使用默认值。

我不能使它persistent,因为首选项用于多个项目,我从数据库中获得的数据根据​​传递给该意图的一些额外数据而改变。

尽管如此,我不想设置默认值,但是我从数据库中获得的当前值。认为这可能是一个解决方法。所以任何其他方式也会很好。

双重检查保存和从数据库检索正在工作,所以这不是问题。

如何设置代码中的RingtonePreference值?


编辑:这里有一点解释我想做什么,也许还有另一种方法。

我有几个菜单条目(计数因用户而异),用户可以为其选择铃声。选择铃声适用于上述xml,菜单条目的ID将以Intent传递到PreferenceActivity。铃声的URI被存储在数据库中。

当其中一个条目发生变化时,会根据用户所做的铃声选择播放警报。所以他知道哪一个改变了。到目前为止没有问题。

问题是,当用户想要更改他已经为其定义的条目的铃声时。如果用户之前选择了铃声Foo,当点击RingtonePreference时,应该预先选择铃声Foo。这不是严重的错误(更像是一个小故障),但仍然非常烦人。

据我所知,没有办法预先从代码中选择默认RingtonePreference?还是我在做“只是错”?


编辑2:Okey,我认为没有办法做到这一点。非常奇怪的是,android核心。允许我们使用Preference并从中获取值,但不能将值重新输入。一定是真正的匆忙。我很高兴他们允许我们检查代码中的CheckBoxPreference ...

回答

-1

它看起来像是在将铃声插入数据库时​​不包括声音文件的路径,所以无论何时将铃声插入数据库你尝试从应用程序中设置。当你说你必须手动设置该值时,它看起来像是媒体/铃声的媒体扫描拾取的声音文件,并在该点插入到数据库中。下面的代码需要根据您的操作方式进行修改,但希望它能给您提供正确的想法。

尝试类似:

File k = new File(path2, filename); 
ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 

//kill database for this object before inserting 
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); 

Uri newUri = getContentResolver().insert(uri, values); 
+0

这不是我问的答案。选择铃声并将其存储到数据库中(也可以根据所做的选择播放声音,没有问题)。我只想让'RingtonePreference'反映我之前通过预先选择铃声的选择,当用户再次打开偏好时。我没有添加任何自定义铃声或特殊路径等。 – Markus 2011-05-19 19:09:25

6

我正在寻找如何设置默认值铃声,并实现了同样的事情,你,当首选项没有被设定为小于值是空的,无声被选为默认值。但我这样做

// I read my ringtone setting (I read the value from my ringtone_uri key) 
// then if it is not set I set the value with the default value from the phone 
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); 
Uri configuredUri = Uri.parse(sharedPrefs.getString("ringtone_uri", Settings.System.DEFAULT_RINGTONE_URI.toString())); 

// then I do this, I save the default ringtone to my settins 
if(configuredUri.equals(Settings.System.DEFAULT_RINGTONE_URI)){ 
    sharedPrefs.edit() 
      .putString("ringtone_uri", Settings.System.DEFAULT_RINGTONE_URI.toString()) 
      .commit(); 
} 

我不知道这是否会帮助你,但我希望它会帮助别人。顺便说一句我发现找到这种解决方法

+0

虽然我无法理解您的代码(为什么如果它已经被设置为默认值,那么为什么还要写回默认值?),代码片段显示了如何从代码写入RingtonePreference。用DB中的值替换DEFUALT_RINGTONE_URI,解决OP的问题。我不会称之为解决方法。 – Nilzor 2014-08-21 07:28:54

4

在2年后试图解决完全相同的问题时找到了这个,没有找到任何好的答案,所以我会发布我的解决方案。

与许多其他首选项不同,RingtonePreference似乎不会受到调用setDefaultValue()的影响。我尝试了同样的事情,无法让它在大部分其他首选项都可以正常工作的情况下工作。

我看了一下API,发现RingtonePreference用来存储和恢复状态的一系列回调。特别值得注意的是方法RingtonePreference.onRestoreState()

所以当铃声选择器打开时,它调用此方法来选择哪个铃声。 为了选择最初选择的铃声,您必须重写此方法并返回您想要选择的URI。

我的解决办法是如下

 //Create a Ringtone Preference 
     RingtonePreference ringtonePreference = new RingtonePreference(this){ 
      @Override 
      protected Uri onRestoreRingtone(){ 
       if(database_ringtone.equals("")){ 
        return null; 
       } 
       else{ 
        return Uri.parse(database_ringtone); 
       } 
      } 
     }; 

     ringtonePreference.setTitle(getString(R.string.pref_title_ringtone)); 
     ringtonePreference.setPersistent(false); 

     //Set the summary to the initial value 
     BasePreferenceChangeListener.updatePreference(ringtonePreference, agency.ringtone); 

     getPreferenceScreen().addPreference(ringtonePreference); 

我选择匿名覆盖的方法,然后手动插入偏好入PreferenceScreen。

您也可以创建RingtonePreference的子类来覆盖该方法,然后在XML中使用该子类而不是RingtonePreference。