热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android来电秀应用

废话:接了个加急项目,要求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();
        }

    }
```

哈哈,运行成功,到此结束,设置铃声完美解决


版权声明:本文为minyou_1314原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/minyou_1314/article/details/125797999
推荐阅读
author-avatar
zevbin_187
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有