Come impostare la suoneria in Android dalla mia attività?

Sto cercando di trovare un modo per impostare una nuova suoneria predefinita per codice dall'attività Android.

Ho già scaricato la suoneria in un bytearrays .

  • Incollare errori nell'applicazione Android con classi personalizzate personalizzabili
  • Strumento Android Sdk Revision 22?
  • come passare attraverso mms: //
  • Impostazioni Android ProGuard per Facebook
  • Utilizzo di certificati client / server per socket SSL di authentication a due vie su Android
  • Non hai trovato la class sul path: dexpathlist
  • Quale file devo aggiungere a SVN ignorare in un progetto che utilizza Android Studio
  • Connessione Android WiFi programmaticamente
  • Spingere il branch repo allo specchio locale AOSP
  • Come comprimere Bitmap come JPEG con la minore perdita di qualità su Android?
  • Come eliminare le cartelle da SDCard durante la disinstallazione della mia applicazione in android?
  • Come posso disegnare un cerchio di destinazione statico su Google Maps?
  • 7 Solutions collect form web for “Come impostare la suoneria in Android dalla mia attività?”

    Infine, sono riuscito a impostare la suoneria di default a quella che ho scaricato. Il codice di download non è incluso di seguito, solo quello che era necessario per impostarlo come suoneria predefinita.

     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 ); 

    Comunque, non capisco completamente che cosa fa questo codice.

    Il gestore Ringtone richiede un uri al file che deve essere impostato come nuova suoneria. Ma questo uri non può essere direttamente sulla sdcard come "/sdcard/media/ringtones/mysong.mp3". Questo non funziona!

    Ciò di cui hai bisogno è il file esterno del file che potrebbe essere qualcosa di simile a "/ external / audio / media / 46"

    Il 46 è l'id della colonna nel database MediaStore, per cui è necessario aggiungere il file sdcard nel database innanzitutto.

    Comunque, come il mediastore mantiene i suoi id? Questo numero può get davvero elevato, come si fa questa operazione molte volte.

    Devo eliminare questa row la mia auto? Il problema è che alcune volte non controllo nemless l'eliminazione del file poiché può essere eliminato direttamente dalla sdcard con un file browser.

    È ansible utilizzare la class RingtonePreference incorporata. AndroidGuys ha un bel tutorial su questo qui .

     public void setRingtone() { String 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.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, 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()); } } 

    Ho trovato questo codice dall'applicazione Media da Android.

     Settings.System.putString(resolver, Settings.System.RINGTONE, ringUri.toString()); 

    questo funziona dalla mia.

    Questo è il codice che ho usato! spero possa essere d'aiuto..
    Questo è anche il link .

      String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); String 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); 

    CODICE FELICE!

    Non posso commentare la soluzione perché non ho abbastanza reputazione in overflow dello stack … voglio solo aggiungere un modo per aggiungere il file audio nel database dei media senza accedere direttamente al database e quindi evitare di get duplicati. La soluzione è basata su MediaScannerConnection, questo è il codice che ho usato:

      String[] files = { audioFullPath }; MediaScannerConnection.scanFile( getApplicationContext(), files, null, new OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { Log.v("myapp", "file " + path + " was scanned seccessfully: " + uri); } } ); 

    Answer By Vidar è troppo lungo e aggiunge le voci duplicate each volta che si desidera impostare una song come suoneria. Invece dovresti provare questo

     Uri newUri=Uri.parse("content://media/external/audio/media/"+ID); try { RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri); } catch (Throwable t) { } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.