不知道大家知道不知道,Android手机设置铃音这个功能跟其他手机平台不太一样,其他平台设置的时候一般可以浏览本地铃音库或者曲库,然后选中即可设置。而Android中不行,它只有手机出厂时内置的几种铃音可选。这个我觉得做的不是很好,给用户的体验不高,不够人性化。一个用户如果想设置自己下载的铃音,现在一般有两种方法。
第一种:使用第三方软件设置,这种缺点就是每次设置时都需要打开这个软件。
第二种:比较死的方法,在sd卡里建立一个media的文件夹,再在这个文件夹里面建立名为audio的文件夹,最后再在audio文件夹里建立三个文件夹,分别是notifications(放置在这个文件夹里的铃声可以设置短信音)、ringtones(这个用于设置来电铃声)、ALARMS(这个用于设置闹铃声),把你不同用途的铃声放到不同的文件夹下手机就可以自动找到。
那么第三方软件是怎么实现设置的呢?先看一下效果:
设置之前:

设置之后:

代码实现起来也比较简单,里面有注释:
Activity:

package org.sunchao;import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class RingtoneSettingActivity extends Activity {private Button setting;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);setting = (Button) findViewById(R.id.setting);setting.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 外部调用传入一个urlRingtoneSetting.setmUrl(Environment.getExternalStorageDirectory().toString()+ "/Music/胡歌-忘记时间.mp3");// 开始设置RingtoneSetting.setting(RingtoneSettingActivity.this);}});}
}

供外部调用的实现类:

package org.sunchao;import java.io.File;import android.content.ContentValues;
import android.content.Context;
import android.media.RingtoneManager;
import android.net.Uri;
import android.provider.MediaStore;public class RingtoneSetting {private static String mUrl;private static Context mContext;public static void setmUrl(String url) {mUrl = url;}public static void setting(Context context) {// 外部调用者传来的contextmContext = context;// 设置歌曲路径File filePath = new File(mUrl);ContentValues values = new ContentValues();// The data stream for the filevalues.put(MediaStore.MediaColumns.DATA, filePath.getAbsolutePath());// The title of the contentvalues.put(MediaStore.MediaColumns.TITLE, filePath.getName());// The MIME type of the filevalues.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");// values.put(MediaStore.Audio.Media.ARTIST, "Madonna");// values.put(MediaStore.Audio.Media.DURATION, 230);// 来电铃声// 第二个参数若是true则会在铃音库中显示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, true);// Insert it into the databaseUri uri = MediaStore.Audio.Media.getContentUriForPath(filePath.getAbsolutePath());// 下面这一句很重要mContext.getContentResolver().delete(uri,MediaStore.MediaColumns.DATA + "=\""+ filePath.getAbsolutePath() + "\"", null);Uri newUri = mContext.getContentResolver().insert(uri, values);RingtoneManager.setActualDefaultRingtoneUri(mContext,RingtoneManager.TYPE_RINGTONE, newUri);}
}

上面代码中注释“// 下面这一句很重要”,刚开始我是没加这一句,但是会出现如下错误,08-12 22:11:13.486: ERROR/Database(2974): Error inserting is_alarm=false is_ringtone=true artist_id=37 is_music=false album_id=-1 title=tl.mp3 duration=230 is_notification=false title_key=Ttlmp3 mime_type=audio/mp3 date_added=1313158273 _display_name=tl.mp3 _size=8474325 _data=/sdcard/Music/tl.mp3
至于原因,我在这里找到了答案,主要看这个回答:
Remember to be careful about testing this code! It only truthfully works the first time. If you try running the same code again, you'll be trying to shove a duplicate entry in MediaStore's table, and the SQLite database won't allow you, giving you that exact same error. You have to either rename your file and add another instance of it, or go in, remove the entry, and then try again. To do this, you could use RingDroid. Just make sure you have all audio visible, and search for your filename, then delete it from there. Alternately, you could look at their source for deleting from the table.

最后不要忘记加权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>

http://stackoverflow.com这个网站还是很强大的呀,Android很多FAQ可以在上面得到解决。

Android实现自定义铃音相关推荐

  1. Android ListView 自定义背景后 滚动时的背景变黑问题

    ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉,原因是,滚动时,列表里面的view重绘时,用的依旧 ...

  2. android 实现自定义监听接口,Android在自定义类中实现自定义监听器方式

    Android在自定义类中实现自定义监听器方式 发布时间:2020-08-31 06:19:39 来源:脚本之家 阅读:203 作者:Simon_Qi 监听器可以说是Android开发中最常用的东西之 ...

  3. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  4. android+自定义皮肤,android studio自定义更换皮肤详细图文教程

    android studio这款app程序开发软件内也内置了多种皮肤主题,程序开发人员如果感觉一种皮肤太过单调乏味,可以选择使用软件内的其他皮肤风格,软件默认的皮肤是IntelliJ,还有黑色的Dra ...

  5. android 自定义搜索框edittext,Android编程自定义搜索框实现方法【附demo源码下载】...

    本文实例讲述了Android编程自定义搜索框实现方法.分享给大家供大家参考,具体如下: 先来看效果图吧~ 分析:这只是模拟了一个静态数据的删除与显示 用EditText+PopupWindow+lis ...

  6. Android Studio自定义视图无法预览

    Android Studio自定义视图没有办法预览 我想大家应该都和我一样,如果看到布局的编码的时候如果右边能够非常直观地显示出对应的视图,心里会非常舒心,像官方提供的tools命名空间就是为了这个目 ...

  7. android 自定义皮肤,Android Studio 自定义皮肤主题和背景

    新的一年,新的开始,在这里先祝福大家在新的一年收获多多,多升职,多加薪,代码没BUG. 第一 Android Studio自定义皮肤主题-ColorThemes 寒假期间有人问我, "你代码 ...

  8. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  9. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

最新文章

  1. 使用VS2010调试技巧让C指针无处遁形
  2. HX711电子秤专用转换芯片读取MCU模块
  3. Ubuntu Linux 8.04系统JAVA配置方法
  4. 【从零入门 Web 前端】HTML5 + CSS 简明教程
  5. 为什么中国天才都往美国跑,可美国人的数学那么槽糕
  6. docker 删除image_如何用两个小时入门 Docker?
  7. python 无序列表中第k大元素_查询无序列表中第K小元素
  8. FPGA复位激励编写(方法一)
  9. 好企业:不是走得多快而是走得多稳
  10. GitHub使用教程-官网指南
  11. IAR环境配置教程(CC2530版)
  12. gis 数据框裁剪_【更新84篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  13. ubuntu 设置静态路由_Ubuntu添加静态路由
  14. 辉太郎看前端(for...in和for...of)
  15. Introduction to Fabric.js/ Part 8 - Clipping with clipPaths(介绍Fabric.js第八部分-剪裁)
  16. 计算机打印机提示无法打印,打印机无法打印_打印机无法打印怎么办【步骤|图文教程】-太平洋IT百科...
  17. 态度决定一切细节决定成败_一切都在细节中
  18. Vacuum使用心得
  19. 电竞AI之视觉篇:YOLO算法在电竞中的应用(Darknet + TF)
  20. oracle oci的好处,oracle的oci和thin区别

热门文章

  1. 支付系统就该这么设计(万能通用),稳的一批
  2. BUUCTF ------findkey
  3. 学生逃课问题的系统分析
  4. 安装VMware15虚拟机+Ubuntu19.10
  5. 微信小程序接入第三方接口
  6. 中远通在创业板IPO过会:前三季度收入11亿元,罗厚斌为董事长
  7. vivo T2什么时候上市 vivo T2配置怎么样
  8. web网页设计——体育气步枪射击主题(5页面)带图片轮播特效(HTML+CSS) ~学生网页设计作业源码
  9. 边缘风行视频采集软件V1.0
  10. 深入Kubernetes 之 DaemonSet :容器化守护进程