通话接听

如果 App 在前台或者在后台且并没有被系统回收时,当收到呼叫,会自动弹出通话界面。如果 App 已经被回收,2.6.0 以上的版本需要集成远程推送。这样即使被回收了也能收到 Call 的推送消息,点击推送消息启动 App 会自动弹出通话界面。详细请参考远程推送集成文档

自定义铃声设置

修改 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;
    }
}