17

我已将文件保存在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正确?

4

3 回答 3

36

音频仅设置为铃声一次,但此问题的解决方案是 - 如果您尝试再次运行相同的代码,您将在 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);
于 2011-01-06T07:34:42.723 回答
3

您可以重用它,而不是删除之前插入的 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);
于 2014-12-04T08:15:42.757 回答
1
RingtoneManager.setActualDefaultRingtoneUri(
Context,
RingtoneManager.TYPE_RINGTONE,
Uri
.parse("Media file uri"));

我认为这将解决您的问题。

于 2011-01-05T14:07:50.533 回答