Настройка уведомления о рингтоне из файла SD-карты

Моя цель - установить звук уведомления пользователей из файла, который хранится на SD-карте из приложения. Я использую этот код:

if(path != null){

    File k = new File(path, "moment.mp3");

    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, "Some Artist");
    values.put(MediaStore.Audio.Media.DURATION, 230);
    values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
    values.put(MediaStore.Audio.Media.IS_ALARM, false);
    values.put(MediaStore.Audio.Media.IS_MUSIC, false);
    values.put(MediaStore.MediaColumns.DISPLAY_NAME, "Some Name");

    //Insert it into the database
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
    Uri newUri = MainActivity.this.getContentResolver().insert(uri, values);

    RingtoneManager.setActualDefaultRingtoneUri(
      MainActivity.this,
      RingtoneManager.TYPE_NOTIFICATION,
      newUri
    );
    //RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION, newUri);
    Toast.makeText(this, "Notification Ringtone Set", Toast.LENGTH_SHORT).show();
}

Когда я запускаю это на устройстве, я продолжаю получать сообщение об ошибке:

06-12 15:19:36.741: ERROR/Database(2847): Error inserting is_alarm=false is_ringtone=false artist_id=35 is_music=false album_id=-1 title=My Song title duration=230 is_notification=true title_key=%D%\%%P%H%F%8%%R%<%R%B%4% mime_type=audio/mp3 date_added=1276370376 _display_name=moment.mp3 _size=215454 _data=/mnt/sdcard/Android/data/_MY APP PATH_/files/moment.mp3
06-12 15:19:36.741: ERROR/Database(2847): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

Я видел, как другие используют эту технику, и я не могу найти документацию о том, какие значения действительно необходимо передать, чтобы успешно добавить файл в систему Android, чтобы его можно было установить в качестве уведомления.


person sgarman    schedule 12.06.2010    source источник


Ответы (3)


Исправьте свой код следующим образом:

if(path != null){

File k = new File(path, "moment.mp3");

ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "My Song title");
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg");
values.put(MediaStore.Audio.Media.ARTIST, "Some Artist");
values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
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 = getContentResolver().insert(uri, values);

RingtoneManager.setActualDefaultRingtoneUri(
  MainActivity.this,
  RingtoneManager.TYPE_NOTIFICATION,
  newUri
);

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

person Weston    schedule 05.10.2010
comment
Большое спасибо за решение проблемы с двойниками. Конечно такое бывает когда пытаешься разобраться в коде и сообщение не очень понятно в чем проблема. Так что еще раз спасибо за спасение моего сна ;-) - person Stefan Hoth; 26.07.2011

Уэстон, вы правы после удаления базы данных формы ввода, и ее добавление поможет решить эту проблему.

Код для удаления записи

getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);

Uri newUri = getContentResolver().insert(uri, values);
person djk    schedule 06.01.2011
comment
Спасибо за строку "удалить". - person Stefan Hoth; 26.07.2011

Не забудьте поместить тег «uses-permission» в AndroidManifest.xml с атрибутом android:name, установленным на android.permission.WRITE_SETTINGS..

uses-permission android:name="android.permission.WRITE_SETTINGS" />
person Sam    schedule 09.11.2010