CallLib、CallKit自定义呼叫、拨打铃声

发布时间: 2019-11-21 16:47

回答:

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