2

我有一个使用 Sinch 的 iOS 应用程序,它可以正常工作,最近我使用相同的 Sinch 凭据(API 密钥和 API 密钥)在 Android 上迁移了该应用程序,然后我发现

12-14 21:57:17.678  17907-17907/com.packagename.android D/SinchClient﹕ onStarted()
12-14 21:57:17.678  17907-17907/com.packagename.android D/SinchClient﹕ mUserAgent.startBroadcastListener()
12-14 21:57:17.678  17907-17907/com.packagename.android D/SinchService﹕ SinchClient started
12-14 21:57:17.738  17907-17907/com.packagename.android I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@4247f4c8 time:23957901
12-14 21:57:21.458  17907-17913/com.packagename.android I/dalvikvm﹕ Total arena pages for JIT: 11
12-14 21:57:21.458  17907-17913/com.packagename.android I/dalvikvm﹕ Total arena pages for JIT: 12
12-14 21:57:21.458  17907-17913/com.packagename.android I/dalvikvm﹕ Total arena pages for JIT: 13
12-14 21:57:21.458  17907-17913/com.packagename.android I/dalvikvm﹕ Total arena pages for JIT: 14
12-14 21:57:21.608  17907-18645/com.packagename.android E/sinch-android-rtc﹕ WARNING: mxp Ignoring message, reason: 'From local instance'
12-14 21:57:21.608  17907-17907/com.packagename.android W/mxp﹕ Ignoring message, reason: 'From local instance'

如上所示,Sinch 客户端已经成功启动。但是onMessageSent不叫,为什么呢?

我的问题:

  • 那为什么在我尝试发送消息时它给了我一个错误?

  • 错误:“忽略消息,原因:'来自本地实例'”是什么意思?

  • SinchService正在运行并且它不为空,为什么onMessageSent不调用?

相关代码

SinchService.class

public class SinchService extends Service {

    private static final String APP_KEY = "xxx";
    private static final String APP_SECRET = "xxx";
    private static final String ENVIRONMENT = "clientapi.sinch.com";

    private static final String TAG = SinchService.class.getSimpleName();

    private final SinchServiceInterface mServiceInterface = new SinchServiceInterface();

    private SinchClient mSinchClient = null;
    private StartFailedListener mListener;

    public class SinchServiceInterface extends Binder {

        public boolean isStarted() {
            return SinchService.this.isStarted();
        }

        public void startClient(String userName) {
            start(userName);
        }

        public void stopClient() {
            stop();
        }

        public void setStartListener(StartFailedListener listener) {
            mListener = listener;
        }

        public void sendMessage(String recipientUserId, String textBody) {
            SinchService.this.sendMessage(recipientUserId, textBody);
        }

        public void receiveMessage(String payload) {
            SinchService.this.receiveMessage(payload);
        }

        public void addMessageClientListener(MessageClientListener listener) {
            SinchService.this.addMessageClientListener(listener);
        }

        public void removeMessageClientListener(MessageClientListener listener) {
            SinchService.this.removeMessageClientListener(listener);
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        if (mSinchClient != null && mSinchClient.isStarted()) {
            mSinchClient.terminate();
        }
        super.onDestroy();
    }

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

    private boolean isStarted() {
        return (mSinchClient != null && mSinchClient.isStarted());
    }

    public void sendMessage(String recipientUserId, String textBody) {
        if (isStarted()) {
            WritableMessage message = new WritableMessage(recipientUserId, textBody);
            mSinchClient.getMessageClient().send(message);
        }
    }

    public void receiveMessage(String payload) {
        if (isStarted()) {
            NotificationResult result = mSinchClient.relayRemotePushNotificationPayload(payload);
            if (result.isMessage()) {
                String msgId = result.getMessageResult().getMessageId();
                Log.i(TAG, String.format("Received msg Id %s", msgId));
            }
        }
    }

    public void addMessageClientListener(MessageClientListener listener) {
        if (mSinchClient != null) {
            mSinchClient.getMessageClient().addMessageClientListener(listener);
        }
    }

    public void removeMessageClientListener(MessageClientListener listener) {
        if (mSinchClient != null) {
            mSinchClient.getMessageClient().removeMessageClientListener(listener);
        }
    }

    private void start(String userName) {
        if (mSinchClient == null) {
            mSinchClient = Sinch.getSinchClientBuilder()
                    .context(getApplicationContext())
                    .userId(userName)
                    .applicationKey(APP_KEY)
                    .applicationSecret(APP_SECRET)
                    .environmentHost(ENVIRONMENT).build();

            mSinchClient.setSupportMessaging(true);
            mSinchClient.setSupportPushNotifications(true);
            mSinchClient.startListeningOnActiveConnection();
            mSinchClient.checkManifest();
            mSinchClient.addSinchClientListener(new MySinchClientListener());
            mSinchClient.start();
        }
    }

    private void stop() {
        if (mSinchClient != null) {
            mSinchClient.stopListeningOnActiveConnection();
            mSinchClient.terminate();
            mSinchClient = null;
        }
    }

    public interface StartFailedListener {

        void onStartFailed(SinchError error);

        void onStarted();
    }

    private class MySinchClientListener implements SinchClientListener {

        @Override
        public void onClientFailed(SinchClient client, SinchError error) {
            if (mListener != null) {
                mListener.onStartFailed(error);
            }
            mSinchClient.terminate();
            mSinchClient = null;
        }

        @Override
        public void onClientStarted(SinchClient client) {
            Log.d(TAG, "SinchClient started");
            if (mListener != null) {
                mListener.onStarted();
            }
        }

        @Override
        public void onClientStopped(SinchClient client) {
            Log.d(TAG, "SinchClient stopped");
        }

        @Override
        public void onLogMessage(int level, String area, String message) {
            switch (level) {
                case Log.DEBUG:
                    Log.d(area, message);
                    break;
                case Log.ERROR:
                    Log.e(area, message);
                    break;
                case Log.INFO:
                    Log.i(area, message);
                    break;
                case Log.VERBOSE:
                    Log.v(area, message);
                    break;
                case Log.WARN:
                    Log.w(area, message);
                    break;
            }
        }

        @Override
        public void onRegistrationCredentialsRequired(SinchClient client,
                                                      ClientRegistration clientRegistration) {
        }
    }
}

SinchManager.class

public class SinchManager implements MessageClientListener, ServiceConnection {

    private SinchCallback callback;
    private static final String TAG = SinchManager.class.getSimpleName();
    private Context context;
    private SinchService.SinchServiceInterface mSinchServiceInterface;
    private String chatRecipient;

    public SinchManager(Context c, SinchCallback cb) {
        this.context = c;
        this.callback = cb;
        // init Sinch
        context.getApplicationContext().bindService(new Intent(context, SinchService.class), this,
                context.BIND_AUTO_CREATE);

    }

    public void sendMessage(String recipient, String msg) {
        mSinchServiceInterface.sendMessage(recipient, msg);
    }

    public void stopSinchClient() {
        mSinchServiceInterface.removeMessageClientListener(this);
        mSinchServiceInterface.stopClient();
        context.stopService(new Intent(context, SinchService.class));
        context.unbindService(this);
    }

    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        if (SinchService.class.getName().equals(componentName.getClassName())) {
            mSinchServiceInterface = (SinchService.SinchServiceInterface) iBinder;
            mSinchServiceInterface.addMessageClientListener(this);
            if (!mSinchServiceInterface.isStarted()) {
                mSinchServiceInterface.startClient(username);/// Here username="xxx"
            }
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        if (SinchService.class.getName().equals(componentName.getClassName())) {
            mSinchServiceInterface = null;
        }
    }


    @Override
    public void onIncomingMessage(MessageClient messageClient, Message message) {
        callback.onReceiveSinchMessage(message);
    }

    @Override
    public void onMessageSent(MessageClient messageClient, Message message, String s) {
        callback.onSentSinchMessage(message, s);
    }

    @Override
    public void onMessageFailed(MessageClient messageClient, Message message, MessageFailureInfo failureInfo) {
        callback.onFailedSinchMessage(failureInfo);
    }

    @Override
    public void onMessageDelivered(MessageClient messageClient, MessageDeliveryInfo deliveryInfo) {
        callback.onDeliveredSinchMessage(deliveryInfo);
    }

    @Override
    public void onShouldSendPushData(MessageClient messageClient, Message message, List<PushPair> pushPairs) {
        //TODO setup offline push notification
        Log.d(TAG, "Recipient not online. And it's not in public chat \n Should notify recipient using push");

    }
}

在我的活动课上,我发送这样的消息:

private void sendMessage() {
    String textBody = messageTextBox.getText().toString();
    if (chatRecipient.isEmpty()) {
        Log.e(TAG, "Recipient is empty, Check Activity Bundle");
        return;
    }
    if (textBody.isEmpty()) {
        Toast.makeText(this, "No text message", Toast.LENGTH_SHORT).show();
        return;
    }

    sinchManager.sendMessage(chatRecipient, textBody);
    messageTextBox.setText("");

}

Sinch 示例代码

我刚刚尝试了 Sinch 提供的示例代码,它也向我显示了相同的错误代码:

12-16 22:48:37.713    7648-8096/com.sinch.android.rtc.sample.messaging E/sinch-android-rtc﹕ WARNING: mxp Ignoring message, reason: 'From local instance'
12-16 22:48:37.713    7648-7648/com.sinch.android.rtc.sample.messaging W/mxp﹕ Ignoring message, reason: 'From local instance'
12-16 22:48:37.863    7648-7648/com.sinch.android.rtc.sample.messaging D/MessageClient﹕ onSentMessage: NativeMessage [id=xxxxx, nativeAddress=xxxx] to recipient with idxxx

但是我注意到日志的最后一行表明消息已成功发送。

我现在很困惑,有没有人有这方面的经验?

注意:示例代码使用与我上面显示的相同的 API KEY/SECRET/Environment。

下载 Sinch 示例代码

4

0 回答 0