J’essaie de trouver un moyen de définir une nouvelle sonnerie par défaut par code à partir de mon activité Android.
J’ai déjà téléchargé la sonnerie dans un bytearray
.
Enfin, j’ai réussi à définir la sonnerie par défaut sur celle que j’ai téléchargée. Le code de téléchargement n’est pas inclus ci-dessous, seulement ce qui était nécessaire pour le définir comme sonnerie par défaut.
File k = new File(path, "mysong.mp3"); // path is a file to /sdcard/media/ringtone ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, "My Song title"); values.put(MediaStore.MediaColumns.SIZE, 215454); values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); values.put(MediaStore.Audio.Media.ARTIST, "Madonna"); values.put(MediaStore.Audio.Media.DURATION, 230); 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); //Insert it into the database Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); Uri newUri = this.getContentResolver().insert(uri, values); RingtoneManager.setActualDefaultRingtoneUri( myActivity, RingtoneManager.TYPE_RINGTONE, newUri );
Quoi qu’il en soit, je ne comprends pas totalement ce que ce code fait.
Le gestionnaire de sonnerie a besoin d’un uri pour le fichier à définir comme nouvelle sonnerie. Mais cet uri ne peut pas être directement sur la carte SD comme “/sdcard/media/ringtones/mysong.mp3”. Cela ne fonctionne pas!
Ce dont vous avez besoin est le fichier externe uri du fichier qui pourrait être quelque chose comme “/ external / audio / media / 46”
Le 46 est l’ID de la colonne dans la firebase database MediaStore, c’est pourquoi vous devez d’abord append le fichier sdcard dans la firebase database.
Quoi qu’il en soit, comment mediastore maintient-il ses identifiants? Ce nombre peut être très élevé, car vous effectuez cette opération plusieurs fois.
Dois-je supprimer cette ligne moi-même? Le problème est que parfois, je ne contrôle même pas la suppression du fichier, car il peut être supprimé directement de la carte SD avec un navigateur de fichiers.
Vous pouvez utiliser la classe RingtonePreference intégrée. AndroidGuys a un bon tutoriel à ce sujet ici .
public void setRingtone() { Ssortingng ringtoneuri = Environment.getExternalStorageDirectory().getAbsolutePath() + "/media/ringtone"; File file1 = new File(ringtoneuri); file1.mkdirs(); File newSoundFile = new File(ringtoneuri, "myringtone.mp3"); Uri mUri = Uri.parse("android.resource://globalapps.funnyringtones/raw/sound_two.mp3"); ContentResolver mCr = this.getContentResolver(); AssetFileDescriptor soundFile; try { soundFile = mCr.openAssetFileDescriptor(mUri, "r"); } catch (FileNotFoundException e) { soundFile = null; } try { byte[] readData = new byte[1024]; FileInputStream fis = soundFile.createInputStream(); FileOutputStream fos = new FileOutputStream(newSoundFile); int i = fis.read(readData); while (i != -1) { fos.write(readData, 0, i); i = fis.read(readData); } fos.close(); } catch (IOException io) { } ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, newSoundFile.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, "my ringtone"); values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); values.put(MediaStore.MediaColumns.SIZE, newSoundFile.length()); values.put(MediaStore.Audio.Media.ARTIST, R.ssortingng.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, false); Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath()); Uri newUri = mCr.insert(uri, values); try { Uri rUri = RingtoneManager.getValidRingtoneUri(this); if (rUri != null) ringtoneManager.setStopPreviousRingtone(true); RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE, newUri); Toast.makeText(this, "New Rigntone set", Toast.LENGTH_SHORT).show(); } catch (Throwable t) { Log.e("sanjay in catch", "catch exception"+e.getMessage()); } }
Answer By Vidar est trop long et ajoute des entrées en double chaque fois que vous voulez définir une chanson comme sonnerie. Au lieu de cela, vous devriez essayer ceci
Uri newUri=Uri.parse("content://media/external/audio/media/"+ID); try { RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri); } catch (Throwable t) { }
J’ai trouvé ce code à partir de l’application Media d’Android.
Settings.System.putSsortingng(resolver, Settings.System.RINGTONE, ringUri.toSsortingng());
cela fonctionne mon.
C’est le code que j’ai utilisé! j’espère que ça aide ..
C’est aussi le lien .
Ssortingng exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); Ssortingng path=(exStoragePath +"/media/alarms/"); saveas(RingtoneManager.TYPE_RINGTONE); sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+path+filename+".mp3" + Environment.getExternalStorageDirectory()))); File k = new File(path, filename); ContentValues values = new ContentValues(4); 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/3gpp"); //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, true); values.put(MediaStore.Audio.Media.IS_MUSIC, false); // Insert it into the database this.getContentResolver() .insert(MediaStore.Audio.Media.getContentUriForPath(k .getAbsolutePath()), values);
HAPPY CODING!
Je ne peux pas commenter la solution parce que je n’ai pas assez de réputation en cas de débordement de stack … Je veux simplement append un moyen d’append le fichier audio à la firebase database multimédia sans accéder directement à la firebase database et éviter ainsi les doublons. La solution est basée sur MediaScannerConnection, c’est le code que j’ai utilisé:
Ssortingng[] files = { audioFullPath }; MediaScannerConnection.scanFile( getApplicationContext(), files, null, new OnScanCompletedListener() { @Override public void onScanCompleted(Ssortingng path, Uri uri) { Log.v("myapp", "file " + path + " was scanned seccessfully: " + uri); } } );
fournir l’intention pour la sélection de sonnerie.
final Uri currentTone= RingtoneManager.getActualDefaultRingtoneUri(MainActivity.this, RingtoneManager.TYPE_ALARM); Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone"); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentTone); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); startActivityForResult(intent, 999);
puis attrapez le résultat de la sélection dans onActivityResult
.
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == 999 && resultCode == RESULT_OK){ Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); txtView.setText("From :" + uri.getPath()); //Set selected ringtone here. RingtoneManager.setActualDefaultRingtoneUri( this, RingtoneManager.TYPE_RINGTONE, uri ); } }