2012-06-25 2 views
2

this blog에서 제안한대로 채팅 지원을 구현하려고합니다.Asmack API로 안드로이드의 페이스 북 채팅을

현재 다음 코드를 사용하여 채팅 인터페이스를 구현하고 있습니다.

자바 코드

TestChatActivity.java

import java.util.ArrayList; 
import org.jivesoftware.smack.ConnectionConfiguration; 
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode; 
import org.jivesoftware.smack.PacketListener; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.filter.MessageTypeFilter; 
import org.jivesoftware.smack.filter.PacketFilter; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.packet.Packet; 
import org.jivesoftware.smack.packet.Presence; 
import org.jivesoftware.smack.util.StringUtils; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 

public class TestChatActivity extends Activity implements OnClickListener { 

private ArrayList<String> messages = new ArrayList(); 
private Handler mHandler = new Handler(); 
private EditText mRecipient; 
private EditText mSendText; 
private ListView mList; 
private XMPPConnection mConnection; 
private String mHost, mPort, mService, mUsername, mPassword; 
private ConnectionConfiguration mConnConfig; 
private String TAG; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    initLayout(); 
    // initGtalk(); 
    initFB(); 

    // Create a connection 
    createConnection(); 

    // login 
    loginToXMPP(); 

} 

void initLayout() { 
    Log.i("XMPPClient", "onCreate called"); 
    setContentView(R.layout.main); 

    mRecipient = (EditText) this.findViewById(R.id.recipient); 
    Log.i("XMPPClient", "mRecipient = " + mRecipient); 
    mSendText = (EditText) this.findViewById(R.id.sendText); 
    Log.i("XMPPClient", "mSendText = " + mSendText); 
    mList = (ListView) this.findViewById(R.id.listMessages); 
    Log.i("XMPPClient", "mList = " + mList); 
    // Set a listener to send a chat text message 
    Button send = (Button) this.findViewById(R.id.send); 
    send.setOnClickListener(this); 

    setListAdapter(); 
} 

void initGtalk() { 
    mHost = "talk.google.com"; 
    mPort = "5222"; 
    mService = "gmail"; 
    mUsername = "[email protected]"; 
    mPassword = "password"; 
    // Set Default recipients for Gtalk 
    mRecipient.setText("[email protected]"); 
} 

void initFB() { 
    mHost = "chat.facebook.com"; 
    mPort = "5222"; 
    mService = "xmpp"; 
    mUsername = "[email protected]"; 
    mPassword = "password"; 
    // Set Default recipients for FB 
    mRecipient.setText("[email protected]"); 
} 

void createConnection() { 
    mConnConfig = new ConnectionConfiguration(mHost, 
      Integer.parseInt(mPort), mService); 
    mConnConfig.setSecurityMode(SecurityMode.required); 
    mConnConfig.setSASLAuthenticationEnabled(true); 
    mConnection = new XMPPConnection(mConnConfig); 

    try { 
     mConnection.connect(); 
     Log.i("XMPPClient", 
       "[SettingsDialog] Connected to " + mConnection.getHost()); 
    } catch (XMPPException ex) { 
     Log.e("XMPPClient", "[SettingsDialog] Failed to connect to " 
       + mConnection.getHost()); 
     Log.e("XMPPClient", ex.toString()); 
     setConnection(null); 
    } 
} 

void loginToXMPP() { 
    try { 
     mConnection.login(mUsername, mPassword); 
     Log.i("XMPPClient", "Logged in as " + mConnection.getUser()); 

     // Set the status to available 
     Presence presence = new Presence(Presence.Type.available); 
     mConnection.sendPacket(presence); 
     setConnection(mConnection); 
    } catch (XMPPException ex) { 
     Log.e("XMPPClient", "[SettingsDialog] Failed to log in as " 
       + mUsername); 
     Log.e("XMPPClient", ex.toString()); 
     setConnection(null); 
    } 
} 

/** 
* Called by Settings dialog when a connection is established with the XMPP 
* server 
* 
* @param connection 
*/ 
public void setConnection(XMPPConnection connection) { 
    this.mConnection = connection; 
    if (connection != null) { 
     // Add a packet listener to get messages sent to us 
     PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 
     connection.addPacketListener(new PacketListener() { 
      public void processPacket(Packet packet) { 
       Message message = (Message) packet; 
       if (message.getBody() != null) { 
        String fromName = StringUtils.parseBareAddress(message 
          .getFrom()); 
        Log.i("XMPPClient", "Got text [" + message.getBody() 
          + "] from [" + fromName + "]"); 
        messages.add(fromName + ":"); 
        messages.add(message.getBody()); 
        // Add the incoming message to the list view 
        mHandler.post(new Runnable() { 
         public void run() { 
          setListAdapter(); 
         } 
        }); 
       } 
      } 
     }, filter); 
    } 
} 

private void setListAdapter() { 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      R.layout.multi_line_list_item, messages); 
    mList.setAdapter(adapter); 
} 

public void onClick(View v) { 
    if (v.getId() == R.id.send) { 
     String to = mRecipient.getText().toString(); 
     String text = mSendText.getText().toString(); 

     Log.i("XMPPClient", "Sending text [" + text + "] to [" + to + "]"); 
     Message msg = new Message(to, Message.Type.chat); 
     msg.setBody(text); 
     mConnection.sendPacket(msg); 
     messages.add(mConnection.getUser() + ":"); 
     messages.add(text); 
     setListAdapter(); 
    } 

} 
} 

레이아웃

main.xml에

코드 위 6,

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:minWidth="70dp" 
     android:text="Recipient:" /> 

    <EditText 
     android:id="@+id/recipient" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:autoText="false" 
     android:capitalize="none" 
     android:minWidth="250dp" 
     android:scrollHorizontally="true" 
     android:singleLine="true" 
     android:textSize="16sp" /> 
</LinearLayout> 

<ListView 
    android:id="@+id/listMessages" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:scrollbars="horizontal" /> 

<EditText 
    android:id="@+id/sendText" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:autoText="false" 
    android:capitalize="none" 
    android:scrollHorizontally="true" 
    android:singleLine="true" 
    android:textSize="16sp" /> 

<Button 
    android:id="@+id/send" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Send" > 
</Button> 

</LinearLayout> 

multi_line_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/text1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:singleLine="false" 
android:textStyle="bold" /> 

Asmack 도서관

Google 토크 나를 위해 잘 작동하지만, 페이스 북이 코드와 함께 일하지 채팅을 사용합니다. 논의 된 바와 같이 내가 그와 페이스 북 지원 XMPP 채팅 지원에 많은 R & D를 수행했기 때문에 :(

페이스 북 채팅 연결에 사용되는 특별한 구성? 또는 채팅을?

을 페이스 북으로 연결하는 잘못이 방법이 있나요 내가 생각하고 '그래서 Facebook XMPP chat Settings,이 작업해야합니다.

누구 페이스 북은 안드로이드에 채팅이 문제를 해결하는 데 도움이 있습니다 구현했습니다. 사전에

감사합니다 ...!

+1

나에게도 같은 문제가 있습니다. 해결책을 찾고 있습니다. http://stackoverflow.com/questions/11045241/how-to-create-xmpp-chat-client-for-facebook –

답변

3

모든 코드를 Beem Project으로 확인하고 Facebook 채팅 API 연결 솔루션을 찾았습니다. 안드로이드에서 페이스 북 채팅 API를 구현하기위한

단계 :

  1. 먼저 우리는 기존의 프로젝트 MemorizingTrustManager 도서관 프로젝트를 구현해야합니다.

    =>이를 위해 기존 프로젝트에 세 개의 파일을 다음 복사해야

    • MemorizingTrustManager/SRC/드/duenndns/SSL/MTMDecision.java
    • MemorizingTrustManager/SRC/드/duenndns/SSL/MemorizingActivity.java
    • MemorizingTrustManager/SRC/드/duenndns/SSL/MemorizingTrustManager.java

    => 그리고 값에 다음 값을 추가/문자열입니다.XML

    <resources> 
        <string name="mtm_accept_cert">Accept Unknown Certificate?</string> 
        <string name="mtm_decision_always">Always</string> 
        <string name="mtm_decision_once">Once</string> 
        <string name="mtm_decision_abort">Abort</string> 
        <string name="mtm_notification">Certificate Verification</string> 
    </resources> 
    
  2. 두 번째 단계, 대신 SASLAuthentication 같은 X-페이스 북 플랫폼를 사용, 당신은 페이스 북으로 연결하는 코드를 다음 사용 및 로그인하여 페이스 북 재버 ID (사용자 이름 @ 채팅을 사용 할 수 있습니다 .facebook.com)에서 지난

    public void connectToFb() throws XMPPException { 
    
    ConnectionConfiguration config = new ConnectionConfiguration("chat.facebook.com", 5222); 
    config.setSASLAuthenticationEnabled(true); 
    config.setSecurityMode(SecurityMode.required); 
    config.setRosterLoadedAtLogin(true); 
    config.setTruststorePath("/system/etc/security/cacerts.bks"); 
    config.setTruststorePassword("changeit"); 
    config.setTruststoreType("bks"); 
    config.setSendPresence(false); 
    try { 
        SSLContext sc = SSLContext.getInstance("TLS"); 
        sc.init(null, MemorizingTrustManager.getInstanceList(this), new java.security.SecureRandom()); 
        config.setCustomSSLContext(sc); 
    } catch (GeneralSecurityException e) { 
        Log.w("TAG", "Unable to use MemorizingTrustManager", e); 
    } 
    XMPPConnection xmpp = new XMPPConnection(config); 
    try { 
        xmpp.connect(); 
        xmpp.login("facebookusername", "****"); // Here you have to used only facebookusername from [email protected] 
        Roster roster = xmpp.getRoster(); 
        Collection<RosterEntry> entries = roster.getEntries(); 
        System.out.println("Connected!"); 
        System.out.println("\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.getUser(); 
         Log.i("TAG", user); 
        } 
    } catch (XMPPException e) { 
        xmpp.disconnect(); 
        e.printStackTrace(); 
    } 
    } 
    

을, 당신은 당신의 모든 친구의 목록을 얻을 경우 r LogCat View의 Facebook 계정, this tutorial을 사용하여 간단한 Facebook 채팅을 구현할 수있는 것보다.

업데이트 : Facebook 메신저로 작동하고 곧 GitHub에 게시되는 샘플 앱에서도 작업하고 있습니다.

+0

안녕하세요 Hitesh Patel. FB 채팅을 구현하기 위해 내 안드로이드 프로젝트에서 XMPP 및 ConnectionConfiguration을 가져 오기 위해 항아리를 다운로드 할 수있는 링크를주세요. – Arun

+0

@Hitesh Patel 안녕하세요, 해 보셨습니까? 업로드 된 경우이 프로젝트의 GitHub 저장소에 대한 링크를 제공하십시오. 감사합니다. –

+0

안녕하세요. 인증 경로를 찾을 수없는 '신뢰 앵커'오류가 발생했습니다. –

관련 문제