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_CONTENTI+“/”+_ID),null,null);如果(nRowsDeleted>0){//delete worked}否则{//delete failed}会情不自禁地注意到这个问题答案中的相似性。。。只是说:)这两个答案和我给出的答案是一样的,而你给出的是链接。我想你没有回答这个问题。如果我把我的铃声放在原始文件夹中,我应该指定什么作为路径?:)这是为了“替换”以前的铃声吗?