问题
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