簡體   English   中英

當使用gcm和sinch sdk時,android沒有在另一端接到電話

[英]android not getting calls on the other side when using gcm and sinch sdk

我正在嘗試使用gcm來啟動sinch中的調用,我發送推送通知並在另一端獲取它但是當我嘗試啟動調用時,我在mCall.addCallListener( );服務中獲取空指針異常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);

注意:我的調用服務實現了調用偵聽器

我從來沒有接到電話,有人能幫幫我嗎?

編輯這是我初始化呼叫的方式:

在sinch服務:

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);
        }

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);
        }*/
        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;
    }

您似乎缺少實際在推送中發送Sinch特定負載的代碼,您應該使用PushPair.getPushPayload()onShouldSendPushNotification回調中檢索它,並確保在推送消息中包含它。
添加之后,您需要在接收方檢索有效負載並傳入relayRemotePushNotificationPayload(String payload) 這將為您提供接收方的onIncomingCall回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM