Android 设置铃声

☆樱花仙子☆ 提交于 2019-12-22 15:20:07

在网上找了很多关于铃声设置的,不晓得怎么回事就是没测试通过,后来换了另外一种方式解决了。回过头来看了一下原理是一样的,于是就把两者合并到了一起。原理:首先根据传进来的绝对路径来查询传进来路径的歌曲是否存在,如果存在则得到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" />

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!