2012年2月25日

【Android】着信音を取得する

おはようございます。
最近はエラーコードの解説ばかり載せてたらアクセスが無い無い。

そんな訳で久々にコードを書きます。

今日はActivityからIntentを発行して着信音を取得します。
そしてそれをアプリ内で使おうって感じで。
Ear Alarmでも使ってますので、ダウンロードして使用感を確認して下さい。

ではコードへ

MainActivity.java

/**
 * @author dommy 
 * @version 1.0.0 written for blog.shonanshachu.com on 2012-02-25
 */
public class MainActivity extends Activity {
  private static final int REQUEST_CODE_RINGTONE = 1;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // 着信音の選択ボタンにOnClickListenerを付ける
    ((Button) findViewById(R.id.button)).setOnClickListener(onClickChangeRingtone);
  }
  /** 着信音の選択が終わった後に来る
   * EXTRA_RINGTONE_PICKED_URIでUriが取得出来るので、それを保存する
   */
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 戻り値が大丈夫
    if (requestCode == REQUEST_CODE_RINGTONE && resultCode == RESULT_OK) {
      // RingtoneのURI取得
      Uri uri = data
          .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
      // アプリ設定に着信音のINDEXを保存する
      SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE)
          .edit();
      RingtoneManager rm = new RingtoneManager(this);
      rm.setType(RingtoneManager.TYPE_ALARM);
      editor.putInt("ringtone_index", rm.getRingtonePosition(uri));
      editor.commit();
    }
  }
  /** 着信音のUriを取得するために別口で書いてあるメソッドです。
   *  着信音の設定はSharedPreferencesに
   *  ringtone_indexので保存てあります。
   *  (増えたらどうなるとか気にしない)
   *
   * @return Uri 着信音のUri
   */
  private Uri getRingtoneUri() {
    SharedPreferences prefs = getPreferences(MODE_PRIVATE);
    int ringtoneIndex = prefs.getInt("ringtone_index", -1);
    Uri uri = null;
    // 着信音の設定がない場合
    if (ringtoneIndex == -1) {
      // アラーム音の取得
      uri = RingtoneManager.getActualDefaultRingtoneUri(this,
          RingtoneManager.TYPE_ALARM);
      if (uri == null) {
        // アラーム音が無ければ通知音を使う
        uri = RingtoneManager.getActualDefaultRingtoneUri(this,
            RingtoneManager.TYPE_NOTIFICATION);
        if (uri == null) {
            // 通知音も無ければ着信音を使う
            uri = RingtoneManager.getActualDefaultRingtoneUri(this,
                RingtoneManager.TYPE_RINGTONE);
        }
      }
    }
    // 着信音の設定がある場合
    else {
      RingtoneManager rm = new RingtoneManager(this);
      rm.setType(RingtoneManager.TYPE_ALARM);
      uri = rm.getRingtoneUri(ringtoneIndex);
    }
    return uri;
  }

  /** 着信音変更ボタンが押された時の処理
   *  新しいIntentを発行して着信音選択Activityへ遷移する
   */
  private OnClickListener onClickChangeRingtone = new OnClickListener() {
    @Override
    public void onClick(View v) {
      Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
      intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,
          RingtoneManager.TYPE_ALARM);
      startActivityForResult(intent, REQUEST_CODE_RINGTONE);
    }
  };
}