6

私は次の好みを持っています:

<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>

ユーザーがこの設定を変更すると、手動で Uri をデータベースに保存します。

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

    // save it to a db
    ...

    return true;
}

私の問題は、ユーザーが閉じてからに戻ったときPreferenceScreen、のデフォルト値RingtonePreferenceが常にあること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プリファレンスは複数のアイテムに使用され、インテントに渡された追加データに応じて DB から取得したデータが変更されるため、作成できません。

それでも、デフォルト値を設定したくはありませんが、データベースから取得した現在の値を設定します。これは回避策かもしれないと考えました。ですから、他の方法でも構いません。

DBからの保存と取得が機能していることを再確認したので、それは問題ではありません。

RingtonePreferenceコードから値を設定するにはどうすればよいですか?


編集:ここで私がやりたいことを少し説明します。別の方法があるかもしれません。

ユーザーが着信音を選択できるメニューエントリがいくつかあります (カウントはユーザーごとに異なります)。着信音の選択は上記の xml で機能し、メニュー エントリの ID が とともに に渡されIntentますPreferenceActivity。次に、着信音の URI がデータベースに保存されます。

エントリの 1 つが変更されると、ユーザーが行った着信音の選択に従ってアラームが再生されます。それで、彼はどちらが変わったかを知っています。今のところ問題ありません。

問題は、ユーザーが既に定義したエントリの着信音を変更したい場合です。ユーザーが以前に着信音 Foo を選択した場合、 をクリックするRingtonePreferenceと、着信音 Foo が事前に選択されているはずです。これは重大なエラーではありません (グリッチのようなものです) が、それでも非常に厄介です。

私の知る限り、RingtonePreferenceコードからデフォルトを事前に選択する方法はありませんか? それとも「ただ間違っている」のですか?


編集 2: わかりました、これを行う方法はないと思います。非常に奇妙な、アンドロイドコア。a を使用してPreference値を取得することはできますが、値を戻すことはできません。本当に急いでいたに違いありません。コードからのチェックを許可してくれてうれしいCheckBoxPreferenceです...

4

3 に答える 3

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

これがあなたに役立つかどうかはわかりませんが、他の誰かに役立つことを願っています. ところで、私はこの回避策を見つけてびっくりします

于 2011-10-04T08:31:09.567 に答える
-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); 
于 2011-05-19T17:10:52.853 に答える