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" />

1
0
(请您对文章做出评价)
« 博主前一篇: android使用JSON进行网络数据交换(服务端、客户端)的实现
» 博主后一篇: 关于ActivityGroup使用过程中遇到的一点问题
Add your comment

1 条回复

2096146
#1楼 lunathefinal      2011-05-13 16:41

ContentValues values =new ContentValues();
// Uri rawContactUri = this.getContentResolver().insert(RawContacts.CONTENT_URI, values);
//
// long rawContactId = ContentUris.parseId(rawContactUri);

Uri rawContactUri = Uri.parse("content://com.android.contacts/raw_contacts/2");

// String ringtoneUri = content://media/external/audio/media/60;
String ringtoneUri = "content://media/external/audio/media/2";
values.clear();
values.put(Contacts.CUSTOM_RINGTONE,ringtoneUri);
// values.put(ContactsContract.Contacts.CUSTOM_RINGTONE,ringtoneUri);

this.getContentResolver().update(rawContactUri, values, null, null);


给一个联系设置铃声 . 代码执行成功. 但是呼叫的时候. 还是用系统的默认铃声
  回复  引用  查看  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值