代码之家  ›  专栏  ›  技术社区  ›  Slim C.

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

  •  3
  • Slim C.  · 技术社区  · 10 年前

    我让我的应用程序从Raw文件夹中获取文件,并将该文件设置为 Ringtone . 但有一个问题,文件被创建并设置为铃声: http://prntscr.com/2so80e 但这个文件并没有任何声音,我猜我的设备默认会播放另一个铃声。 这是我的代码:

    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 回复  |  直到 10 年前
        1
  •  2
  •   Grimmy    10 年前

    看起来您应该先将文件复制到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
        }
    
    }