2012-08-05 4 views
4

음, 몇 가지 방법을 시도했지만 아직 작동하지 않습니다. 더 "올바른"방법은 (나는 생각한다), 나는 정말로 도움이 필요하다, Im는 미쳤다! :)설정 res/raw 폴더에서 mp3를 사용하여 벨소리를 설정합니다.

public void setRingtone(){ 
     String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     String fileName = nombreActual+".mp3"; 

     File newSoundFile = new File(baseDir, fileName); 
     Uri mUri = Uri.parse("android.resource://com.genaut.ringtonelists/raw/"+sonidoActual);//sonidoActual (sound name without .mp3) 
     ContentResolver mCr = 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, nombreActual); 
      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); 

      RingtoneManager.setActualDefaultRingtoneUri(Main.this, RingtoneManager.TYPE_RINGTONE, newUri); 

    Log.d("AbsolutePath: ", newSoundFile.getAbsolutePath()); 
    Log.d("DefaultUri: ", RingtoneManager.getActualDefaultRingtoneUri(Main.this, RingtoneManager.TYPE_RINGTONE).toString()); 
    } 

내가 매니페스트에이 권한이 있습니다

<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> 
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

나는 몇 가지 코드를 시도 몇 가지 단계 혼합 시도 (파일을 복사를하고, 라이브러리를 설정 ..)하지만 작품. 나는 정말로 이것에 붙어있다. 이 코드를 사용하여 (설정 - 장치 - 오디오 프로파일 - "프로파일 선택"- 음성 호출 벨소리)에 사운드를 추가 할 수 있지만 기본적으로 선택되어 있지 않으며 내가 선택한 경우 사운드를 재생하지 않습니다 :(

나는 SD에서 어떤 위치에 사운드 파일을 참조하십시오 해달라고하고, 로그는 다음과 같습니다

08-05 03:20:22.362: D/AbsolutePath:(6277): /mnt/sdcard/Ding Ding Dong.mp3 
08-05 03:20:22.364: D/DefaultUri:(6277): content://media/external/audio/media/15233 

이 예 : "땡 땡 Dong.mp3"파일 및 I 복사 다른 사람이다 크기가 0 인.

+0

그럼 작동 시키셨습니까? – Roylee

답변

2

시도하십시오.이 코드를 실행 해보십시오. 최선을 다하십시오.

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 = main.getContentResolver().insert(uri, values); 

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

코드 간의 유일한 차이점은 Duration 메타 데이터입니다. 이러한 문제는 없습니다. 제 문제는 mp3를 sd로 복사 할 때의 단계입니다. 정말 고마워요. :) 아직 작동하지 않습니다. – Genaut

+0

@ 정품 제가 경로를 어떻게 지정 하시겠습니까? – Roylee