2012-02-28 39 views
2

有沒有一種方法可以使用沒有活動的鈴聲選擇器? 這是從我的案例DialogPreference。如何使用任何「不活動」(沒有活動)的鈴聲選擇器

由於DialogPreference不活動,有兩個問題在這裏:

  1. 沒有startActivityForResult
  2. 沒有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; 
} 

回答

0

你需要這兩種方法都Context類的部分。只需將getApplicationContext傳遞到需要的地方即可。

+0

我仍然需要重寫onActivityResult方法 - 我不知道我該怎麼做,使用getApplicationContext – Koger 2012-02-28 14:12:14

+0

你可以在基本活動中做到這一點。其他方式 - 使用startActivityForResult()和活動,而不是自定義對話框。 – piotrpo 2012-02-28 14:28:23

+0

謝謝你對我的問題感興趣,但我知道我可以通過活動來做到這一點。 但是,情況並非如此,因爲我希望此DialogPreference能夠像其他DialogPreferences一樣進行查看和操作 - 即在選擇時打開對話框,即。 – Koger 2012-02-28 14:47:19

0

您可以使用RingtonePreference來獲取鈴聲而不使用自定義對話框。

例如,把這個在你的喜好

<RingtonePreference 
     android:key="ringtone" 
     android:title="Ringtone Preference" 
     android:showDefault="true" 
     android:showSilent="true" 
     android:summary="Pick a tone, any tone" 
    /> 

參考它通過

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
String s = prefs.getString("ringtone", "<unset>"); 

我也想說感謝您的代碼,我用了一個自定義鈴聲對話框我需要。