2009-08-13 4 views

답변

64

마지막으로 나는 기본 벨소리를 내가 다운로드 한 벨소리로 설정할 수있었습니다. 다운로드 코드는 기본 벨소리로 설정하는 데 필요한 것만 아래에 포함되어 있지 않습니다.

File k = new File(path, "mysong.mp3"); // path is a file to /sdcard/media/ringtone 

ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
values.put(MediaStore.MediaColumns.TITLE, "My Song title"); 
values.put(MediaStore.MediaColumns.SIZE, 215454); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
values.put(MediaStore.Audio.Media.ARTIST, "Madonna"); 
values.put(MediaStore.Audio.Media.DURATION, 230); 
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); 

//Insert it into the database 
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
Uri newUri = this.getContentResolver().insert(uri, values); 

RingtoneManager.setActualDefaultRingtoneUri(
    myActivity, 
    RingtoneManager.TYPE_RINGTONE, 
    newUri 
); 

어쨌든이 코드의 기능을 완전히 이해하지 못했습니다.

벨소리 관리자는 새 벨소리로 설정할 파일에 URI가 필요합니다. 그러나이 uri는 "/sdcard/media/ringtones/mysong.mp3"과 같은 sdcard에 직접있을 수 없습니다. 작동하지 않습니다! 당신이 필요로하는 무엇

는 그게 전부, 그래서 "/ 외부/오디오/미디어/46"

46은 미디어 스토어 MediaStore 데이터베이스에 컬럼의 ID입니다 같은 것을 할 수있는 파일의 외부 파일의 URI입니다 왜 sdcard 파일을 먼저 데이터베이스에 추가해야하는지.

어쨌든 mediastore는 어떻게 ID를 유지합니까? 이 숫자는이 작업을 여러 번 수행 할 때 실제로 높아질 수 있습니다.

이 행을 삭제해야합니까? 문제는 파일 브라우저를 사용하여 sdcard에서 직접 삭제할 수 있기 때문에 파일 삭제를 제어 할 수없는 경우도 있습니다.

+0

위 코드에서 미디어 콘텐츠 공급자와 상호 작용하면 매번 새로운 항목이 만들어집니다. 생성하고있는 URI를 추적하여 다시 다운로드하지 않아도되고 'RingtoneManager'로 건너 뛸 수 있습니다. –

+1

이 줄의'main'은 무엇입니까? Uri newUri = main.getContentResolver(). insert (uri, values); 제발 도와주세요 .. –

+0

'main' 대신'getApplicationContext()'를 사용했는데이 문제를 해결하는 데 사용할 수있는 것은 무엇입니까? –

3

내장 된 RingtonePreference 클래스를 사용할 수 있습니다. AndroidGuys는 here에 대한 유용한 자습서를 제공합니다.

+0

어를 시도해야하지만, RingtonePreference은 사용자가 * 응용 프로그램이 사용하는 *에 대한 벨소리 자산을 선택할 수 있습니다. 시스템 벨소리를 설정하지 않습니다. – CommonsWare

+1

좋아, 내가 놓칠 수도 있지만 참조가 명시 적으로 말하지 않습니다.앱이 걸려온 전화를 처리하지 않는 한 누군가가 그의 애플리케이션에서 벨소리를 어떻게 처리하는지 궁금합니다. – russoue

0

Android의 미디어 애플리케이션에서이 코드를 발견했습니다.

Settings.System.putString(resolver, 
Settings.System.RINGTONE, ringUri.toString()); 

2
public void setRingtone() { 
    String ringtoneuri = Environment.getExternalStorageDirectory().getAbsolutePath() + "/media/ringtone"; 
    File file1 = new File(ringtoneuri); 
    file1.mkdirs(); 
    File newSoundFile = new File(ringtoneuri, "myringtone.mp3"); 


    Uri mUri = Uri.parse("android.resource://globalapps.funnyringtones/raw/sound_two.mp3"); 


    ContentResolver mCr = this.getContentResolver(); 
    AssetFileDescriptor soundFile; 
    try { 
    soundFile = mCr.openAssetFileDescriptor(mUri, "r"); 
    } catch (FileNotFoundException e) { 
    soundFile = null; 
    } 

    try { 
    byte[] readData = new byte[1024]; 
    FileInputStream fis = soundFile.createInputStream(); 
    FileOutputStream fos = new FileOutputStream(newSoundFile); 
    int i = fis.read(readData); 

    while (i != -1) { 
    fos.write(readData, 0, i); 
    i = fis.read(readData); 
    } 

    fos.close(); 
    } catch (IOException io) { 
    } 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, newSoundFile.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "my ringtone"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
    values.put(MediaStore.MediaColumns.SIZE, newSoundFile.length()); 
    values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
    values.put(MediaStore.Audio.Media.IS_ALARM, true); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath()); 
    Uri newUri = mCr.insert(uri, values); 
    try { 
    Uri rUri = RingtoneManager.getValidRingtoneUri(this); 
    if (rUri != null) 
    ringtoneManager.setStopPreviousRingtone(true); 
    RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE, newUri); 
    Toast.makeText(this, "New Rigntone set", Toast.LENGTH_SHORT).show(); 
    } catch (Throwable t) { 
    Log.e("sanjay in catch", "catch exception"+e.getMessage()); 
    } 

} 
+0

이것은 모든 벨소리를 넣은 Raw 폴더에서 벨소리를 설정하는 데 도움이됩니다. 나 또한 –

+0

soundFile = mCr.openAssetFileDescriptor (mUri, "r"); 이 라인을 작성한 이유는 무엇입니까? –

+0

여기에 globalapps 란 무엇입니까? – AndroidHacker

0

이것은 내가 사용한 코드입니다! 나는 그것이 도움이되기를 바랍니다.
이것은 link입니다.

String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
String path=(exStoragePath +"/media/alarms/"); 

saveas(RingtoneManager.TYPE_RINGTONE); 

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,  Uri.parse("file://"+path+filename+".mp3" 
    + Environment.getExternalStorageDirectory()))); 


File k = new File(path, filename); 

ContentValues values = new ContentValues(4); 
long current = System.currentTimeMillis(); 
values.put(MediaStore.MediaColumns.DATA, path + filename ); 
values.put(MediaStore.MediaColumns.TITLE, filename); 
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current/1000)); 
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); 

//new 
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, true); 
values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    // Insert it into the database 
this.getContentResolver() 
    .insert(MediaStore.Audio.Media.getContentUriForPath(k 
.getAbsolutePath()), values); 

해피 코딩!

0

스택 오버플로에 대한 충분한 평판이 없기 때문에 솔루션에 대한 의견을 말할 수 없습니다. 데이터베이스에 직접 액세스하지 않고 미디어 파일에 오디오 파일을 추가하여 중복을 피하는 방법을 추가하고 싶습니다. VIDAR으로

String[] files = { audioFullPath }; 
    MediaScannerConnection.scanFile(
     getApplicationContext(), 
     files, 
     null, 
     new OnScanCompletedListener() { 
      @Override 
      public void onScanCompleted(String path, Uri uri) { 
       Log.v("myapp", "file " + path + " was scanned seccessfully: " + uri); 
      } 
     } 
    ); 
0

대답이 너무 깁니다과 중복 된 항목이 노래를 벨소리로 설정할 때마다 추가 : 이 솔루션은 MediaScannerConnection을 기반으로, 이것은 내가 사용하는 코드입니다. 대신 당신은 소리 아웃에 대한 감사를이

Uri newUri=Uri.parse("content://media/external/audio/media/"+ID); 
try { 
     RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri); 
    } 
catch (Throwable t) { 


        }