2013-10-04 12 views
14

私は自分のユーザーが自分のアプリで通知の着信音を選ぶことを許可しています。私は、人間が読める音のタイトルと一緒に、サウンドのURIを保存したい。Androidで着メロの名前を取得するには?

これまでURIのコードは素晴らしい作品:

Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 

しかし、私はタイトルを取得し、ボタンのテキストとして設定しようとすると、私は何も得ることはありません。タイトルがないようですか?

String title = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_TITLE); 
button.setText(title); 

ただし、私のボタンのテキストは空です。私がしている場合:

button.setText(uri.toString()); 

私は完全に見ています。私はただURIからタイトルを取得しようとする必要がありますか?おかげ

答えて

35

は、これはそれを得る必要があります。

Ringtone ringtone = RingtoneManager.getRingtone(this, uri); 
String title = ringtone.getTitle(this); 

は、ドキュメントのためhttp://developer.android.com/reference/android/media/Ringtone.htmlを参照してください、しかし、ショートストーリー:Ringtone.getTitle(コンテキストctx);

+0

ありがとう。ドキュメントは常に私を得るようです。 – GuyLeStack

+4

ringtone.stop()を呼び出すと、リークします。 –

+0

+ Alexey Kuznetsovどういう意味ですか? – TheLibrarianCz

0

「MediaPlayerはリリースされずにファイナライズされました」という問題がありました。私はこれを使用します:

Cursor returnCursor = getContentResolver().query(uri, null, null, null, null); 
returnCursor.moveToFirst(); 
String title = returnCursor.getString(returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 
returnCursor.close(); 

詳細については、https://developer.android.com/training/secure-file-sharing/retrieve-info.htmlを参照してください。

1

私は受け入れられた答えを試してみると、個人的には重大なパフォーマンス上の問題がありました.30着メロのリストをロードするのに約2秒かかりました。私は少しそれを変更し、約10倍速く動作します:

uri = ringtoneMgr.getRingtoneUri(cursor.getPosition()); 
ContentResolver cr = getContext().getContentResolver(); 
String[] projection = {MediaStore.MediaColumns.TITLE}; 
String title; 
Cursor cur = cr.query(uri, projection, null, null, null); 
    if (cur != null) { 
     if (cur.moveToFirst()) { 
      title = cur.getString(0); 
      cur.close(); 
関連する問題