RemoteMonster Community

안드로이드 config 관련 오류 추가 질문드립니다

안녕하세요. 현재 안드로이드 기기에서 보이스톡 (영상 없음) 기능을 구현하고 있습니다.

아래의 1번 코드 (builder 이용)로 정상 작동함을 확인하였습니다.
그래서 2번코드 (config를 이용)로 작동시키려고 하니 오류가 발생합니다.
뭔가 null오류인데 해결방법을 잘 모르겠습니다.
제가 뭔가 config를 잘못 이해하고 있는것 같습니다.
어떻게 해결해야할까요? 아래에 1,2번 코드와 initRemonCallback 코드 올려놓았습니다.
오류 내용도 제일 아래에 올려놓았습니다. 오류에서 280번째 줄 오류 부분은

        remonCall.connect(chId, remonConfig);

이 부분입니다.

1번 코드)
private void setRemonCall() {
remonCall = RemonCall.builder()
.context(VoiceTalkActivity.this)
.serviceId(getResources().getString(R.string.remon_serviceId))
.key(getResources().getString(R.string.remon_serviceKey))
.isVideoCall(false)
.audioType(AudioType.VOICE)
.build();
initRemonCallback();

}

2번 코드)
private void startCall() {
remonCall = new RemonCall();
remonConfig = new com.remotemonster.sdk.Config();
remonConfig.setServiceId(getResources().getString(R.string.remon_serviceId));
remonConfig.setKey(getResources().getString(R.string.remon_serviceKey));
remonConfig.setRestHost(REST_HOST);
remonConfig.setSocketUrl(WSS_HOST);
remonConfig.setVideoCall(false);
remonConfig.setAudioType(AudioType.VOICE);

    initRemonCallback();

    String chId = mChatRoom.getRoomId().replaceAll("[^a-zA-Z0-9]", "");
    if (remonCall != null) {
        remonCall.setSpeakerphoneOn(false);
        remonCall.connect(chId, remonConfig);
    }

}

참고로 initRemonCallback 코드는 아래와 같습니다.

private void initRemonCallback() {
// RemonCall, RemonCast 의 초기화가 완료된 후 호출되는 콜백입니다.
remonCall.onInit(() -> {
runOnUiThread(() -> mStatusTextView.setText(“보이스톡 해요”));
mediaPlayer.start();

    });
    remonCall.onMessage(msg -> {
    });

    // 서버 접속 및 채널 생성이 완료된 이후 호출되는 콜백입니다.
    remonCall.onConnect((channelId) -> {
        // Do something
    });

    remonCall.onComplete(() -> {
        if(mediaPlayer != null){
            mediaPlayer.release();
        }
        if (mWaitingTimer != null) {
            mWaitingTimer.cancel();
        }
        runOnUiThread(() -> mOkLayout.setVisibility(View.GONE));
        setCallingTimer();

        Map<String, Object> voiceTalkData = new HashMap<>();
        voiceTalkData.put(FirebaseHelper.voiceTalkOn, true);
        voiceTalkData.put(FirebaseHelper.recentTimestamp, DateUtil.getUnixTimeLong());
        FirebaseHelper.db.collection("ChatRoom").document(mChatRoom.getRoomId()).collection("VoiceTalk").document(mChatRoom.getRoomId()).set(voiceTalkData, SetOptions.merge());
    });

    // 상대방이 연결을 끊거나, close() 호출후 종료가 완료되면 호출됩니다.
    remonCall.onClose((closeType) -> {
        if(mediaPlayer != null){
            mediaPlayer.release();
        }
        // CloseType.MINE : 자신이 close() 를 호출해 연결을 끊은 경우
        // CloseType.OTHER : 상대방이 close() 를 호출해 연결을 끊은 경우
        // CloseType.OTHER_UNEXPECTED : 상대방이 끊어져서 연결이 종료된 경우
        // CloseType.UNKNOWN : 이유를 알 수 없이 연결이 종료된 경우

        // 에러에 의한 종료인지 체크
        if (closeType == CloseType.UNKNOWN && latestError != null) {
            Toast.makeText(VoiceTalkActivity.this, "네트워크 불안정", Toast.LENGTH_SHORT).show();
        }

        runOnUiThread(() -> mStatusTextView.setText("보이스톡 종료"));
        closeVoiceTalk();

    });

    remonCall.onError((error) -> {
        if(mediaPlayer != null){
            mediaPlayer.release();
        }
        latestError = error;
        Log.d("error:", error+"");
    });
    remonCall.onStat(report -> {

    });
}

오류

2020-03-11 13:12:07.736 24246-24246/com.unilab.uniting E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.unilab.uniting, PID: 24246
java.lang.RuntimeException: Failure delivering result ResultInfo{[email protected]:requestPermissions:, request=100, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.unilab.uniting/com.unilab.uniting.activities.chatting.VoiceTalkActivity}: java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.Object android.content.Context.getSystemService(java.lang.String)’ on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4491)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4534)
at android.app.ActivityThread.-wrap20(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1752)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.Object android.content.Context.getSystemService(java.lang.String)’ on a null object reference
at com.remotemonster.sdk.RemonContext.(RemonContext.java:89)
at com.remotemonster.sdk.Remon.createObjects(Remon.java:99)
at com.remotemonster.sdk.Remon.(Remon.java:61)
at com.remotemonster.sdk.RemonClient.initRemon(RemonClient.java:81)
at com.remotemonster.sdk.RemonCall.connect(RemonCall.java:115)
at com.unilab.uniting.activities.chatting.VoiceTalkActivity.startCall(VoiceTalkActivity.java:280)
at com.unilab.uniting.activities.chatting.VoiceTalkActivity.onRequestPermissionsResult(VoiceTalkActivity.java:525)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7737)
at android.app.Activity.dispatchActivityResult(Activity.java:7560)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4487)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4534)
at android.app.ActivityThread.-wrap20(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1752)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

안녕하세요.
sdk 버전에 따라 초기화루틴의 변경이 있을 수 있어 builder를 사용하도록 가이드하고 있습니다.
config를 설정하는 메쏘드가 package private라 직접 사용할 수 없습니다.

config를 사용하시는 경우 builder의 config()메쏘드를 사용해 config 객체를 전달하면 됩니다.

(안드로이드 v2.6.7)
remonConfig = new com.remotemonster.sdk.Config();
.
.
remonCall = RemonCall.builder()
.config(remonConfig)
.build();
initRemonCallback();