热门标签 | 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
推荐阅读
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • STM32串口通信:完整指南
    众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • ARM汇编基础基于Keil创建STM32汇编程序的编写
    文章目录一、新建项目(1)工具介绍(2)创建项目:二、配置环境(1)配置芯片&#x ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 深入RTOS实践,面对原子操作提问竟感困惑
    在实时操作系统(RTOS)的实践中,尽管已经积累了丰富的经验,但在面对原子操作的具体问题时,仍感到困惑。本文将深入探讨RTOS中的原子操作机制,分析其在多任务环境下的重要性和实现方式,并结合实际案例解析常见的问题及解决方案,帮助读者更好地理解和应用这一关键技术。 ... [详细]
  • Ubuntu 22.04 安装搜狗输入法详细指南及常见问题解决方案
    本文将详细介绍如何在 Ubuntu 22.04 上安装搜狗输入法,并提供常见问题的解决方法。包括下载安装包、更新源、安装依赖项等步骤。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
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社区 版权所有