创建的铃声文件没有任何声音

时间:2014-02-15 13:07:55

标签: android android-file ringtone

我让我的应用程序从Raw文件夹中获取文件并将该文件设置为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;

我做错了什么? 有什么东西我错过了吗? 我拥有所有权限,文件已创建,但没有任何声音。

1 个答案:

答案 0 :(得分: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
    }

}