2009-08-13 36 views

回答

64

最後,我設法默認鈴聲設置爲一個,我下載。 下載代碼不包含在下面,只需將其設置爲默認鈴聲即可。

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

無論如何,我不完全明白這段代碼在做什麼。

鈴聲經理需要一個URI給將被設置爲新的鈴聲文件。但是這個uri不能像「/sdcard/media/ringtones/mysong.mp3」那樣直接進入sdcard。這不行!

你需要的是這可能是像 「/外部/音頻/媒體/ 46」

的46是在MediaStore數據庫中的列的ID文件的外部文件的URI,因此多數民衆贊成爲什麼需要首先將sdcard文件添加到數據庫中。

總之,如何mediastore保持其IDS?這個數字可能會變得非常高,因爲您多次執行此操作。

我是否需要刪除此行我的自我?問題是有時候我甚至不控制文件的刪除,因爲它可以通過filebrowser直接從SD卡中刪除。

+0

在上面的代碼中與媒體內容提供商交互會每次創建一個新條目。您可能想跟蹤您生成的URI,因此可以避免重新下載,並直接跳到「RingtoneManager」。 – 2011-10-19 10:49:26

+1

什麼是'main'在這一行'Uri newUri = main.getContentResolver()。insert(uri,values);'我得到新的Uri爲null爲什麼我不不。請幫助我.. – 2014-05-19 12:18:30

+0

我用'getApplicationContext()'代替'main'是對的,還有什麼我可以用來解決這個問題.. – 2014-05-20 10:00:48

3

您可以使用內置的RingtonePreference類。 AndroidGuys在這個here上有一個很好的教程。

+0

嗯,謝謝你的呼喊,但是RingtonePreference允許用戶選擇*你*應用程序中使用鈴聲資源。它不設置系統鈴聲。 – CommonsWare 2009-08-14 01:27:21

+1

好了,可能是我錯過了,但引用不明確的告訴。我想知道除非應用程序正在處理來電,否則有人會在他的應用程序中使用鈴聲做什麼。 – russoue 2009-08-14 13:29:04

0

我從Android的媒體應用程序中找到了這段代碼。

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

這個作品形成我的。

2
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()); 
    } 

} 
+0

這將幫助您從原始文件夾,你已經把設置鈴聲所有ringtones.It工作正常進行我也 – 2015-01-12 06:35:26

+0

soundFile = mCr.openAssetFileDescriptor(mUri,「r」); 你能告訴我爲什麼你寫了這行。 – 2015-03-02 11:16:06

+0

這是什麼globalapps? – AndroidHacker 2015-08-09 14:27:01

0

這是我使用的代碼!我希望它有幫助..
這也是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); 

HAPPY CODING!

0

我不能評論的解決辦法,因爲我沒有對堆棧溢出足夠的聲譽......我想只是添加的方式來添加音頻文件到媒體數據庫,而不直接訪問到數據庫中,從而避免重複獲得。 該解決方案是基於MediaScannerConnection,這是我使用的代碼:

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

回答王廟過長,並將其添加要設置歌曲作爲鈴聲,每次重複的條目。相反,你應該試試這個

Uri newUri=Uri.parse("content://media/external/audio/media/"+ID); 
try { 
     RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri); 
    } 
catch (Throwable t) { 


        } 
相關問題