Android 設置鈴聲
在網上找了很多關於鈴聲設置的,不曉得怎麼回事就是沒測試通過,後來換了另外一種方式解決了。回過頭來看了一下原理是一樣的,於是就把兩者合並到了一起。
原理:首先根據傳進來的絕對路徑來查詢傳進來路徑的歌曲是否存在,如果存在則得到id和uri,通過
ContentUris.withAppendedId(uri,id),將uri和id拼接成一個新的Uri,然後將新的uri設置成想要的鈴聲即可。
最主要的代碼:RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, newUri);
第一個參數表示上下文、第二個參數表示設置的鈴聲狀態,第三個表示當前的歌曲uri。
如果傳進來的歌曲路徑不存在,則直接調用系統的插入數據方法,得到一個返回的uri,這裏得到的uri是不帶id參數的,不曉得為什麼,這樣設置鈴
聲是不成功的。我想到的笨方法是,在插入數據之後應該立即發送廣播讓系統掃描媒體數據,然後來查詢得到新的uri,然後再來設置。不曉得哪位大牛有什麼好
的方法能夠借鑒一下。
private void settingRingertone(String path2) { // TODO Auto-generated method stub ContentValues cv = new ContentValues(); Uri newUri = null; Uri uri = MediaStore.Audio.Media.getContentUriForPath(path2); Cursor cursor = this.getContentResolver().query(uri, null, MediaStore.MediaColumns.DATA + "=?", new String[] { path2 },null); if (cursor.moveToFirst() && cursor.getCount() > 0) { String _id = cursor.getString(0); cv.put(MediaStore.Audio.Media.IS_RINGTONE, true);//設置來電鈴聲為true cv.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);//設置通知鈴聲為false cv.put(MediaStore.Audio.Media.IS_ALARM, false);//設置鬧鐘鈴聲為false cv.put(MediaStore.Audio.Media.IS_MUSIC, false); // 把需要設為鈴聲的歌曲更新鈴聲庫 getContentResolver().update(uri, cv, MediaStore.MediaColumns.DATA + "=?",new String[] { path2 }); newUri = ContentUris.withAppendedId(uri, Long.valueOf(_id)); //來電鈴聲則為: RingtoneManager.TYPE_RINGTONE、通知鈴聲為:RingtoneManager.TYPE_NOTIFICATION、 //鬧鐘鈴聲為:RingtoneManager.TYPE_ALARM、所有鈴聲為:RingtoneManager.TYPE_ALL RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, newUri); Ringtone rt = RingtoneManager.getRingtone(this, newUri); rt.play(); }else{ //insert 這裏還有一點問題,故沒有寫上來 cv.put(AudioColumns.DATA,path2); newUri = TestRingtone.this.getContentResolver().insert(uri, cv); } }
這是之前在網上搜索的普遍方法,按照這個方法得到的uri是不帶id參數的。只是將傳入的文件添加到系統的媒體數據庫中。
public void setMyRingtone(File file) { ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, file.getName()); // values.put(MediaStore.MediaColumns.SIZE, file.length()); 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); Uri uri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); Uri newUri = this.getContentResolver().insert(uri, values); RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, newUri); }
另外一種方法是調用系統的設置鈴聲的方法。如果不加自定義鈴聲的方法則調用的是系統默認的鈴聲設置。若添加了上面自定義鈴聲的代碼則會將傳進來的鈴聲添加到鈴聲設置列表中供你選擇。
package com.test; import java.io.File; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; public class RingtoneManager extends Activity { private Button btn1 = null; private Button btn2 = null; private Button btn3 = null; private static final int Ringtone = 0; private static final int Alarm = 1; private static final int Notification = 2; private static final String FileRingtone = Environment.getExternalStorageDirectory()+ "/music/ringtones"; private static final String FileAlarm = Environment.getExternalStorageDirectory()+ "/music/alarms"; private static final String FileNotification = Environment.getExternalStorageDirectory()+ "/music/notifications"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn1 = (Button) this.findViewById(R.id.Button01); btn2 = (Button) this.findViewById(R.id.Button02); btn3 = (Button) this.findViewById(R.id.Button03); final File file=new File("/sdcard/後來.mp3"); btn1.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub if (isFile(FileRingtone)) { //這裏放子定義鈴聲的代碼 ....... // 打開系統鈴聲設置 Intent intent = new Intent(android.media.RingtoneManager.ACTION_RINGTONE_PICKER); // 設置類型為來電 intent.putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_TYPE,android.media.RingtoneManager.TYPE_RINGTONE); // 設置顯示的標題 intent.putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_TITLE,"設置來電鈴聲"); startActivityForResult(intent, Ringtone); } } }); btn2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub if (isFile(FileAlarm)) { //這裏放自定義鈴聲代碼 ... Intent intent = new Intent(android.media.RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_TYPE, android.media.RingtoneManager.TYPE_ALARM); intent.putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_TITLE,"設置鬧鐘鈴聲"); startActivityForResult(intent, Alarm); } } }); btn3.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub if (isFile(FileNotification)) { //這裏放自定義鈴聲代碼 ..... Intent intent = new Intent(android.media.RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_TYPE,android.media.RingtoneManager.TYPE_NOTIFICATION); intent.putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_TITLE,"設置通知鈴聲"); startActivityForResult(intent, Notification); } } }); } /** * 設置鈴聲之後的回調函數 */ protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) { return; } else { // 得到我們選擇的鈴聲 // Uri uri= // MediaStore.Audio.Media.getContentUriForPath("/sdcard/yoyomusic/後來.mp3"); Uri uri = data.getParcelableExtra(android.media.RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (uri != null) { switch (requestCode) { case Ringtone: android.media.RingtoneManager.setActualDefaultRingtoneUri(this, android.media.RingtoneManager.TYPE_RINGTONE,uri); break; case Alarm: android.media.RingtoneManager.setActualDefaultRingtoneUri(this, android.media.RingtoneManager.TYPE_ALARM,uri); Toast.makeText(this, "設置鈴聲成功!", Toast.LENGTH_SHORT).show(); break; case Notification: android.media.RingtoneManager.setActualDefaultRingtoneUri(this, android.media.RingtoneManager.TYPE_NOTIFICATION,uri); break; default: break; } } } } /** * 判斷文件是否存在,不存在則創建. * * @param path * @return */ private boolean isFile(String path) { boolean b = false; File f = new File(path); if (f.exists()) { b = true; } else { if (f.mkdirs()) { b = true; } else { b = false; } } return b; } }
最後需要添加修改系統設置的權限:
<uses-permission android:name=』android.permission.WRITE_SETTINGS』 />