在android中使用xmpp的android-facebook聊天客户端

Posted

技术标签:

【中文标题】在android中使用xmpp的android-facebook聊天客户端【英文标题】:Android-facebook chat client using xmpp in android 【发布时间】:2012-05-10 04:42:20 【问题描述】:

我是 android 新手,现在我正在尝试使用 asmack 开发一个 facebook 聊天客户端,我可以使用以下代码登录, // 用于创建和授权连接 FBMessageListener 是消息监听类 公共字符串连接()抛出 XMPPException

    ConnectionConfiguration config = new ConnectionConfiguration("chat.facebook.com", 5222); // This is to avoid the keystore exception.
    config.setSASLAuthenticationEnabled(true);
    config.setDebuggerEnabled(true);
    config.setTruststorePath("/system/etc/security/cacerts.bks");
    config.setTruststorePassword("changeit");
    config.setTruststoreType("bks");

    connection = new XMPPConnection(config); 
    mFbml = new FBMessageListener(connection);

    try 
         
        SASLAuthentication.registerSASLMechanism( "X-FACEBOOK-PLATFORM", CustomSASLDigestMD5Mechanism.class);     

        connection.connect(); 

     
    catch (XMPPException e) 
         
        connection.disconnect();     
        e.printStackTrace(); 
    

    return connection.getConnectionID();
      
and for login 
connection.login(userName, password, FB_XMPP_HOST);  
 But the problem is the message is not sending . There is no error or exception in the logcat .That is why i am struggling !! This is my code to send the message..
ChatManager chatManager = connection.getChatManager();
// am able to get the userjid ..
 public void sendMessage() throws XMPPException 
    Chat chat = chatManager.createChat("userjid", mFbml);
    String text = "Testing client";
    Log.v(" Successsssssss===========", "Your Messge "+text+"has been sent");
    chat.sendMessage(text );
   
In Logcat showing when sending the 
message //userjid mentioned above
<message id="f4zMl-13" to="userjid" type="chat"><body>TEstingggggggggg</body>   <thread>QwLOE5</thread></message>
Please help me to do the chatting.!!

【问题讨论】:

This answer 解决您的问题。 嘿看 [这个链接][1] 它会给你帮助 [***.com/questions/11395185/… [1]: ***.com/questions/11395185/… [2]: ***.com/questions/11395185/… 【参考方案1】:

您可以使用具有 XMPP 客户端 API 的 SMACK.JAR

Smack

您可以在link 中找到适用于 Android 的 XMPP 客户端

【讨论】:

您好,感谢您回答我的问题,但我已经尝试了链接,但这对我不起作用。我认为 Facebook 聊天不同!如果您有任何工作代码,请将其发布。在 advane 中表示感谢【参考方案2】:

首先编辑你的 SASLXFacebookPlatformMechanism 类。复制并粘贴此代码。

package com.facebook.android;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

import org.apache.harmony.javax.security.auth.callback.CallbackHandler;
import org.apache.harmony.javax.security.sasl.Sasl;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.sasl.SASLMechanism;
import org.jivesoftware.smack.util.Base64;

import android.util.Log;

public class SASLXFacebookPlatformMechanism extends SASLMechanism 

    private static final String NAME              = "X-FACEBOOK-PLATFORM";

    private String              apiKey            = "";
    private String              accessToken        = "";

    /**
     * Constructor.
     */
    public SASLXFacebookPlatformMechanism(SASLAuthentication saslAuthentication) 
        super(saslAuthentication);
    

    @Override
    protected void authenticate() throws IOException, XMPPException 
        getSASLAuthentication().send(new AuthMechanism(NAME, ""));
    

    @Override
    public void authenticate(String apiKey, String host, String accessToken) throws IOException, XMPPException 
        if (apiKey == null || accessToken == null) 
            throw new IllegalArgumentException("Invalid parameters");
        

        this.apiKey = apiKey;
        this.accessToken = accessToken;
        this.hostname = host;

        String[] mechanisms =  "DIGEST-MD5" ;
        Map<String, String> props = new HashMap<String, String>();
        this.sc = Sasl.createSaslClient(mechanisms, null, "xmpp", host, props, this);
        authenticate();
    

    @Override
    public void authenticate(String username, String host, CallbackHandler cbh) throws IOException, XMPPException 
        String[] mechanisms =  "DIGEST-MD5" ;
        Map<String, String> props = new HashMap<String, String>();
        this.sc = Sasl.createSaslClient(mechanisms, null, "xmpp", host, props, cbh);
        authenticate();
    

    @Override
    protected String getName() 
        return NAME;
    

    @Override
    public void challengeReceived(String challenge) throws IOException 
        byte[] response = null;

        if (challenge != null) 
            String decodedChallenge = new String(Base64.decode(challenge));
            Map<String, String> parameters = getQueryMap(decodedChallenge);

            String version = "1.0";
            String nonce = parameters.get("nonce");
            String method = parameters.get("method");

            String composedResponse =
                "method=" + URLEncoder.encode(method, "utf-8") +
                        "&nonce=" + URLEncoder.encode(nonce, "utf-8") +
                        "&access_token=" + URLEncoder.encode(accessToken, "utf-8") +
                        "&api_key=" + URLEncoder.encode(apiKey, "utf-8") +
                        "&call_id=0" +
                        "&v=" + URLEncoder.encode(version, "utf-8");
            response = composedResponse.getBytes();
        

        String authenticationText = "";

        if (response != null) 
            authenticationText = Base64.encodeBytes(response);
        

        // Send the authentication to the server
        getSASLAuthentication().send(new Response(authenticationText));
    

    private Map<String, String> getQueryMap(String query) 
        Map<String, String> map = new HashMap<String, String>();
        String[] params = query.split("\\&");

        for (String param : params) 
            String[] fields = param.split("=", 2);
            map.put(fields[0], (fields.length > 1 ? fields[1] : null));
        

        return map;
    

然后在您的活动类中使用此方法登录 facebook。

private void testLogin()
        ConnectionConfiguration config = new ConnectionConfiguration("chat.facebook.com", 5222);
        config.setSASLAuthenticationEnabled(true);
        config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
        xmpp = new XMPPConnection(config);
        SASLAuthentication.registerSASLMechanism("X-FACEBOOK-PLATFORM",SASLXFacebookPlatformMechanism.class);
        SASLAuthentication.supportSASLMechanism("X-FACEBOOK-PLATFORM", 0);
        Log.i("XMPPClient",
                "Access token to " + mFacebook.getAccessToken());
        Log.i("XMPPClient",
                "Access token to " + mFacebook.getAppId());
        Log.i("XMPPClient",
                "Access token to " + mFacebook.getAccessToken());
        try 
            xmpp.connect();
            Log.i("XMPPClient",
                    "Connected to " + xmpp.getHost());

         catch (XMPPException e1) 
            Log.i("XMPPClient",
                    "Unable to " + xmpp.getHost());

            e1.printStackTrace();
        
        try 
            xmpp.login(PreferenceConnector.APP_ID, mFacebook.getAccessToken());
            Log.i("XMPPClient",
                    " its logined ");


         catch (XMPPException e) 
            e.printStackTrace();
          
    

【讨论】:

以上是关于在android中使用xmpp的android-facebook聊天客户端的主要内容,如果未能解决你的问题,请参考以下文章

在android中使用xmpp的android-facebook聊天客户端

如何使用 XMPP 和 GCM 在 Android 中制作聊天应用程序

在 xmpp for android 中获取生日、性别、手机

使用 xmpp + smack + openfire 在 android 中阻止用户

在 Android 中使用 xmpp/UserSearchManager 搜索现有用户

在android中使用xmpp从服务器获取所有注册用户[关闭]