set as default ringtone from raw folder programmatically in android

三世轮回 提交于 2019-12-24 16:42:50

问题


I tried this code its working fine to load the sound file to ringtones directory.I can manually select the sound from popup ..but its fail to set as default ringtone programmatically.plz help me to set the sound as default ringtone programmatically

        setContentView(R.layout.activity_main);
      String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
     path=(exStoragePath +"/media/alarms/");
            // saveas();
        saveas(RingtoneManager.TYPE_RINGTONE);

    }

    // In this method, we need to copy the mp3 file to the sd card location from
    // where android picks up ringtone files
    // After copying, we make the mp3 as current ringtone
public boolean saveas(int type) {
enter code here
    byte[] buffer = null;
    InputStream fIn = getBaseContext().getResources().openRawResource(
            R.raw.sound);
    int size = 0;

    try {
        size = fIn.available();
        buffer = new byte[size];
        fIn.read(buffer);
        fIn.close();
    } catch (IOException e) {
        return false;
    }


    String filename = "sound";

    boolean exists = (new File(path)).exists();
    if (!exists) {
        new File(path).mkdirs();
    }

    FileOutputStream save;
    try {
        save = new FileOutputStream(path + filename);
        save.write(buffer);
        save.flush();
        save.close();
    } catch (FileNotFoundException e) {
        return false;
    } catch (IOException e) {

        return false;

    }

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + path + filename + ".mp3"
            + Environment.getExternalStorageDirectory())));
enter code here
    File k = new File(path, filename);

    ContentValues values = new ContentValues();
    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/mp3");

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

RingtoneManager.getRingtone(context,this.getContentResolver()
    .insert(MediaStore.Audio.Media.getContentUriForPath(k
            .getAbsolutePath()), values));



    return true;

}

回答1:


Remove this code RingtoneManager.getRingtone(context,this.getContentResolver() .insert(MediaStore.Audio.Media.getContentUriForPath(k .getAbsolutePath()), values));

and put these lines code before return true and its work

 Uri newUri = this.getContentResolver()
            .insert(MediaStore.Audio.Media.getContentUriForPath(k
                    .getAbsolutePath()), values);
    RingtoneManager.setActualDefaultRingtoneUri(MainActivity.this, RingtoneManager.TYPE_RINGTONE, newUri);



回答2:


 try {
                Uri notification = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.phone_funny_bell);
                Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
                r.play();

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        r.stop();
                    }
                }, 3000);
            } catch (Exception e) {
                e.printStackTrace();
            }

Use this one. This will work.

place above code on MyFirebaseMessagingService inside this onMessageReceived



来源:https://stackoverflow.com/questions/34764394/set-as-default-ringtone-from-raw-folder-programmatically-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!