2014-02-15 75 views
3

我讓我的應用程序從原始文件夾中獲取文件並將該文件設置爲Ringtone。 但有一個問題,該文件被創建並設置爲鈴聲:http://prntscr.com/2so80e 但文件沒有任何聲音,和IDK爲什麼我默認猜測我的設備正在播放另一個鈴聲。 這是我的代碼:創建文件的鈴聲沒有任何聲音

case 64:   
    String path = "android.resource://" + getPackageName() + "/"+R.raw.fusrodah; 
    File k= new File(path); 
    Log.i("OUTPUT", path); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k .getPath()); 
    values.put(MediaStore.MediaColumns.TITLE, "Fusrodah File"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg"); 
    values.put(MediaStore.Audio.Media.ARTIST, "Testing"); 
    values.put(MediaStore.MediaColumns.SIZE, 215454); 
    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()); 
    getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); 
    Uri newUri = getContentResolver().insert(uri, values); 

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

    break; 

我在做什麼錯? 有什麼,我失蹤? 我擁有所有權限,文件已創建但沒有任何聲音。

回答

2

它看起來應該先將您的文件複製到SD卡,然後將此副本用作鈴聲。在這裏完整的代碼示例(我在我的資產中有文件「kalimba.mp3」):

private int size; 

private static final int BUFFER_LEN = 1024; 

private void copyFile(AssetManager assetManager, String fileName, File out) throws FileNotFoundException, IOException { 
    size = 0; 
    FileOutputStream fos = new FileOutputStream(out); 
    InputStream is = assetManager.open(fileName);  
    int read = 0; 
    byte[] buffer = new byte[BUFFER_LEN]; 
    while ((read = is.read(buffer, 0, BUFFER_LEN)) >= 0) { 
      fos.write(buffer, 0, read); 
      size += read; 
     } 
    fos.flush();  
    fos.close(); 
    is.close(); 
} 

@Override 
public void onClick(View arg0) {   
    AssetManager assetManager = getAssets(); 

    File file = new File(Environment.getExternalStorageDirectory(), 
      "/myRingtonFolder/Audio/"); 
    if (!file.exists()) { 
     file.mkdirs(); 
    } 

    String path = Environment.getExternalStorageDirectory() 
      .getAbsolutePath() + "/myRingtonFolder/Audio/"; 

    File out = new File(path + "/", "kalimba.mp3");  
    if(!out.exists()){ 
     try { 
      copyFile(assetManager, "kalimba.mp3", out); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    }   

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, out.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "name"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
    values.put(MediaStore.MediaColumns.SIZE, out.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, true); 

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(out.getAbsolutePath()); 
    ContentResolver mCr = getContentResolver(); 
    Uri newUri = mCr.insert(uri, values); 

    try { 
     RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, newUri); 
     Settings.System.putString(mCr, Settings.System.RINGTONE, 
       newUri.toString()); 
    } 
    catch (Throwable t) 
    { 
     //TODO Handle exception 
    } 

} 
+0

我該怎麼做? –

+0

添加複製到我的答案的方法。希望它對你有用 – Grimmy

+0

太棒了!還有一個問題,我如何確定我的文件將保存在哪裏?所以我可以獲得路徑。 –