作者:zevbin_187 | 来源:互联网 | 2023-09-17 12:51
废话:接了个加急项目,要求10天完成一个类似来电秀的APP,看来领导是很相信我的技术的,哈哈,(内心OS:尼玛,臣妾做不到),然鹅并没有什么用,还是想想如何实现吧###项目步骤(技术
废话:接了个加急项目,要求10天完成一个类似来电秀的APP,看来领导是很相信我的技术的,哈哈,(内心OS:尼玛,臣妾做不到),然鹅并没有什么用,还是想想如何实现吧
###项目步骤(技术难点拆分)
* 设置铃声
* 监听系统来电
* 系统权限获取
* 接听挂断电话
###设置铃声
设置铃声相对来说比较简单,系统提供了相应的API,获取音频文件的URl,调用RingtoneManager的setActualDefaultRingtoneUri方法就OK,代码如下
```
public void setRingtoneImpl2(String path) {
File chosenFile = new File(path);
if (chosenFile == null) {
LogUtils.e("file is null");
return;
}
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, chosenFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, chosenFile.getName());
values.put(MediaStore.MediaColumns.SIZE, chosenFile.length());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.AudioColumns.IS_RINGTONE, true);
values.put(MediaStore.Audio.AudioColumns.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.AudioColumns.IS_ALARM, false);
values.put(MediaStore.Audio.AudioColumns.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(chosenFile.getAbsolutePath());
mContext.getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + chosenFile.getAbsolutePath() + "\"", null);
Uri newUri = mContext.getContentResolver().insert(uri, values);
try {
RingtoneManager.setActualDefaultRingtoneUri(
mContext,
RingtoneManager.TYPE_RINGTONE,
newUri
);
} catch (Exception e) {
e.printStackTrace();
}
}
```
哈哈,搞定,万事大吉,然鹅。。。。,还有双卡双待,设置不同sim卡的来电铃音。。。What????
###双卡设置不同的铃声
再次查看文档发现Google大佬就不支持双卡分别设置铃声,肿么办。。。。。。万般无奈还是从源码出发,看看能否发现些蛛丝马迹,查看setActualDefaultRingtoneUri方法源码
![截屏2020-01-16下午2.37.39.png](https://upload-images.jianshu.io/upload_images/6856454-91e41ade5deddefc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
发现源码是通过修改Setting中的值来修改铃声,那么修改卡2的铃声是否也可以通过这种方式呢?行不行试试就知道
####可以分为两步:
* 找到Setting的Key
* 通过修改系统Setting设置铃声
####查找Setting的Key
通过命令 adb shell getprop获取系统属性,查找与ring相关的属性,嘿嘿,惊喜来了,下面是华为手机的prop:
![截屏2020-01-16下午3.04.53.png](https://upload-images.jianshu.io/upload_images/6856454-163640b0102a8e4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
ringtone不就是系统铃声的Key值吗?因此可以推测下面的ringtone2就是卡2的Key,行不行试下就知道,直接上代码:
```
public void setRingtoneImpl2(String path) {
File chosenFile = new File(path);
if (chosenFile == null) {
LogUtils.e("file is null");
return;
}
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, chosenFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, chosenFile.getName());
values.put(MediaStore.MediaColumns.SIZE, chosenFile.length());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.AudioColumns.IS_RINGTONE, true);
values.put(MediaStore.Audio.AudioColumns.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.AudioColumns.IS_ALARM, false);
values.put(MediaStore.Audio.AudioColumns.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(chosenFile.getAbsolutePath());
mContext.getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + chosenFile.getAbsolutePath() + "\"", null);
Uri newUri = mContext.getContentResolver().insert(uri, values);
try {
RingtoneManager.setActualDefaultRingtoneUri(
mContext,
RingtoneManager.TYPE_RINGTONE,
newUri
);
//华为手机设置卡2
Settings.System.putString(mContext.getContentResolver(), "ringtone2", newUri.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
```
哈哈,运行成功,到此结束,设置铃声完美解决