求ringtone(苹果手机苹果ringtone来电铃声声)的简谱

Android 设置来电铃声、通知铃声、闹钟铃声中的坑 - 简书
Android 设置来电铃声、通知铃声、闹钟铃声中的坑
最新做项目,遇到一个铃声设置的bug,一直被延期了大半年,终于忍不住了,花了大半天时间来研究问题所在。其实这个功能百度一下有很多,但大部分都是同一篇文章,我们项目里最开始就是参考的百度的代码片段来实现的,但是有个bug,对同一个mp3文件设置来电铃声后,然后再设置成通知铃声或者闹钟铃声,那原来设置的来电铃声就会变成未知铃声,同时失效了。就是分析这个问题花了大半天时间,而我发现百度谷歌的这些文章都没提到这个点,经过反复的猜测调试,终于找到问题所在,最后发现其实也很简单,但也是个很容易被忽略的点(在后面问题分析处提到),特此记录一下。
如图,下载的mp3铃声,点击三个按钮分别实现设置三个铃声。设置成功后可以到系统设置铃音处查看
需求描述.png
懒得看分析的看官可直接复制以下代码到自己工程,亲测ok)
注意看代码中注释的两个步骤,这是两个关键的地方。就是这个地方让我研究了大半天,有追求的看官的可以看继续往后看原理分析和问题分析。
* 设置铃声
* @param type RingtoneManager.TYPE_RINGTONE 来电铃声
RingtoneManager.TYPE_NOTIFICATION 通知铃声
RingtoneManager.TYPE_ALARM 闹钟铃声
* @param path 下载下来的mp3全路径
* @param title 铃声的名字
public static void setRing(Context context, int type, String path, String title) {
Uri oldRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE); //系统当前
Uri oldNotification = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_NOTIFICATION); //系统当前
Uri oldAlarm = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM); //系统当前
File sdfile = new File(path);
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, title);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
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);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdfile.getAbsolutePath());
Uri newUri =
String deleteId = "";
Cursor cursor = context.getContentResolver().query(uri, null, MediaStore.MediaColumns.DATA + "=?", new String[] { path },null);
if (cursor.moveToFirst()) {
deleteId = cursor.getString(cursor.getColumnIndex("_id"));
LogTool.e("AGameRing", "deleteId:" + deleteId);
context.getContentResolver().delete(uri,
MediaStore.MediaColumns.DATA + "=\"" + sdfile.getAbsolutePath() + "\"", null);
newUri = context.getContentResolver().insert(uri, values);
} catch (Exception e) {
e.printStackTrace();
if (newUri != null) {
String ringStoneId = "";
String notificationId = "";
String alarmId = "";
if (null != oldRingtoneUri) {
ringStoneId = oldRingtoneUri.getLastPathSegment();
if (null != oldNotification) {
notificationId = oldNotification.getLastPathSegment();
if (null != oldAlarm) {
alarmId = oldAlarm.getLastPathSegment();
Uri setRingStoneU
Uri setNotificationU
Uri setAlarmU
if (type == RingtoneManager.TYPE_RINGTONE || ringStoneId.equals(deleteId)) {
setRingStoneUri = newU
setRingStoneUri = oldRingtoneU
if (type == RingtoneManager.TYPE_NOTIFICATION || notificationId.equals(deleteId)) {
setNotificationUri = newU
setNotificationUri = oldN
if (type == RingtoneManager.TYPE_ALARM || alarmId.equals(deleteId)) {
setAlarmUri = newU
setAlarmUri = oldA
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, setRingStoneUri);
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_NOTIFICATION, setNotificationUri);
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM, setAlarmUri);
switch (type) {
case RingtoneManager.TYPE_RINGTONE:
Toast.makeText(context.getApplicationContext(), "设置来电铃声成功!", Toast.LENGTH_SHORT).show();
case RingtoneManager.TYPE_NOTIFICATION:
Toast.makeText(context.getApplicationContext(), "设置通知铃声成功!", Toast.LENGTH_SHORT).show();
case RingtoneManager.TYPE_ALARM:
Toast.makeText(context.getApplicationContext(), "设置闹钟铃声成功!", Toast.LENGTH_SHORT).show();
要将一个sd卡的mp3文件设置成为铃声,需要有两个操作
1、将mp3文件路径存到ContentProvider里,得到相应的uri
2、调用RingtoneManager.setActualDefaultRingtoneUri(),传入相应的uri和需要设置的铃声类型即可。
注:ContentProvider可以简单的理解成一个系统数据库,返回的uri其实就是这个数据库里某一条数据的唯一标识,含有_id。
用getActivity().getContentResolver().query这个方法可以查询到相关数据。
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);
这一堆其实就是表里的字段名和值,有用没有就看你怎么运用
问题主要出在第一步。
要将mp3路径存到ContentProvider里,需要调用getActivity().getContentResolver().insert()方法,但是里面原来有这个铃声了的话,是插入不成功的。这个时候为了保险起见需要调用一次删除方法getActivity().getContentResolver().delete(),这两部也基本上成了标配,网上的文章大部分也就这两步就得到了需要的uri。
如果没有像我这里提到的需求,对同一个mp3可以分开分别设置的话就没有我这个bug。
问题就出在delete这个步骤,假设对一个铃声先设置了来电铃声得到_id=1000的uri,然后再讲这个mp3设置为通知铃音,那么在设置通知铃声的时候掉的delete方法会将_id=1000的这个数据删了,因为这次要插入的记录和上一次一样的,然后再插入新的得到_id=1001的uri,这个时候通知铃声就是_id=1001的uri,而之前设置的来电铃声读取的_id=1000的记录就没有了,查看铃声的时候就是未知铃音了。
找到问题所在后,我们就解决这个问题。
所以我在delete之前先进行了一次query操作,如果查到了就把那条记录的_id记录下来,后面再设置铃声的时候将三个类型的铃声的当前设置的uri通过uri.getLastPathSegment()得到其_id,然后和刚刚删除的_id(deleteId)进行对比,如果发现一样就说明之前这个类型的铃声就是我现在要插入的铃声,就再把新的
_id=1001的uri设置进去,否则就把得到的系统的uri再设置一次,或者不做操作。
当然这只是其中一种方法,还有其他方法这里就不再赘述了。
Android/微信小程序/React Native
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
转载自:http://blog.csdn.net/vipzjyno1/article/details/ 在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏...
1.什么是Activity?问的不太多,说点有深度的 四大组件之一,一般的,一个用户交互界面对应一个activity setContentView() ,// 要显示的布局 , activity 是Context的子类,同时实现了window.callback和keyeve...
安卓本身并不支持双卡,在定制过之后,默认情况下两张卡的来电铃声是一样的,不能分别进行设置,这就需要添加一些相关代码。 基本思路是,找到来电时播放铃声的地方,修改为根据卡的ID播放相应的声音。(而整个来电流程比较复杂,可以参考其他一些分析来电流程的文章来进行了解,这里就不赘述...
Android下的进程与线程: 1、进程的生命周期: 1)、进程的创建及回收: 进程是被系统创建的,当内存不足的时候,又会被系统回收 2)、进程的级别: Foreground Process前台进程 Visible Process可视进程 Service Process服务...
“生病了喔”“哪里有粥喝”“吃了两片xx”最近,身边不止一个男孩子生病发朋友圈求安慰,这让我有点哭笑不得,摇尾乞怜,获得的永远是反感和不屑。 好想告诉他们同时候的我,姨妈腹痛到下不了床,还是坚持着自己洗衣服,自己拿快递,当初发烧39度的我,自己一个人默默撑着到医院输液。 虽...
今年疯狂的房价飙升,ZF也看不下去了,所以接连出台一系列调控政策。包括暂停放弃发债融资、银监会严控银行资金进入房地产市场,限购限贷等等政策。根据以往的经验来看,资金密集型的房地产随着ZF调控力度的加大,短期内回调是大概率时间。 房地产的回落会对经济造成较大压力 房地产作为近...
时过境迁,多少岁月如梭。 作为微商我付出了多少?收获了什么?无论你做的什么都是一种态度,你的心在哪结果就在哪。群里越是喜欢互动的家人业绩往往也是最好的,他们每天以积极的心态面对。今天慧慧给我们讲述了关于微商的态度和销售过程中该注意的事项,一些小细节也可能是成败的关键。对于一...
青春是人生最美的风景!
文/水流云在
十三岁的侄子,正读八年级,像一只小精灵,不停地在我耳畔歌唱:姑姑,大学会有物理专业吧,我将来一定要学物理专业,北京大学,复旦大学,南京大学……哈佛大学,剑桥大...
喜欢三亚很久,她的蓝,他的安静,甚至它的多变,让我着迷! 或许平日的紧张,让这里的慵懒更显迷人 最美的风景,莫过于茶余饭后,避过过于热烈的阳光,静静坐在沙滩,看天空翻云覆雨,潮起潮落。 在落日余晖中和家人在一起踩水嬉戏。 感觉岁月静好,夫复何求的满足。 天涯海角,见证亲情友...苹果手机最经典的铃声叫什么名字?_百度知道
苹果手机最经典的铃声叫什么名字?
乔布斯在旧金山马士孔尼会展中心的苹果公司全球软件开发者年会2007中透露推出第一代iPhone,狗吠,颤音,声纳,老式汽车喇叭,科幻音乐,渐强音,木琴苹果手机最经典的铃声叫马林巴琴,延巴舞曲,时间流逝,这个是默认的,也是用的人最多的,也是挺好听的。另外苹果还有内置铃声有,啵音,弹球声,机器人,钢琴重复段,吉他扫弦,门铃声,钟楼钟声,竖琴。Phone是美国苹果公司研发的智能手机系列,搭载苹果公司研发的iOS操作系统:老式电话铃声,我们经常在大街上可以听到苹果手机铃声就是。另外就是蓝调音乐,用的人也很多。第一代iPhone于日由苹果公司前首席执行官史蒂夫·乔布斯发布,数码,鸭叫声,蟋蟀叫声,我就是用的这个
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。我们直接看代码
bt1 = (Button) findViewById(R.id.bt1);
bt2 = (Button) findViewById(R.id.bt2);
bt3 = (Button) findViewById(R.id.bt3);
bt2.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
//获得手机提示音
if (mNotificationUri_notify == null) {
mNotificationUri_notify = RingtoneManager
.getActualDefaultRingtoneUri(MainActivity.this,
RingtoneManager.TYPE_NOTIFICATION);
if (mNotificationUri_notify != null && mRingtone_notify == null) {
String string = mNotificationUri_notify.toString();
tv.setText(string);
mRingtone_notify = RingtoneManager.getRingtone(
getApplicationContext(), mNotificationUri_notify);
if (mRingtone_notify != null) {
if (mRingtone_notify.isPlaying()) {
mRingtone_notify.stop();
mRingtone_notify
.setStreamType(AudioManager.STREAM_NOTIFICATION);
mRingtone_notify.play();
bt1.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
//获得手机来电铃声
if (mNotificationUri_telephone == null) {
mNotificationUri_telephone = RingtoneManager
.getActualDefaultRingtoneUri(MainActivity.this,
RingtoneManager.TYPE_RINGTONE);
if (mNotificationUri_telephone != null
&& mRingtone_telephone == null) {
mRingtone_telephone = RingtoneManager
.getRingtone(getApplicationContext(),
mNotificationUri_telephone);
if (mRingtone_telephone != null) {
if (mRingtone_telephone.isPlaying()) {
mRingtone_telephone.stop();
mRingtone_telephone
.setStreamType(AudioManager.STREAM_RING);
mRingtone_telephone.play();
bt3.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
if (mNotificationUri_alarm == null) {
//获得手机闹钟铃声
mNotificationUri_alarm = RingtoneManager
.getActualDefaultRingtoneUri(MainActivity.this,
RingtoneManager.TYPE_ALARM);
if (mNotificationUri_alarm != null && mRingtone_alarm == null) {
mRingtone_alarm = RingtoneManager.getRingtone(
getApplicationContext(), mNotificationUri_alarm);
if (mRingtone_alarm != null) {
if (mRingtone_alarm.isPlaying()) {
mRingtone_alarm.stop();
mRingtone_alarm
.setStreamType(AudioManager.STREAM_ALARM);
mRingtone_alarm.play();
上面的代码就是获得手机三个铃声的代码。
其实,获得手机铃声的操作也很简单。
它主要就涉及两个类
1.RingtoneManager-铃声管理类
2.Ringtone-铃声操作类
基本上就是三个步骤
获得Uri的方法,需要传入一个参数 RingtoneManager.TYPE_NOTIFICATION(STREAM_NOTIFICATION..)就是
这个参数决定了我们获得的是何种提示音
2.获得Ringtone
获得它的方法需要把第一步得到的Uri传进来,就可以得到相应的铃声了
3.操作铃声
直接只用play() stop()控制铃声的停止跟播放。
上面有一个方法
mRingtone_alarm.setStreamType(AudioManager.STREAM_ALARM);
说是设置音频流的,这个音频流到底是什么东西,也不懂,就看到有人说
&Android Framework的音频子系统中,每一个音频流对应着一个AudioTrack类 的一个实例,每个AudioTrack会在创建时注册到AudioFlinger中,由AudioFlinger把所有的AudioTrack进行混合 (Mixer),然后输送到AudioHardware中进行播放。AudioTrack和AudioFlinger的通信机制通 常,AudioTrack和AudioFlinger并不在同一个进程中,它们通过android中的binder机制建立联系。
自己查了下资料,感觉应该就是控制什么音频解析的吧
阅读(...) 评论()iPhone铃声制作|iPhone铃声制作(iMacsoft iPhone Ringtone Maker)下载 v1.1.7.1206免费版_ - pc6下载站综合评分:
如果您觉得 好 请用力
如果您觉得 差 请用力
制作超酷的手机铃声,随时更改手机铃声,该软件可以把midi、rtttl铃声格式或者你自己作的曲子转换成各种手机的铃声,支持多种手机型号,包括:诺基亚、爱立信、摩托罗拉、阿尔卡特、三星、松下、索尼。它可以输出两种铃声格式 :按键指令、 rtttl格式。你可以按照按键指令把铃声输入你的手机,非常简单,就和拨电话一样,所以有人称手机按键指令为傻瓜输入法。rtttl 是诺基亚发布的铃声描述格式。它能自动分离midi包含的多个音轨,以简谱显示midi或你作的旋律 ,,你可以随意地修改、删除音符;经试听满意后转换为你的手机的按键指令。输出的铃声可以存为midi或文本文件。
上一篇: 下一篇:

我要回帖

更多关于 苹果ringtone来电铃声 的文章

 

随机推荐