2011-01-05 5 views
16

sdcard/media/audio/ringtone 폴더에 저장 파일이 있습니다. 이 파일은 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을 올바르게 얻으려면 어떻게해야합니까?

+1

내가 원시 폴더에 내 벨소리를 넣어 경우, 내가 경로로 무엇을 지정해야합니까? :) – Roylee

답변

35

오디오는 벨소리로 한 번만 설정되지만이 문제에 대한 해결책은 다음과 같습니다. - 동일한 코드를 다시 실행하려고하면 MediaStore의 테이블에 중복 항목이 삽입되지만 SQLite 데이터베이스에서는 허용되지 않습니다. 당신. 파일의 이름을 바꾸고 다른 인스턴스를 추가하거나, 들어가서 항목을 제거한 다음 다시 시도해야합니다. 그래서 매번 그 항목을 제거한 다음 다시 삽입했습니다. 대신 이전에 삽입 된 URI를 삭제하는

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); 
+2

Genius! 고마워, 나는 중복에 대해 올바르게 쿼리하는 방법에 대한 구문을 계속 조사해 왔습니다. – Nick

+0

고마워요. 멋 졌어요. 나는 이것을 몇 주 동안 찾고 있었고 무엇을 알고 있습니다. catch 블록은이 예외를 캐치하지만 예외 변수는 null입니다. 나는이 문제가 될 수 있다는 단서가 없었다. 감사합니다 : D – drulabs

+1

-1이 답변으로 작동하지 않습니다! 삭제 확인이 없으므로이 코드를 둘러싼 Uri을 삭제하고 삭제하는 것은 게으른 코드입니다! 보다 정확한 대답은 미디어의 _ID 및 this int nRowsDeleted = getContentResolver(). delete (Uri.parse (MediaStore.Audio.Media.EXTERNAL_CONTENT_UR I + "/"+ _ID), null, null)를 얻는 것이 었습니다. if (nRowsDeleted> 0) {// 삭제됨} else {// 삭제 실패} – t0mm13b

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

나는 이것이 문제를 해결할 것이라고 생각한다.

+2

나는 당신이 질문을 가지고 있다고 생각하지 않는다. – drulabs

3

, 당신은 그것을 다시 사용할 수 있습니다 :

// 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); 
+0

이것은 이전 벨소리를 "대체"했습니까? –

관련 문제