【问题标题】:setting audio file as Ringtone将音频文件设置为铃声
【发布时间】:2011-06-03 23:41:47
【问题描述】:

我在sdcard/media/audio/ringtones 文件夹中保存了文件。该文件将出现在来自settings/sound/phone Ringtone 的铃声选择列表中。

但我想将该文件设置为我的代码中的铃声。 这是我的代码。

  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

【问题讨论】:

  • 如果我将铃声放在原始文件夹中,我应该指定什么作为 PATH? :)

标签: android ringtone


【解决方案1】:
RingtoneManager.setActualDefaultRingtoneUri(
Context,
RingtoneManager.TYPE_RINGTONE,
Uri
.parse("Media file uri"));

我想这会解决你的问题。

【讨论】:

  • 我不认为你有这个问题。
【解决方案2】:

音频仅设置为铃声一次,但解决此问题的方法是 - 如果您尝试再次运行相同的代码,您将在 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);

【讨论】:

  • 天才!谢谢,我一直在寻找有关如何正确查询重复项的语法。
  • 谢谢哥们。那很棒。我找了好几个星期了,你知道是什么。 catch 块捕获此异常,但异常变量为空。我不知道这可能是这个问题。谢谢:D
  • -1 对于这个答案,因为它不起作用!缺少删除检查,所以这段围绕获取 Uri 并执行删除的代码是惰性代码!更正确的答案是获取媒体的 _ID 和这个 int nRowsDeleted = getContentResolver().delete(Uri.parse(MediaStore.Audio.Media.EXTERNAL_CONTENT_UR‌​I + "/" + _ID), null, null); if (nRowsDeleted > 0){ // 删除成功 }else{ // 删除失败 }
  • 忍不住注意到这个stackoverflow.com/questions/3029876/…的答案的相似之处......只是说:)
  • 两者的答案与我给出的答案相同,您给出的链接。
【解决方案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);

【讨论】:

  • 这是要“替换”之前的铃声吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多