zoukankan      html  css  js  c++  java
  • 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" />

  • 相关阅读:
    Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)
    5分钟用Spring4 搭建一个REST WebService(转)
    一本好看的书————《反欺骗的艺术——世界传奇黑客的经历分享》
    国内外从事CV相关的企业
    定积分解法
    c++中&amp;和&amp;&amp;有什么差别
    树莓派相关-树莓派串口配置方法
    Linux下df与du两个命令的差别?
    veridata实验举例(2)验证表BONUS与表SALGRADE两节点同步情况
    Java替代C语言的可能性
  • 原文地址:https://www.cnblogs.com/tanlon/p/2004085.html
Copyright © 2011-2022 走看看