2011-12-19 5 views
0

Facebookのメッセージ送信機能を持つアプリを開発中です。 facebbookのログインから私は壁のポストではなく私の友人にメッセージを送信したい、私はメッセージを壁のポストや何かを送信したい。私はいくつかの解決策を提供してください知っている限りXMPPの一種が使用されています。アンドロイドのメッセージボックスにfacebookの友達にメッセージを送りたい

解決策を緊急に提案してください。

おかげで、すべての ゴパル

答えて

0

まず、あなたの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; 
    } 
} 

次に、あなたがしてログを終了すれば

private void LoginToFaceBook(){ 
     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()); 




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

をするFacebookログインするために、このメソッドを使用します。このリンクを使用して、名簿を取得し、メッセージを送信します。

http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/

+0

コードを共有してくれてありがとう!私はこれをしばらくの間稼働させようと努力してきました。あなたのプロジェクトファイルを共有しようと思っていますので、xmppを使って作業しているfacebookメッセージアプリケーションを見てください。それとも、Facebookのメッセージングに関連する他のファイルだけです。私はhttp://stackoverflow.com/questions/13079632/facebook-asmack-xmpp-client-returns-random-numbers-for-rosterでオープンな質問をしています。もしあなたが私を助けることができます、ありがとう! – Peter

+0

私はそれをチェックし、今すぐ試してみるよ、 – Peter

+0

@JanshairKhan私はあなたのコードとSmackの新しい3.3.0バージョンに問題があります。 Smackの更新コードを採用しましたか? –