установка аудиофайла в качестве мелодии звонка

У меня есть файл сохранения в папке sdcard/media/audio/ringtones. Этот файл появится в списке выбора мелодии звонка из settings/sound/phone Мелодия звонка.

Но я хочу установить этот файл в качестве мелодии звонка из моего кода. Вот мой код.

  File k = new File(path, filename);

  ContentValues values = new ContentValues();
  values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
  values.put(MediaStore.MediaColumns.TITLE, "TwiAppclip");
  values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
  values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");
  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);

  Uri uri = MediaStore.Audio.Media.getContentUriForPath(k
       .getAbsolutePath());
  Uri newUri = getApplicationContext().getContentResolver().insert(uri, values);

  RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(),
      RingtoneManager.TYPE_RINGTONE, newUri);

здесь uri я получаю Но я получил newUri = null. Я думаю, именно поэтому он не устанавливается в качестве мелодии звонка.

Кто-нибудь знает, где проблема? как мне получить newUri правильно?


person djk    schedule 05.01.2011    source источник
comment
если я помещаю свои рингтоны в необработанную папку, что я должен указать в качестве PATH? :)   -  person RLEE    schedule 22.05.2013


Ответы (3)


Звук устанавливается в качестве мелодии звонка только один раз, но решение этой проблемы: если вы попытаетесь снова запустить тот же код, вы будете вставлять повторяющуюся запись в таблицу MediaStore, но база данных SQLite не позволит вам. Вы должны либо переименовать свой файл и добавить еще один его экземпляр, либо войти, удалить запись, а затем повторить попытку. Поэтому я удалял эту запись каждый раз, а затем вставлял ее снова.

Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);
Uri newUri = getContentResolver().insert(uri, values);

RingtoneManager.setActualDefaultRingtoneUri(activity.this,
        RingtoneManager.TYPE_RINGTONE, newUri);
person djk    schedule 06.01.2011
comment
Гений! Спасибо, я искал синтаксис того, как правильно запросить дубликат. - person Nick; 26.03.2012
comment
Спасибо чувак. Это было здорово. Я искал это в течение нескольких недель, и вы знаете, что. Блок catch перехватывает это исключение, но переменная исключения имеет значение null. Я понятия не имел, что это может быть эта проблема. Спасибо - person drulabs; 03.05.2012
comment
-1 за этот ответ как то не работает! Отсутствие проверки на удаление, поэтому этот код, связанный с получением Uri и выполнением удаления, является ленивым кодом! Более правильным ответом было бы получение _ID носителя и этого int nRowsDeleted = getContentResolver().delete(Uri.parse(MediaStore.Audio.Media.EXTERNAL_CONTENT_UR‌​I + / + _ID), null, null); if (nRowsDeleted › 0){ // удаление сработало }else{ // удаление не удалось } - person t0mm13b; 19.06.2012
comment
Не мог не заметить сходство в ответе на этот stackoverflow.com/questions/3029876/... просто говорю :) - person t0mm13b; 19.06.2012
comment
оба ответа такие же, как я даю ответ, который вы даете ссылку. - person djk; 22.06.2012
comment
@djk не могли бы вы мне помочь? Я также получаю вставку uri как null только на определенном устройстве - person moDev; 03.06.2014
comment
дает мне ошибку android.permission.WRITE_SETTINGS отсутствует - person jairhumberto; 24.12.2019

Вместо того, чтобы удалять ранее вставленный uri, вы можете использовать его повторно:

    // check if file already exists in MediaStore
    String[] projection = {MediaStore.Audio.Media._ID};
    String selectionClause = MediaStore.Audio.Media.DATA + " = ? ";
    String[] selectionArgs = {ringtoneFile.getAbsolutePath()};
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selectionClause, selectionArgs, null);
    Uri insertedUri;
    if (cursor == null || cursor.getCount() < 1) {
        // not exist, insert into MediaStore
        ContentValues cv = new ContentValues();
        cv.put(MediaStore.Audio.Media.DATA, ringtoneFile.getAbsolutePath());
        cv.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName());
        insertedUri = context.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv);
    } else {
        // already exist
        cursor.moveToNext();
        long id = cursor.getLong(0);
        insertedUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
    }
    RingtoneManager.setActualDefaultRingtoneUri(context, type, insertedUri);
person Gen Liu    schedule 04.12.2014
comment
Это должно было заменить предыдущий рингтон? - person Jared Burrows; 24.05.2015

RingtoneManager.setActualDefaultRingtoneUri(
Context,
RingtoneManager.TYPE_RINGTONE,
Uri
.parse("Media file uri"));

Я думаю, это решит вашу проблему.

person surya    schedule 05.01.2011
comment
Я не думаю, что вы поняли вопрос. - person drulabs; 02.05.2012