Android来电秀应用(一)

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

发现源码是通过修改Setting中的值来修改铃声,那么修改卡2的铃声是否也可以通过这种方式呢?行不行试试就知道

可以分为两步:

  • 找到Setting的Key
  • 通过修改系统Setting设置铃声

查找Setting的Key

通过命令 adb shell getprop获取系统属性,查找与ring相关的属性,嘿嘿,惊喜来了,下面是华为手机的prop:


截屏2020-01-16下午3.04.53.png

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();
        }

    }

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

你可能感兴趣的:(Android来电秀应用(一))