java.lang.NullPointerException: попытка вызвать виртуальный метод 'int android.view.View.getVisibility( )1 по нулевой ссылке на объект по адресу
android.view.ViewRootImpl.getHostVisibility(ViewRootImpl.java:1837) по адресу android.view.ViewRootImpl.handleAppVisibility(ViewRootImpl.java:1472) по адресу
android.view. ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:4890) в android.os.Handler.dispatchMessage(Handler iava'106) в
android.os.Looper.loop(Looper.iava:214) в android.app. ActivityThread.main(ActivityThread.java:7156) по адресу com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) по адресу com.android.internal.os.ZygoteInit.main(ZygoteInit .java:975)

CallActivity
Код: Выделить всё
public class CallingActivity extends AppCompatActivity {
ImageButton btnSpeaker, btnMute, btnAnswer, btnReject, btnEnd;
TextView statusTv;
LinearLayout vIncomingCall, v_CallControl;
private StringeeCall call;
private boolean isIncomingCall = false;
private String to;
private String callId;
StringeeCall.SignalingState mSignalingState;
StringeeCall.MediaState mMediaState;
StringeeAudioManager audioManager;
boolean isSpeaker = false;
boolean isMicOn = true;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calling);
//init
btnEnd = findViewById(R.id.btnEnd);
vIncomingCall = findViewById(R.id.vIncomingCall);
btnSpeaker = findViewById(R.id.btnSpeaker);
btnMute = findViewById(R.id.btnMute);
btnAnswer = findViewById(R.id.btnAnswer);
btnReject = findViewById(R.id.btnReject);
statusTv = findViewById(R.id.statusTv);
v_CallControl = findViewById(R.id.v_CallControl);
if(getIntent() != null){
callId = getIntent().getStringExtra("callId");
to = getIntent().getStringExtra("to");
System.out.println("to: " + to);
isIncomingCall = getIntent().getBooleanExtra("isIncomingCall", false);
}
vIncomingCall.setVisibility(isIncomingCall ? View.VISIBLE : View.GONE);
btnEnd.setVisibility(isIncomingCall ? View.GONE : View.VISIBLE);
addEvent();
}
private void addEvent() {
btnSpeaker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runOnUiThread(() ->{
if(audioManager != null){
audioManager.setSpeakerphoneOn(!isSpeaker);
isSpeaker = !isSpeaker;
btnSpeaker.setBackgroundResource(isSpeaker ? R.drawable.speaker : R.drawable.mutespeaker);
}
});
}
});
btnAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runOnUiThread(()->{
if(call != null){
call.answer(new StatusListener() {
@Override
public void onSuccess() {
}
});
vIncomingCall.setVisibility(View.GONE);
btnEnd.setVisibility(View.VISIBLE);
}
});
}
});
btnMute.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runOnUiThread(() ->{
if(call != null){
call.mute(!isMicOn);
isMicOn = !isMicOn;
btnMute.setBackgroundResource(isMicOn ? R.drawable.unmute : R.drawable.mute);
}
});
}
});
btnEnd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(call != null){
call.hangup(new StatusListener() {
@Override
public void onSuccess() {
}
});
audioManager.stop();
finish();
}
}
});
btnReject.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runOnUiThread(()->{
if(call != null){
call.reject(new StatusListener() {
@Override
public void onSuccess() {
}
});
audioManager.stop();
finish();
}
});
}
});
List permissions = new ArrayList();
if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO) != PERMISSION_GRANTED){
permissions.add(android.Manifest.permission.RECORD_AUDIO);
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PERMISSION_GRANTED) {
permissions.add(Manifest.permission.BLUETOOTH_CONNECT);
}
}if(permissions.size() > 0) {
String[] permissionArray = new String[permissions.size()];
for (int i = 0; i < permissions.size(); i++) {
permissionArray[i] = permissions.get(i);
}
ActivityCompat.requestPermissions(this, permissionArray, 0);
return;
}
initCall();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean isGranted = true;
if(grantResults.length > 0) {
for (int grantResult : grantResults) {
if (grantResult != PERMISSION_GRANTED) {
isGranted = false;
break;
}else{
isGranted = true;
}
}
}
if(requestCode == 0){
if(!isGranted){
finish();
}else{
initCall();
}
}
}
private void initCall() {
if(isIncomingCall) {
call = ChatActivity.callMap.get(callId);
if(call == null){
finish();
return;
}
}else{
call = new StringeeCall(ChatActivity.client , ChatActivity.client.getUserId(), to);
}
call.setCallListener(new StringeeCall.StringeeCallListener() {
@Override
public void onSignalingStateChange(StringeeCall stringeeCall, StringeeCall.SignalingState signalingState, String s, int i, String s1) {
runOnUiThread(() ->{
mSignalingState = signalingState;
switch (signalingState){
case CALLING:
statusTv.setText("Calling...");
break;
case RINGING:
statusTv.setText("Ringing...");
break;
case ANSWERED:
statusTv.setText("Answered");
if(mMediaState == StringeeCall.MediaState.CONNECTED){
statusTv.setText("Connected");
}
break;
case BUSY:
statusTv.setText("Busy");
audioManager.stop();
finish();
break;
case ENDED:
statusTv.setText("Ended");
audioManager.stop();
finish();
break;
}
});
}
@Override
public void onError(StringeeCall stringeeCall, int i, String s) {
runOnUiThread(()->{
finish();
audioManager.stop();
});
}
@Override
public void onHandledOnAnotherDevice(StringeeCall stringeeCall, StringeeCall.SignalingState signalingState, String s) {
}
@Override
public void onMediaStateChange(StringeeCall stringeeCall, StringeeCall.MediaState mediaState) {
runOnUiThread(()->{
mMediaState = mediaState;
if(mediaState == StringeeCall.MediaState.CONNECTED){
if(mSignalingState == StringeeCall.SignalingState.ANSWERED) {
statusTv.setText("Connected");
}
}else{
statusTv.setText("Connecting...");
}
});
}
@Override
public void onLocalStream(StringeeCall stringeeCall) {
}
@Override
public void onRemoteStream(StringeeCall stringeeCall) {
}
@Override
public void onCallInfo(StringeeCall stringeeCall, JSONObject jsonObject) {
}
});
audioManager = new StringeeAudioManager(this);
audioManager.start((audioDevice, set) -> {
});
audioManager.setSpeakerphoneOn(false);
if(isIncomingCall) {
call.ringing(new StatusListener() {
@Override
public void onSuccess() {
}
});
}else{
call.makeCall(new StatusListener() {
@Override
public void onSuccess() {
}
});
}
}
}
Код: Выделить всё
Я попробовал отладку и получил сообщение о том, что доступ к vIncomingCall и btnEnd был получен до инициализации, хотя я уже инициализировал их в функции OnCreate.
Подробнее здесь: https://stackoverflow.com/questions/785 ... android-vi