有沒有一種方法可以使用沒有活動的鈴聲選擇器? 這是從我的案例DialogPreference。如何使用任何「不活動」(沒有活動)的鈴聲選擇器
由於DialogPreference不活動,有兩個問題在這裏:
- 沒有startActivityForResult
- 沒有onActivityResult方法。
我設法使用startActivityForResult將構造函數中的上下文轉換爲Activity,但是我找不到捕獲任何結果的方法。
作爲解決方法,我創建了自定義AlertDialog,其中使用了鈴聲管理器中的鈴聲「Cursor」設置了singleChoiceItems,但不包括「默認鈴聲」,所選鈴聲不播放音樂,而且與默認鈴聲選擇器「感覺不同」 。
總結 - 是否有任何方法從DialogPreference運行鈴聲選擇器,還是我需要創建整個自定義對話框?
編輯: 這是自定義鈴聲選擇器解決方案我想出了(問題仍然存在 - 如何使用默認的鈴聲選擇器?)。它也有一些缺點(特別是臨時路徑 - ?如何解決它),但可能是有用的人
// all this is inside some Dialog or other non Activity
Context mContext;
// that is the string I want to get from Ringtone picker
// something like content://media/internal/audio/media/60
// I can also get it stored version from somewhere else (preferences and such)
private String mRingtonePath = null;
// that is temp path I am using, because I can't find other way to store path
// received in setSingleChoiceItems onClickListener
private String mRingtoneTempPath = null;
void showRingtoneDialog() {
RingtoneManager rm = new RingtoneManager(mContext);
final Cursor ringtones = rm.getCursor();
final MediaPlayer mp = new MediaPlayer();
int selected = -1;
// moving to proper ringtone in case some path was already supplied
if (mRingtonePath != null)
for (ringtones.moveToFirst(); !ringtones.isAfterLast(); ringtones
.moveToNext()) {
selected++;
String path = ringtones
.getString(RingtoneManager.URI_COLUMN_INDEX)
+ "/"
+ ringtones.getInt(RingtoneManager.ID_COLUMN_INDEX);
if (path.equals(mRingtonePath)) {
break;
}
}
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle("TITLE");
builder.setSingleChoiceItems(ringtones, selected,
ringtones.getColumnName(RingtoneManager.TITLE_COLUMN_INDEX),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ringtones.moveToPosition(which);
String path = ringtones
.getString(RingtoneManager.URI_COLUMN_INDEX)
+ "/"
+ ringtones
.getInt(RingtoneManager.ID_COLUMN_INDEX);
// ugly solution to store temp path
setTempPathTo(path);
mp.reset();
try {
Uri uri = Uri.parse(path);
mp.setDataSource(mContext, uri);
mp.prepare();
mp.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mp.reset();
mp.release();
// I could read path nicely from here instead of using temp path,
// but ringtones Cursor somehow moves couple positions forward
// since last call to onClick in setSingleChoiceItems and
// String s = ringtones
// .getString(RingtoneManager.URI_COLUMN_INDEX)
// + "/"
// + ringtones.getInt(RingtoneManager.ID_COLUMN_INDEX);
mRingtonePath = mRingtoneTempPath;
}
});
builder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mp.reset();
mp.release();
}
});
AlertDialog alert = builder.create();
alert.show();
}
void setTempPathTo(String path) {
mRingtoneTempPath = path;
}
我仍然需要重寫onActivityResult方法 - 我不知道我該怎麼做,使用getApplicationContext – Koger 2012-02-28 14:12:14
你可以在基本活動中做到這一點。其他方式 - 使用startActivityForResult()和活動,而不是自定義對話框。 – piotrpo 2012-02-28 14:28:23
謝謝你對我的問題感興趣,但我知道我可以通過活動來做到這一點。 但是,情況並非如此,因爲我希望此DialogPreference能夠像其他DialogPreferences一樣進行查看和操作 - 即在選擇時打開對話框,即。 – Koger 2012-02-28 14:47:19