Android에서 사용 가능한 알림 소리 목록을 가져 오는 방법
Android 애플리케이션에서 알림을 만들고 있으며 알림에 사용할 소리를 설정하는 옵션을 내 환경 설정에 갖고 싶습니다. 설정 응용 프로그램에서 목록에서 기본 알림 소리를 선택할 수 있다는 것을 알고 있습니다. 그 목록의 출처는 어디이며 내 애플리케이션에 동일한 목록을 표시 할 수있는 방법이 있습니까?
원하는 작업을 수행하는 내 앱 중 하나에서 일부 코드를 복사 / 붙여 넣기 만하면됩니다.
이것은 "벨소리 설정"또는 이와 유사한 것으로 레이블이 지정된 버튼의 onClick 핸들러에 있습니다.
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null);
this.startActivityForResult(intent, 5);
그리고이 코드는 사용자가 선택한 사항을 캡처합니다.
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent)
{
if (resultCode == Activity.RESULT_OK && requestCode == 5)
{
Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (uri != null)
{
this.chosenRingtone = uri.toString();
}
else
{
this.chosenRingtone = null;
}
}
}
또한 사용자에게 Android Market에서 "Rings Extended"앱을 설치하도록 권장합니다. 그런 다음 내 앱이나 휴대 전화의 설정 메뉴와 같이 기기에서이 대화 상자를 열 때마다 사용자는 내장 된 벨소리뿐만 아니라 기기에 저장된 mp3를 선택할 수있는 추가 선택권이 있습니다.
또는 기본 설정 XML에 다음을 입력하십시오.
<RingtonePreference android:showDefault="true"
android:key="Audio" android:title="Alarm Noise"
android:ringtoneType="notification" />
컨텍스트를위한 샘플 XML의 전체 내용 :
<?xml version="1.0" encoding="UTF-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference android:title="Some value"
android:key="someval"
android:summary="Please provide some value" />
<EditTextPreference android:title="Some other value"
android:key="someval2"
android:summary="Please provide some other value" />
<RingtonePreference android:showDefault="true"
android:key="Audio" android:title="Alarm Noise"
android:ringtoneType="notification" />
</PreferenceScreen>
이것은 전화에서 사용 가능한 알림 소리 목록을 얻는 데 사용하는 방법입니다. :)
public Map<String, String> getNotifications() {
RingtoneManager manager = new RingtoneManager(this);
manager.setType(RingtoneManager.TYPE_NOTIFICATION);
Cursor cursor = manager.getCursor();
Map<String, String> list = new HashMap<>();
while (cursor.moveToNext()) {
String notificationTitle = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
String notificationUri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
list.put(notificationTitle, notificationUri);
}
return list;
}
편집 : NotificationCompat.Builder에서 사운드를 설정하는 방법에 대한 설명입니다. 이 방법은 대신 다른 방법이받은 사람이 읽을 수있는 TITLE 대신 전화가 사용하는 벨소리 ID를 가져옵니다. URI와 ID를 결합하면 벨소리 위치가 있습니다.
public ArrayList<String> getNotificationSounds() {
RingtoneManager manager = new RingtoneManager(this);
manager.setType(RingtoneManager.TYPE_NOTIFICATION);
Cursor cursor = manager.getCursor();
ArrayList<String> list = new ArrayList<>();
while (cursor.moveToNext()) {
String id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX);
String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
list.add(uri + "/" + id);
}
return list;
}
The above code will return a list of strings like "content://media/internal/audio/media/27".. you can then pass one of these strings as a Uri into the .setSound() like:
.setSound(Uri.parse("content://media/internal/audio/media/27"))
Hope that was clear enough :)
public void listRingtones() {
RingtoneManager manager = new RingtoneManager(this);
manager.setType(RingtoneManager.TYPE_NOTIFICATION);
// manager.setType(RingtoneManager.TYPE_RINGTONE);//For Get System Ringtone
Cursor cursor = manager.getCursor();
while (cursor.moveToNext()) {
String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
String uri = manager.getRingtoneUri(cursor.getPosition());
String ringtoneName= cursor.getString(cursor.getColumnIndex("title"));
Log.e("All Data", "getNotifications: "+ title+"-=---"+uri+"------"+ringtoneName);
// Do something with the title and the URI of ringtone
}
}
Here's another approach (in Kotlin), build from other answers in this question, that allows you to specify the name of the tone, and then play it:
fun playErrorTone(activity: Activity, context: Context, notificationName: String = "Betelgeuse") {
val notifications = getNotificationSounds(activity)
try {
val tone = notifications.getValue(notificationName)
val errorTone = RingtoneManager.getRingtone(context, Uri.parse(tone))
errorTone.play()
} catch (e: NoSuchElementException) {
try {
// If sound not found, default to first one in list
val errorTone = RingtoneManager.getRingtone(context, Uri.parse(notifications.values.first()))
errorTone.play()
} catch (e: NoSuchElementException) {
Timber.d("NO NOTIFICATION SOUNDS FOUND")
}
}
}
private fun getNotificationSounds(activity: Activity): HashMap<String, String> {
val manager = RingtoneManager(activity)
manager.setType(RingtoneManager.TYPE_NOTIFICATION)
val cursor = manager.cursor
val list = HashMap<String, String>()
while (cursor.moveToNext()) {
val id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX)
val uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX)
val title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX)
list.set(title, "$uri/$id")
}
return list
}
It can probably take some refactoring and optimization, but you should get the idea.
'Programing' 카테고리의 다른 글
C # 텍스트 상자에 포커스가있는 동안 Enter 키를 눌러 단추를 클릭하려면 어떻게합니까? (0) | 2020.11.23 |
---|---|
jQuery에서 목록을 선택하는 옵션을 추가하는 방법 (0) | 2020.11.23 |
최대 절전 모드 제한 및 / 또는 조합 (0) | 2020.11.23 |
반응 형 입력 필드 비활성화 (0) | 2020.11.23 |
드롭 다운 목록 .NET MVC에서 optgroup을 지원합니까? (0) | 2020.11.23 |