onMessageSent не вызывается в Sinch Android
У меня есть приложение для iOS, использующее Sinch, которое работает без проблем, и недавно я перенес приложение на Android, используя те же учетные данные Sinch (ключ API и секрет API), затем обнаружил
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, что и тот, который я показал выше.