
基础产品
适用各种通信场景,接入灵活

融合场景
专为场景打造,接入成本低

扩展能力
核心能力延展,功能全面

更多服务
一站式服务,满足各种需求
回答:
修改io.rong.callkit.Callkit#BaseCallActivity类中有如下方法:
1:当RingingMode为 Incoming时会使用手机自带铃声;
2:当RingingMode为 Outgoing或Incoming_Custom时会使用Callkit模块中的铃声文件;
3:可以通过修改RingingMode参数、主叫铃声文件(R.raw.voip_outgoing_ring) 和 被叫铃声文件(R.raw.voip_incoming_ring)到达自定义呼叫、拨打铃声效果;
/** * @param mode 响铃类型 */ public void callRinging(RingingMode mode) { isIncoming = false; try { initMp();//初始化MediaPlayer if (mode == RingingMode.Incoming) { Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); mMediaPlayer.setDataSource(this, uri); } else if (mode == RingingMode.Incoming_Custom || mode == RingingMode.Outgoing) { int rawResId = mode == RingingMode.Outgoing ? R.raw.voip_outgoing_ring : R.raw.voip_incoming_ring; AssetFileDescriptor assetFileDescriptor = getResources().openRawResourceFd(rawResId); mMediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); assetFileDescriptor.close(); } // 设置 MediaPlayer 播放的声音用途 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { AudioAttributes attributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) .build(); mMediaPlayer.setAudioAttributes(attributes); } else { mMediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); } mMediaPlayer.prepareAsync(); final AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); if (am != null) { am.setSpeakerphoneOn(mode == RingingMode.Incoming || mode == RingingMode.Incoming_Custom); // 设置此值可在拨打时控制响铃音量 am.setMode(AudioManager.MODE_IN_COMMUNICATION); // 设置拨打时响铃音量默认值 am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, 5, AudioManager.STREAM_VOICE_CALL); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e1) { Log.i(MEDIAPLAYERTAG, "---onOutgoingCallRinging Error---" + e1.getMessage()); } }
public enum RingingMode { Incoming(0), Outgoing(1),Incoming_Custom(2); private int val; RingingMode(int val) { this.val = val; } }