В вашем коде this
относится к окну или к чему-то, кроме вашего vue-component
. Затем вам нужно создать еще одну переменную, чтобы получить ссылку vue-component
.
let that = this
window.addEventListener("beforeunload", function(event) {
event.preventDefault();
// problem line
that.$store.dispatch('CURR_TERMINAL_ACTION', that.id)
})
Наконец, мне удалось установить в качестве мелодии звонка по умолчанию тот, который я скачал. Код загрузки не включен ниже, только то, что было необходимо для установки его в качестве мелодии звонка по умолчанию.
File k = new File(path, "mysong.mp3"); // path is a file to /sdcard/media/ringtone
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "My Song title");
values.put(MediaStore.MediaColumns.SIZE, 215454);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.Media.ARTIST, "Madonna");
values.put(MediaStore.Audio.Media.DURATION, 230);
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
//Insert it into the database
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
Uri newUri = this.getContentResolver().insert(uri, values);
RingtoneManager.setActualDefaultRingtoneUri(
myActivity,
RingtoneManager.TYPE_RINGTONE,
newUri
);
В любом случае, я не совсем понимаю, что делает этот код.
Диспетчеру мелодий звонка нужен uri для файла, который должен быть установить как новый рингтон. Но этот uri не может быть напрямую связан с sdcard, например "/sdcard/media/ringtones/mysong.mp3". Это не работает!
Вам нужен внешний URI файла, который может быть чем-то вроде "/ external / audio / media / 46"
46 - это идентификатор столбца в базе данных MediaStore, поэтому вам нужно сначала добавить файл sdcard в базу данных.
В любом случае, как mediastore поддерживает его идентификаторы? Это число может стать очень большим, если вы проделаете эту операцию много раз.
Мне нужно удалить эту строку самостоятельно? Проблема в том, что иногда я даже не контролирую удаление файла, так как его можно удалить прямо с SD-карты с помощью файлового браузера.
Вы можете использовать встроенный класс RingtonePreference . У AndroidGuys есть хорошее руководство по этому здесь .
Answer By Vidar слишком длинный и добавляет дубликаты каждый раз, когда вы хотите установить песню в качестве мелодии звонка. Вместо этого вы должны попробовать это
Uri newUri=Uri.parse("content://media/external/audio/media/"+ID);
try {
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri);
}
catch (Throwable t) {
}
Я нашел этот код в приложении Media из Android.
Settings.System.putString(resolver,
Settings.System.RINGTONE, ringUri.toString());
это работает от моего.
предоставить намерение для выбора мелодии звонка.
final Uri currentTone= RingtoneManager.getActualDefaultRingtoneUri(MainActivity.this, RingtoneManager.TYPE_ALARM);
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentTone);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
startActivityForResult(intent, 999);
затем поймать результат выбора в onActivityResult
.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 999 && resultCode == RESULT_OK){
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
txtView.setText("From :" + uri.getPath());
//Set selected ringtone here.
RingtoneManager.setActualDefaultRingtoneUri(
this,
RingtoneManager.TYPE_RINGTONE,
uri
);
}
}