2012-06-15 13 views
8

मैं FACEBOOK के लिए XMPP क्लाइंट बना रहा हूं। मैंने जीमेल के लिए यह किया, अब मुझे फेसबुक के लिए एक ही बनाना है। मैंने कुछ कोड प्राप्त करने के लिए बहुत कुछ किया, फिर भी मुझे इस प्रकार की त्रुटियां मिल रही हैं Not connected to server और service-unavailable(503)फेसबुक के लिए एक्सएमपीपी चैट क्लाइंट कैसे बनाएं?

यहां मैं कोड जो साझा कर रहा हूं उसे साझा कर रहा हूं।

public class ClientJabberActivity extends Activity { 

ArrayList<String> m_discussionThread; 
ArrayAdapter<String> m_discussionThreadAdapter; 
XMPPConnection m_connection; 
private Handler m_handler; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    m_handler = new Handler(); 

    try { 
     initConnection(); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } 

    final EditText recipient = (EditText) this.findViewById(R.id.recipient); 
    final EditText message = (EditText) this.findViewById(R.id.message); 
    ListView list = (ListView) this.findViewById(R.id.thread); 

    m_discussionThread = new ArrayList<String>(); 
    m_discussionThreadAdapter = new ArrayAdapter<String>(this, 
      R.layout.multi_line_list_item, m_discussionThread); 
    list.setAdapter(m_discussionThreadAdapter); 

    Button send = (Button) this.findViewById(R.id.send); 
    send.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 

      String to = recipient.getText().toString(); 
      String text = message.getText().toString(); 

      Message msg = new Message(to, Message.Type.chat); 
      msg.setBody(text); 
      m_connection.sendPacket(msg); 
      m_discussionThread.add(" Me : "); 
      m_discussionThread.add(text); 
      m_discussionThreadAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 

private void initConnection() throws XMPPException { 

    ConnectionConfiguration config = new ConnectionConfiguration(
      "chat.facebook.com", 5222, "chat.facebook.com"); 
    config.setSASLAuthenticationEnabled(true); 
    m_connection = new XMPPConnection(config); 
    try { 
     SASLAuthentication.registerSASLMechanism("X-FACEBOOK-PLATFORM", 
       SASLXFacebookPlatformMechanism.class); 
     SASLAuthentication.supportSASLMechanism("X-FACEBOOK-PLATFORM", 0); 
     m_connection.connect();   
     m_connection.login(apiKey + "|" + sessionKey, sessionSecret, "Application"); 
    } catch (XMPPException e) { 
     m_connection.disconnect(); 
     e.printStackTrace(); 
    } 

    Presence presence = new Presence(Presence.Type.available); 
    m_connection.sendPacket(presence); 

    PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 

    m_connection.addPacketListener(new PacketListener() { 
     public void processPacket(Packet packet) { 
      Message message = (Message) packet; 
      if (message.getBody() != null) { 
       String fromName = StringUtils.parseBareAddress(message 
         .getFrom()); 
       m_discussionThread.add(fromName + ":"); 
       m_discussionThread.add(message.getBody()); 

       m_handler.post(new Runnable() { 
        public void run() { 
         m_discussionThreadAdapter.notifyDataSetChanged(); 
        } 
       }); 
      } 
     } 
    }, filter); 

    ChatManager chatmanager = m_connection.getChatManager(); 
    chatmanager.addChatListener(new ChatManagerListener() { 
     public void chatCreated(final Chat chat, 
       final boolean createdLocally) { 
      chat.addMessageListener(new MessageListener() { 
       public void processMessage(Chat chat, Message message) { 
        System.out.println("Received message: " 
          + (message != null ? message.getBody() : "NULL")); 
        Log.i("CHAT USER", 
          "Received message is: " + message.getBody()); 
       } 
      }); 
     } 
    }); 
} 
} 

और इस वर्ग के SASLXFacebookPlatformMechanism

मैं यह कैसे xmpp.login(apiKey + "|" + sessionKey, sessionSecret, "Application"); मुझे पता है कि कैसे acessToken, फेसबुक के लिए आवेदन कुंजी प्राप्त करने के लिए की तरह प्रवेश कर सकते हैं। मुझे sessionKey, sessionSecret के बारे में पता नहीं है कि उन मानों को कैसे प्राप्त करें और इस समस्या को कैसे हल करें।

तो मैं xmpp.login(apiKey, accessToken, "Application"); मैं इस त्रुटि हो रही है का उपयोग --IllegalArgumentException: API कुंजी या सत्र कुंजी नहीं मौजूद है

संपादित करें: अंत में मैं अमल समाधान से समाधान मिल गया: xmpp.login(apiKey, accessToken, "Application");

+0

कुछ जवाब में पहुँच टोकन इस "| sessionKey | कुछ somethingElse" की तरह दिखता है, लेकिन मेरी पहुँच टोकन इस तरह दिखता है - AAABeS1oNtyABANFNGJRZBLn5G1SKzj3jKlSi36F2iagYi0lhwvnt0ZAHtSxbWWZB8Ehq3CY3x5JxNz5wKSAlj5xagXAm4qxPJkOh3KMTEy1HeVmNZC1l। दोनों अलग क्यों हैं .. –

+0

क्या यह फेसबुक एसडीके एक्सेस टोकन प्रारूप को बदलता है .. –

+0

क्या आप मुझे एफबी चैट को लागू करने के लिए अपने एंड्रॉइड प्रोजेक्ट में एक्सएमपीपी, सासल और कनेक्शन कॉन्फ़िगरेशन आयात करने के लिए जार डाउनलोड करने के लिए एक लिंक दे सकते हैं। – Arun

उत्तर

14

पहुंच टोकन प्राप्त करने के लिए पहले आप प्रवेश करने के

fb.authorize(FacebookActivity.this, new String[] {"xmpp_login"},Facebook.FORCE_DIALOG_AUTH, new DialogListner()); 

SASLXFacebookPlatformMecha वर्ग

import java.io.IOException; 
import java.net.URLEncoder; 
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; 

public class SASLXFacebookPlatformMecha extends SASLMechanism { 

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

private String apiKey = ""; 
private String access_token = ""; 

/** 
* Constructor. 
*/ 
public SASLXFacebookPlatformMecha(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 acces_token) 
     throws IOException, XMPPException { 
    if (apiKey == null || acces_token == null) { 
     throw new IllegalArgumentException("Invalid parameters"); 
    } 

    this.access_token = acces_token; 
    this.apiKey = apiKey; 
    this.hostname = host; 

    String[] mechanisms = { NAME }; 
    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 = { NAME }; 
    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"); 

     long callId = new GregorianCalendar().getTimeInMillis(); 

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

     response = composedResponse.getBytes("utf-8"); 
    } 

    String authenticationText = ""; 

    if (response != null) { 
     authenticationText = Base64.encodeBytes(response, 
       Base64.DONT_BREAK_LINES); 
    } 

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

मैं ChatManager वर्ग बनाया है

import org.jivesoftware.smack.Chat; 
import org.jivesoftware.smack.ChatManagerListener; 
import org.jivesoftware.smack.ConnectionConfiguration; 
import org.jivesoftware.smack.MessageListener; 
import org.jivesoftware.smack.Roster; 
import org.jivesoftware.smack.RosterListener; 
import org.jivesoftware.smack.SASLAuthentication; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.packet.Presence; 
import org.jivesoftware.smack.packet.Presence.Type; 
import org.jivesoftware.smackx.pubsub.PresenceState; 

public class FacebookChatManager { 

private static FacebookChatManager chatManager; 
private XMPPConnection connection; 
private final String SERVER = "chat.facebook.com"; 
private final int PORT = 5222; 
private final String FACEBOOK_MECHANISM = "X-FACEBOOK-PLATFORM"; 
private RosterListener rosterListner; 

private FacebookChatManager(RosterListener rosterListner) 
{ 
    this.rosterListner = rosterListner; 
    ConnectionConfiguration connFig = new ConnectionConfiguration(SERVER, 
      PORT); 
    connFig.setSASLAuthenticationEnabled(true); 
    connection = new XMPPConnection(connFig); 
    //setup facebook authentication mechanism 
    SASLAuthentication.registerSASLMechanism(FACEBOOK_MECHANISM, 
      SASLXFacebookPlatformMecha.class); 
    SASLAuthentication.supportSASLMechanism(FACEBOOK_MECHANISM, 0); 
} 

public static FacebookChatManager getInstance(RosterListener rosterListner) 
{ 
    if(chatManager == null) 
    { 
     chatManager = new FacebookChatManager(rosterListner); 
    } 
    return chatManager; 
} 

public boolean connect() 
{ 
    try { 
     connection.connect(); 
     return true; 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
     connection.disconnect(); 
    } 
    return false; 
} 

public void disConnect() 
{ 
    connection.disconnect(); 
} 

public boolean logIn(String apiKey, String accessToken) 
{ 
    try { 
     connection.login(apiKey, accessToken); 
     setPresenceState(Presence.Type.available, ""); 
     connection.getRoster().addRosterListener(rosterListner); 
     return true; 
    } catch (XMPPException e) { 
     connection.disconnect(); 
     e.printStackTrace(); 
    } 
    return false; 
} 

public Roster getRoster() 
{ 
    return connection.getRoster(); 
} 

public Chat createNewChat(String user, MessageListener messageListner) 
{ 
    return connection.getChatManager().createChat(user, messageListner); 
} 

public void registerNewIncomingChatListner(ChatManagerListener chatManagerListner) 
{ 
    connection.getChatManager().addChatListener(chatManagerListner); 
} 

public void setPresenceState(Type precenseType, String status) 
{ 
    Presence presence = new Presence(precenseType); 
    presence.setStatus(status); 
    connection.sendPacket(presence); 
} 

public Presence getUserPresence(String userId) 
{ 
    return connection.getRoster().getPresence(userId); 
} 
} 

अंत में उस FacebookChatManager वर्ग टिप्पणी उपयोग करने के लिए है कि rosterListnr अपने मित्रों को राज्य परिवर्तन के बारे में जानकारी पाने के लिए एक को लागू के रूप में आप चाहते हैं

FacebookChatManager facebookChatManager = FacebookChatManager.getInstance(rosterListner); 

if (facebookChatManager.connect()) { 
      if (facebookChatManager.logIn(FacebookActivity.APP_ID, 
        access_token)) { 
       return facebookChatManager.getRoster(); 
      } 
     } 
+0

हाय, आपकी प्रतिक्रिया के लिए धन्यवाद, मैं उस access_token को प्राप्त करने में सक्षम हूं, फिर भी मुझे त्रुटि मिल रही है जो सर्वर त्रुटि से कनेक्ट नहीं है। –

+0

@RajaReddyP क्या आप मुझे बता सकते हैं कि यह त्रुटि मेरे द्वारा पोस्ट किए गए कोड के साथ उत्पन्न हुई है, मुझे आपके पास कोई त्रुटि नहीं है, आपको लॉग इन करने से पहले कनेक्ट करना होगा xmpp जैसा कि मैंने अंतिम कोड खंड – Amal

+0

में किया था, मैं इसे एक बार फिर स्पष्ट रूप से देख सकता हूं मैंने गलत किया जांच के बाद आपको बताएं। –

6

आपको एक पहुँच की जरूरत है टोकन। http://developers.facebook.com/tools/access_token/

अधिक जानकारी के लिए http://developers.facebook.com/docs/chat/

+0

को हल करने के लिए यह टूल सामान्य टोकन से अलग था? मैं क्यों पूछ रहा हूं कि मैंने पिछले ऐप में एफबी एसडीके पर काम किया है, मुझे यहां एक बड़ा टोकन मिला है जो उससे छोटा दिखाता है।और मैं गतिशील bez द्वारा यह टोकन कैसे प्राप्त कर सकते हैं। यह समाप्त हो जाएगा। –

+2

@RajaReddy पी टोकन जो आप यहां से प्राप्त करते हैं, परीक्षण के लिए है, लेकिन आपको आमतौर पर एसडीके से प्राप्त टोकन का उपयोग करना चाहिए। APIKey और accessToken का उपयोग करने के लिए कृपया मेरा उत्तर देखें http://stackoverflow.com/questions/5317329/xmpp-with-java-asmack-library-supporting-x-facebook-platform/11099138#11099138 – Amal

+0

@Amal i didt अपने कोड से कुछ प्राप्त करें .... –

0

कनेक्शन के लिए एंड्रॉयड 2.2 उच्च AsyncTask में किया जाना चाहिए प्रयोग किया जाता है ..

private class AsyncCallWS extends AsyncTask<Void, Void, Void> { 
@Override 
protected Void doInBackground(Void... params) { 
    Log.i(TAG, "doInBackground"); 
    calculate(); 
    return null; 
} 

@Override 
protected void onPostExecute(Void result) { 
    Log.i(TAG, "onPostExecute"); 
} 

@Override 
protected void onPreExecute() { 
    Log.i(TAG, "onPreExecute"); 
} 

@Override 
protected void onProgressUpdate(Void... values) { 
    Log.i(TAG, "onProgressUpdate"); 
} 

public void calculate() 
{ 
    Session s = Session.getActiveSession(); 
    ConnectionConfiguration config = new ConnectionConfiguration("chat.facebook.com", 5222); 
    config.setSASLAuthenticationEnabled(true); 
    XMPPConnection mFbConnection = new XMPPConnection(config); 


     SASLAuthentication.registerSASLMechanism("X-FACEBOOK-PLATFORM", SASLXFacebookPlatformMechanism.class); 
     SASLAuthentication.supportSASLMechanism("X-FACEBOOK-PLATFORM", 0); 

     try { 
      mFbConnection.connect();  

      Log.i("XMPPClient", 
        "Connected to " + mFbConnection.getHost()); 

      mFbConnection.login("7028228197XXXXXX",s.getAccessToken(),"Application"); 
      Roster roster = mFbConnection.getRoster(); 
      Collection<RosterEntry> entries = roster.getEntries(); 

      Log.i("XMPPClient","\n\n"+ entries.size() + " buddy(ies):"); 

      // shows first time onliners----> 
      String temp[] = new String[50]; 
      int i = 0; 
      for (RosterEntry entry : entries) {  
       String user = entry.getName(); 
       Log.i("TAG", user); 
       } 


     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
} 
} 

अनुमतियां जोड़ने के लिए मत भूलना।

private static final List<String> PERMISSIONS = Arrays.asList("xmpp_login"); 
if(checkPermissions()) 
    { 
     AsyncCallWS task = new AsyncCallWS(); 
     task.execute(); 
    } 
    else 
    { 
     requestPermissions(); 
    } 


public boolean checkPermissions() { 
    Session s = Session.getActiveSession(); 
    if (s!=null) { 
     return s.getPermissions().contains("xmpp_login"); 
    } 
    else 
     return false; 
} 

public void requestPermissions() { 
    Session s = Session.getActiveSession(); 
    if (s!=null) 
     s.requestNewReadPermissions(new Session.NewPermissionsRequest(this, PERMISSIONS)); 
} 
संबंधित मुद्दे