通过 GCM 和 xmpp 输入状态/在线状态

Posted

技术标签:

【中文标题】通过 GCM 和 xmpp 输入状态/在线状态【英文标题】:typing status / online status via GCM and xmpp 【发布时间】:2014-10-21 15:30:55 【问题描述】:

我已经在 android 上完成了我的 IM 应用程序的开发(使用 xmpp 和 GCM),并且我正在使用 gcm 来进行 UpPayload 和 DownPayloads.. 并通知用户他的合作伙伴在线/离线我发送我的 xmpp 服务器“理解”的消息 告诉状态。

  protected void onStart() 
    super.onStart();
 if(!isOnlineSent)
 SendOnlineStatus("Online");
    isOnlineSent=true;
 .
 .
 .
 .

SendOnlineStatus 看起来像:

 Intent OnlineMsg = new Intent();

    OnlineMsg.putExtra("action", "com.Esmaeel.sodfarim.sodfa01.MESSAGE");
    String nowtime = String.valueOf(EsTools.getCurrentTime());
    OnlineMsg.putExtra(ConstantsGCM.TYPECLM, ConstantsGCM.ONST);
    OnlineMsg.putExtra(ConstantsGCM.STATUS_on_of, Status);
    OnlineMsg.putExtra(ConstantsGCM.TO_CLM, "-01");
    OnlineMsg.putExtra(ConstantsGCM.FROMCLM, UUID);
    OnlineMsg.putExtra(ConstantsGCM.MESSAGE_ID_CLM, regid + nowtime);
    OnlineMsg.putExtra(ConstantsGCM.NAME_CLM, "Name");


    final Bundle bndl = OnlineMsg.getExtras();
    new AsyncTask() 


        @Override
        protected String doInBackground(Object[] objects) 
            if (ggcm == null) 
                ggcm = GoogleCloudMessaging.getInstance(context);

            

            try 
                ggcm.send(PRO_ID + ConstantsGCM.GCM_SERVER, bndl.getString(ConstantsGCM.MESSAGE_ID_CLM), bndl); //// GCM_SERVER="gcm.googleapis.com"
             catch (IOException e) 
                e.printStackTrace();
            
            return "";
        

    .execute(null, null, null);

服务器检查值

payload.get(ConstantsGCM.TYPECLM); 如果类型 ONST 服务器读取值 payload.get(ConstantsGCM.STATUS_on_of); payload.get(ConstantsGCM.STATUS_on_of) 的有效值;是“在线”或“离线”。

然后服务器更新用户状态并将新状态发送给用户的所有朋友。

与打字状态相同,但最后一步我只发送到活动聊天的另一端。 但是我遇到了诸如“用户在离线时出现在线,有时在他不在时出现打字”之类的问题。 有什么帮助或更有效的想法吗?

【问题讨论】:

【参考方案1】:

我不知道打字部分,但对于状态,也许你应该只发送给朋友这样的东西:“你应该检查这个用户的状态”然后每个朋友的电话都会直接得到真实的状态服务器。希望对你有帮助

【讨论】:

这不是完整的解决方案,我应该什么时候发送?每次打开封面?好的,如果他在我们谈话时离线? NOT:没有直接的方法可以知道应用程序是否可见,它很复杂。 不,您在事件发生时发送消息(用户状态更改),但是当朋友收到消息并打开对话时(或在必要时),他们会检查状态并显示它。 这里是主要问题:案例:您无法知道事件何时发生(离线).. 用户可能会按下主页按钮,因此如果他退出对话,但您无法知道(如开发人员,您不能每次在 onPause 调用时离线发送,他可能会导航到另一个活动或按 home )-当您给我一个部分解决方案时,我会给您(V)>> 您可以知道用户何时按下主页按钮:只需发送您的状态更新:onPause 方法:当您离开活动时调用此方法(通过按暂停,或通过启动新活动,所以确保它符合您的需求) 每次用户在我的应用程序中导航时,我都不能(或不想)发送离线消息,他可以离开封面,但在这种情况下仍然在应用程序中我不想离线发送>>> 所以按下我的应用程序的主屏幕或返回主屏幕将调用 onPause.. 并且 android 控制 [home] 按钮,因此不会告诉应用程序是否按下。

以上是关于通过 GCM 和 xmpp 输入状态/在线状态的主要内容,如果未能解决你的问题,请参考以下文章

修改 XMPP Presence 节

从 Android 以编程方式更改 Google Talk 在线状态

如何在 Android 中检测设备状态离线/在线

当用户的数据连接因 tigase 断开时,我如何解决不获取 XMPP 状态更新的问题

使用 strophe 获取在线用户列表 xmpp [关闭]

在XMPP中更改状态并上传头像[重复]