Android не получает вызовы с другой стороны при использовании gcm и sinch sdk

Я пытаюсь использовать gcm для запуска вызовов в sinch, я отправляю push-уведомление и получаю его с другой стороны, но когда я пытаюсь начать вызов, я получаю исключение нулевого указателя в моей службе на mCall.addCallListener( );

это часть службы намерений gcm, где я получаю уведомление и запускаю службу sinch:

{
            String callId = intent.getExtras().getString("callId");
            Intent intent3 = new Intent(this, SinchClientService.class);
            intent3.setAction(SinchClientService.ACTION_START_CALL);
            intent3.putExtra(SinchClientService.INTENT_EXTRA_CALLID, callId);
            startService(intent3);
        }

это то, что я делаю в сервисе sinch:

else if(intent.getAction().equals(ACTION_START_CALL))
            {
                String callId = intent.getStringExtra(INTENT_EXTRA_CALLID);
                if(callId != null)
                {
                    startCall(callId);
                }
            }

public void startCall(String callId) {
        if (mCallClient != null) {
            Call call = mCallClient.getCall(callId);
            CurrentCall.currentCall = call;

            Intent intent = new Intent(this, CallService.class);
            startService(intent);
        }
    }

и вот как я запускаю клиент sinch:

private void startSinchClient(String id, String userName) {
        mSinchClient = Sinch.getSinchClientBuilder().context(this).userId(id).
                applicationKey(APP_KEY).applicationSecret(APP_SECRET).environmentHost(ENVIRONMENT).build();

        mSinchClient.addSinchClientListener(this);

        mSinchClient.setSupportCalling(true);
        mSinchClient.setSupportMessaging(true);
        mSinchClient.setSupportPushNotifications(true);

        mSinchClient.setSupportActiveConnectionInBackground(false);
        //mSinchClient.startListeningOnActiveConnection();

        mMessageClient = mSinchClient.getMessageClient();
        mMessageClient.addMessageClientListener(this);

        mCallClient = mSinchClient.getCallClient();
        mCallClient.addCallClientListener(this);

        mSinchClient.checkManifest();
        mSinchClient.start();
    }

и это мой метод onIcommingCall:

@Override
    public void onIncomingCall(CallClient client, Call call) {
        Log.d(TAG, "Incoming call");

        CurrentCall.currentCall = call;


        Intent intent = new Intent(this, CallService.class);
        startService(intent);
    }

и это часть моей службы вызовов, где я получаю исключение нулевого указателя:

if(CurrentCall.currentCall == null)
            stopSelf();

        mCall = CurrentCall.currentCall;
        mCall.addCallListener(this);

Примечание: моя служба вызовов реализует прослушиватель вызовов

Мне никогда не звонят, может кто-нибудь мне помочь?

Изменить вот как я инициализирую вызов:

в синч-сервисе:

public void callFriend(String id) {
        if (mCallClient != null) {
            Call call = mCallClient.callUser(id);
            CurrentCall.currentCall = call;

            Intent intent = new Intent(this, CallService.class);
            startService(intent);
        }
    }

в службе звонков:

@Override
    public void onShouldSendPushNotification(Call call, List<PushPair> pushPairs) {
        Log.d(LOG_TAG, "Should send push notification");
        Log.d("payload", pushPairs.get(0).getPushPayload());

        asyncTask = new sendPushNotifications(this, call.getRemoteUserId(), pushPairs, call.getCallId());
        asyncTask.execute();
    }

    class sendPushNotifications extends AutoAsyncTask {

        List<PushPair> pushPairs;

        String message;

        String senderId;
        String message_id;
        String time_stamp;
        String callId;

        public sendPushNotifications(Context context, String senderId, List<PushPair> pushPairs, String callId) {
            super(context, false);

            this.pushPairs = pushPairs;
            this.senderId = senderId;
            this.callId = callId;
        }

        @Override
        protected Integer doInBackground(Void... params) {
            boolean connectedToInternet = connManager.getNetworkInfo( ConnectivityManager.TYPE_WIFI).isConnected()
                    || connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected();
            if (connectedToInternet) 
            {   
                String regId;
                //JSONArray arrayList = new JSONArray();

                for(PushPair p: pushPairs)
                {
                    regId = new String(p.getPushData());
                    //arrayList.put(regId);

                    UserFunctions.sendCallPushNotifications(senderId, regId, "call", callId);
                }

                asyncTask = null;
                return 0;
            } 
            else 
            {
                asyncTask = null;
                return 1;
            }
        }

        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);

            if (result == 0) 
            {
                Log.d("call push sent", "sent");
            } 
            else if (result == 1) 
            {
                Toast.makeText(getApplicationContext(),
                        "No Network Connection !!", Toast.LENGTH_SHORT).show();
            } 
            else 
            {
                Toast.makeText(
                        getApplicationContext(),
                        "Error occured,Please Try Again Later !!",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }

}

последнее редактирование, поэтому я сделал то, что вы сказали, и мне звонят только в сообщениях, мои новые коды:

в службе звонков:

@Override
    public void onShouldSendPushNotification(Call call, List<PushPair> pushPairs) {
        Log.d(LOG_TAG, "Should send push notification");
        Log.d("payload", pushPairs.get(0).getPushPayload());

        asyncTask = new sendPushNotifications(this, call.getRemoteUserId(), pushPairs, call.getCallId());
        asyncTask.execute();
    }

    class sendPushNotifications extends AutoAsyncTask {

        List<PushPair> pushPairs;

        String message;

        String senderId;
        String message_id;
        String time_stamp;
        String callId;

        public sendPushNotifications(Context context, String senderId, List<PushPair> pushPairs, String callId) {
            super(context, false);

            this.pushPairs = pushPairs;
            this.senderId = senderId;
            this.callId = callId;
        }

        @Override
        protected Integer doInBackground(Void... params) {
            boolean connectedToInternet = connManager.getNetworkInfo( ConnectivityManager.TYPE_WIFI).isConnected()
                    || connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected();
            if (connectedToInternet) 
            {   
                String regId;
                String payload;
                //JSONArray arrayList = new JSONArray();

                for(PushPair p: pushPairs)
                {
                    regId = new String(p.getPushData());
                    payload = new String(p.getPushPayload());
                    //arrayList.put(regId);

                    UserFunctions.sendCallPushNotifications(senderId, regId, "call", callId, payload);
                }

                asyncTask = null;
                return 0;
            } 
            else 
            {
                asyncTask = null;
                return 1;
            }
        }

        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);

            if (result == 0) 
            {
                Log.d("call push sent", "sent");
            } 
            else if (result == 1) 
            {
                Toast.makeText(getApplicationContext(),
                        "No Network Connection !!", Toast.LENGTH_SHORT).show();
            } 
            else 
            {
                Toast.makeText(
                        getApplicationContext(),
                        "Error occured,Please Try Again Later !!",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }

служба намерений gcm:

else
        {
            String callId = intent.getExtras().getString("callId");
            String payload = intent.getExtras().getString("payload");
            Intent intent3 = new Intent(this, SinchClientService.class);
            intent3.setAction(SinchClientService.ACTION_START_CALL);
            intent3.putExtra(SinchClientService.INTENT_EXTRA_CALLID, callId);
            intent3.putExtra(SinchClientService.INTENT_EXTRA_PAYLOAD, payload);
            startService(intent3);
        }

Синч-сервис:

else if(intent.getAction().equals(ACTION_START_CALL))
            {
                String callId = intent.getStringExtra(INTENT_EXTRA_CALLID);
                if(callId != null)
                {
                    startCall(callId);
                }
            }

public void startCall(String callId) {
        /*if (mCallClient != null) {
            Call call = mCallClient.getCall(callId);
            CurrentCall.currentCall = call;

            Intent intent = new Intent(this, CallService.class);
            startService(intent);
        }*/
        if(INTENT_EXTRA_PAYLOAD != null)
        {
            if(mSinchClient.isStarted())
            mSinchClient.relayRemotePushNotificationPayload(INTENT_EXTRA_PAYLOAD);
            else
            {
                DatabaseHandler handler = new DatabaseHandler(this);
                UserInfo info = handler.getUserDetails();
                startSinchClient(String.valueOf(info.uid), info.name);

                String gcm_regId = ChatDatabaseHandler.getInstance(this).getGcmRegId();

                mSinchClient.registerPushNotificationData(gcm_regId.getBytes());
            }
        }
    }

@Override
    public void onIncomingCall(CallClient client, Call call) {
        Log.d(TAG, "Incoming call");
        /*if(INTENT_EXTRA_CALLID != null)
        {
        CurrentCall.currentCall = mCallClient.getCall(INTENT_EXTRA_CALLID);
        INTENT_EXTRA_CALLID = null;
        }*/
        CurrentCall.currentCall = call;

        Intent intent = new Intent(this, CallService.class);
        startService(intent);
    }

это также то, что я делаю, когда привязываюсь и отвязываюсь от службы:

@Override
    public boolean onUnbind(Intent intent) {
        mSinchClient.stopListeningOnActiveConnection();
        return super.onUnbind(intent);
    }

    @Override
    public IBinder onBind(Intent intent) {
        mSinchClient.startListeningOnActiveConnection();
        return mServiceInterface;
    }

person Kareem Essam Gaber    schedule 14.03.2015    source источник


Ответы (1)


Кажется, вам не хватает кода, в котором вы фактически отправляете полезную нагрузку Sinch в своем push-уведомлении, вы должны использовать PushPair.getPushPayload(), чтобы получить ее в обратном вызове onShouldSendPushNotification, и обязательно включите это в push-сообщение.
После того, как вы добавите это, вам нужно получить полезную нагрузку на стороне получателя и передать ее relayRemotePushNotificationPayload(String payload). Это даст вам обратный вызов onIncomingCall на стороне получателя.

person frals    schedule 18.03.2015
comment
Извините, но я не понимаю, зачем мне нужна полезная нагрузка push, если я успешно отправляю идентификатор вызова и получаю его на другой стороне, затем я отправляю его в службу sinch, а затем разбираюсь с этим? - person Kareem Essam Gaber; 19.03.2015
comment
@KareemEssamGaber См. sinch.com/docs/android/user-guide/# push-уведомления, где объясняется, что вам нужно делать как на стороне вызывающего, так и на стороне вызываемого абонента. Полезная нагрузка необходима для того, чтобы клиент мог инициировать все необходимое внутри SinchClient. - person frals; 19.03.2015
comment
У меня все еще есть одна проблема, я получаю вызов только тогда, когда я нахожусь в действии обмена сообщениями, где я настраиваю службу для начала прослушивания при активном соединении, но когда я закрываю действие обмена сообщениями, а также когда я прекращаю прослушивание при активном соединении, я не позвоните, я разместил код, чтобы вы могли увидеть мое последнее редактирование - person Kareem Essam Gaber; 19.03.2015
comment
Вы уверены, что вызов relayRemotePushNotificationPayload действительно выполнен? Вы также можете убедиться, что это работает, проверив возвращаемое значение из relayRemotePushNotificationPayload и убедившись, что это вызов и имеет ожидаемый callId. - person frals; 19.03.2015
comment
Я пробовал все, но я все еще не получаю вызов, можете ли вы сказать мне, что мне делать после вызова sinchClient.relayRemotePushNotificationPayload(), нужно ли мне что-то устанавливать в onIncomingCall?, нужно ли мне вызывать mCallClient.getCall( )? - person Kareem Essam Gaber; 22.03.2015