Android 将音频文件设置为铃声

Android 将音频文件设置为铃声,android,ringtone,Android,Ringtone,我已将文件保存在sdcard/media/audio/ringtones文件夹中。该文件将出现在settings/sound/phoneringtone的铃声选择列表中 但我想从我的代码中将该文件设置为铃声。 这是我的密码 File k = new File(path, filename); ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, k.getAbsolu

我已将文件保存在
sdcard/media/audio/ringtone
s文件夹中。该文件将出现在
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
正确

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

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

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

您可以重用以前插入的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);
//检查文件是否已存在于MediaStore中
字符串[]投影={MediaStore.Audio.Media.\u ID};
字符串selectionClause=MediaStore.Audio.Media.DATA+“=?”;
字符串[]selectionArgs={ringtoneFile.getAbsolutePath()};
Cursor Cursor=context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI,投影,selectionClause,selectionAgs,null);
uriinserteduri;
if(cursor==null | | cursor.getCount()<1){
//不存在,插入到MediaStore
ContentValues cv=新的ContentValues();
cv.put(MediaStore.Audio.Media.DATA,ringtoneFile.getAbsolutePath());
cv.put(MediaStore.MediaColumns.TITLE,ringtoneFile.getName());
insertedUri=context.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI,cv);
}否则{
//已经存在
cursor.moveToNext();
long id=cursor.getLong(0);
insertedUri=ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI,id);
}
setActualDefaultRingtoneUri(上下文、类型、插入duri);

Genius!谢谢,我一直在搜索关于如何正确查询副本的语法。谢谢。那太好了。我已经找了好几个星期了,你知道吗。catch块捕获此异常,但异常变量为null。我不知道可能是这个问题。谢谢:D-1的回答,因为它不起作用!缺少对删除的检查,因此获取Uri并执行删除操作的代码是惰性代码!更正确的答案应该是获取媒体的_ID和这个int nRowsDeleted=getContentResolver().delete(Uri.parse(MediaStore.Audio.media.EXTERNAL_CONTENT‌​I+“/”+_ID),null,null);如果(nRowsDeleted>0){//delete worked}否则{//delete failed}会情不自禁地注意到这个问题答案中的相似性。。。只是说:)这两个答案和我给出的答案是一样的,而你给出的是链接。我想你没有回答这个问题。如果我把我的铃声放在原始文件夹中,我应该指定什么作为路径?:)这是为了“替换”以前的铃声吗?