Quickblox android sdk 群聊

Posted

技术标签:

【中文标题】Quickblox android sdk 群聊【英文标题】:Quickblox android sdk groupchat 【发布时间】:2013-12-22 16:17:33 【问题描述】:

我正在使用 quickblox sdk 群聊。 这是我的代码。但我还是错了。有人可以指导我吗?

UserListForGroupActivity.java

公共类 UserListForGroupActivity 扩展 Activity 实现 QBCallback

private ListView usersList;
private ProgressDialog progressDialog;
private Button btnChat;
private SimpleAdapter usersAdapter;
private ArrayList<Friend_Users> friends= new ArrayList<Friend_Users>();
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_list_for_group);

    usersList = (ListView) findViewById(R.id.usersList);
    btnChat=(Button)findViewById(R.id.btnstartGroupChat);

    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading fiends list");
    progressDialog.show();

    // ================= QuickBlox ===== Step 4 =================
    // Get all users of QB application.
    QBUsers.getUsers(this);



@Override
public void onComplete(Result result) 
    if (result.isSuccess()) 
        if (progressDialog != null) 
            progressDialog.dismiss();
        

        // Cast 'result' to specific result class QBUserPagedResult.
        QBUserPagedResult pagedResult = (QBUserPagedResult) result;
        final ArrayList<QBUser> users = pagedResult.getUsers();
        System.out.println(users.toString());
        // Prepare users list for simple adapter.
        ArrayList<Map<String, String>> usersListForAdapter = new ArrayList<Map<String, String>>();
        for (QBUser u : users) 
            Map<String, String> umap = new HashMap<String, String>();
            umap.put("userLogin", u.getLogin());
            umap.put("chatLogin", QBChat.getChatLoginFull(u));
            usersListForAdapter.add(umap);
        

        // Put users list into adapter.
         usersAdapter = new SimpleAdapter(this, usersListForAdapter,
                android.R.layout.simple_list_item_multiple_choice,
                new String[]"userLogin", "chatLogin",
                new int[]android.R.id.text1, android.R.id.text2);
        usersList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        usersList.setAdapter(usersAdapter);

       btnChat.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub

                SparseBooleanArray checked= usersList.getCheckedItemPositions();
                for (int i = 0; i < checked.size(); i++) 
                    // Item position in adapter
                    int position = checked.keyAt(i);
                    // Add sport if it is checked i.e.) == TRUE!
                    if (checked.valueAt(i))
                    
                        QBUser friendUser = users.get(position);
                        String login, password;
                        int id;
                        id=friendUser.getId();
                        login=friendUser.getLogin();
                        password=friendUser.getPassword();
                        friends.add(new Friend_Users(id,login, password));
                    
                
                Friend_Users_Wrapper wrapper= new Friend_Users_Wrapper(friends);
                Log.e("UserListForGroupAcitvity friend list pass intent=>", friends.size()+ friends.get(0).getLogin());
                Bundle extras = getIntent().getExtras();

                Intent intent=new Intent(UserListForGroupActivity.this, GroupChatActivity.class);
                intent.putExtra("friends", wrapper);                
                intent.putExtras(extras);
                startActivity(intent);

            
        );

     else 
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        dialog.setMessage("Error(s) occurred. Look into DDMS log for details, " +
                "please. Errors: " + result.getErrors()).create().show();
    



@Override
public void onComplete(Result result, Object context)  

GroupChatActivity.java

公共类 GroupChatActivity 扩展 Activity

private EditText messageText;
private TextView meLabel;
private TextView friendLabel;
private ViewGroup messagesContainer;
private ScrollView scrollContainer;
private QBUser me;
private GroupChatController groupChatController;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat);

    // Load QBUser objects from bundle (passed from previous activity).
    Bundle extras = getIntent().getExtras();

    Friend_Users_Wrapper wrapper= (Friend_Users_Wrapper) getIntent().getSerializableExtra("friends"); 
    ArrayList<Friend_Users> friendArray= wrapper.getFriend_Users();
    me = new QBUser();
    me.setId(extras.getInt("myId"));
    me.setLogin(extras.getString("myLogin"));
    me.setPassword(extras.getString("myPassword"));
    System.out.println("user login =>"+extras.getString("myLogin"));
    QBUser friends= new QBUser();
    for (Friend_Users friend_Users : friendArray) 
        friends.setId(friend_Users.getId());
        friends.setLogin(friend_Users.getLogin());
        friends.setPassword(friend_Users.getPassword());
    



    // UI stuff
    messagesContainer = (ViewGroup) findViewById(R.id.messagesContainer);
    scrollContainer = (ScrollView) findViewById(R.id.scrollContainer);

    Button sendMessageButton = (Button) findViewById(R.id.sendButton);
    sendMessageButton.setOnClickListener(onSendMessageClickListener);

    messageText = (EditText) findViewById(R.id.messageEdit);

    // ================= QuickBlox ===== Step 5 =================
    // Get chat login based on QuickBlox user account.
    // Note, that to start chat you should use only short login,
    // that looks like '17744-1028' (<qb_user_id>-<qb_app_id>).
    String chatLogin = QBChat.getChatLoginShort(me);

    // Our current (me) user's password.
    String password = me.getPassword();    

    if (me != null && friends != null) 


        // ================= QuickBlox ===== Step 6 =================
        // All chat logic can be implemented by yourself using
        // ASMACK library (https://github.com/Flowdalic/asmack/downloads)
        // -- Android wrapper for Java XMPP library (http://www.igniterealtime.org/projects/smack/).
        groupChatController = new GroupChatController(chatLogin, password);
        groupChatController.setOnMessageReceivedListener(onMessageReceivedListener);

        // ================= QuickBlox ===== Step 7 =================
        // Get friend's login based on QuickBlox user account.
        // Note, that for your companion you should use full chat login,
        // that looks like '17792-1028@chat.quickblox.com' (<qb_user_id>-<qb_app_id>@chat.quickblox.com).
        // Don't use short login, it
        String friendLogin = QBChat.getChatLoginFull(friends);

        groupChatController.startChat(friendLogin);
    


private void sendMessage() 
    if (messageText != null) 
        String messageString = messageText.getText().toString();
        groupChatController.sendMessage(messageString);
        messageText.setText("");
        showMessage(me.getLogin() + " (me) : "+messageString, true);
    


private GroupChatController.OnMessageReceivedListener onMessageReceivedListener = new GroupChatController.OnMessageReceivedListener() 
    @Override
    public void onMessageReceived(final Message message) 
        String messageString = message.getBody();
        showMessage(messageString, false);
    
;

private void showMessage(String message, boolean leftSide) 
    final TextView textView = new TextView(GroupChatActivity.this);
    textView.setTextColor(Color.BLACK);
    textView.setText(message);

    int bgRes = R.drawable.left_message_bg;

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

    if (!leftSide) 
        bgRes = R.drawable.right_message_bg;
        params.gravity = Gravity.RIGHT;
    

    textView.setLayoutParams(params);

    textView.setBackgroundResource(bgRes);

    runOnUiThread(new Runnable() 
        @Override
        public void run() 
            messagesContainer.addView(textView);

            // Scroll to bottom
            if (scrollContainer.getChildAt(0) != null) 
                scrollContainer.scrollTo(scrollContainer.getScrollX(), scrollContainer.getChildAt(0).getHeight());
            
            scrollContainer.fullScroll(View.FOCUS_DOWN);
        
    );


private View.OnClickListener onSendMessageClickListener = new View.OnClickListener() 
    @Override
    public void onClick(View view) 
        sendMessage();
    
;

GroupChatController.java

公共类 GroupChatController

// Get QuickBlox chat server domain.
// There will be created connection with chat server below.
public static final String CHAT_SERVER = QBChat.getChatServerDomain();

private XMPPConnection connection;

private ConnectionConfiguration config;

private Chat chat;
// Multi-User Chat
private MultiUserChat muc2;

private String chatLogin;
private String password;
private String friendLogin;

private ChatManager chatManager;

public GroupChatController(String chatLogin, String password) 
    this.chatLogin = chatLogin;
    this.password = password;


public void startChat(String buddyLogin) 
    this.friendLogin = buddyLogin;

    new Thread(new Runnable() 
        @Override
        public void run() 
            // Chat action 1 -- create connection.
            Connection.DEBUG_ENABLED = true;
            config = new ConnectionConfiguration(CHAT_SERVER);
            connection = new XMPPConnection(config);

            try 
                connection.connect();
                connection.login(chatLogin, password);

                // Chat action 2 -- create chat manager.
                chatManager = connection.getChatManager();

                // Chat action 3 -- create chat.
                chat = chatManager.createChat(friendLogin, messageListener);

                // Set listener for outcoming messages.
                chatManager.addChatListener(chatManagerListener);

                // Muc 2 
                if(connection != null)
                    muc2 = new MultiUserChat(connection, "2389_chat1@muc.chat.quickblox.com");
                    // Discover whether user3@host.org supports MUC or not

                    // The room service will decide the amount of history to send
                    muc2.join(chatLogin);
                    muc2.invite(friendLogin, "Welcome!");
                    Log.d("friendLogin ->",friendLogin);

                    // Set listener for outcoming messages.
                    //chatManager.addChatListener(chatManagerListener);
                    muc2.addMessageListener(packetListener);
                    addListenerToMuc(muc2);
                    //chat1@muc.chat.quickblox.com
                

                Message message = new Message(friendLogin + "@muc.chat.quickblox.com");
                message.setBody("Join me for a group chat!");
                message.addExtension(new GroupChatInvitation("2389_chat1@muc.chat.quickblox.com"));
                connection.sendPacket(message);

             catch (XMPPException e) 
                e.printStackTrace();
            
        
    ).start();


/*** muc */
private void addListenerToMuc(MultiUserChat muc)
    if(null != muc)
        muc.addMessageListener(new PacketListener() 
            @Override
            public void processPacket(Packet packet) 
                Log.i("processPacket", "receiving message");
            
        );
    
    

PacketListener packetListener = new PacketListener() 
    @Override
    public void processPacket(Packet packet) 
      Message message = (Message)packet;
      try 
      muc2.sendMessage(message);
   catch (XMPPException e) 
      e.printStackTrace();
  
      //System.out.println("got message " + message.toXML());
    
;  

private PacketInterceptor packetInterceptor = new PacketInterceptor() 

    @Override
    public void interceptPacket(Packet packet) 
         System.out.println("Sending message: " + packet.toString());
         Message message = muc2.createMessage();
         message.setBody("Hello from producer, message " +
                " ");
         try 
            muc2.sendMessage(message);
         catch (XMPPException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        

    
;

/***/
private ChatManagerListener chatManagerListener = new ChatManagerListener() 
    @Override
    public void chatCreated(Chat chat, boolean createdLocally) 
        // Set listener for incoming messages.
        chat.addMessageListener(messageListener);
        muc2.addMessageListener(packetListener);
    
;

public void sendMessage(String message) 
    try 
        if (chat != null) 
            chat.sendMessage(message);
        
        if (muc2 != null) 
            muc2.sendMessage(message);
        
     catch (XMPPException e) 
        e.printStackTrace();
    


private MessageListener messageListener = new MessageListener() 
    @Override
    public void processMessage(Chat chat, Message message) 
        // 'from' and 'to' fields contains senders ids, e.g.
        // 17792-1028@chat.quickblox.com/mac-167
        // 17744-1028@chat.quickblox.com/Smack
        String from = message.getFrom().split("@")[0];
        String to = message.getTo().split("@")[0];

        System.out.println(String.format(">>> Message received (from=%s, to=%s): %s",
                from, to, message.getBody()));

        if (onMessageReceivedListener != null) 
            onMessageReceivedListener.onMessageReceived(message);
        
    
;


public static interface OnMessageReceivedListener 
    void onMessageReceived(Message message);


// Callback that performs when device retrieves incoming message.
private OnMessageReceivedListener onMessageReceivedListener;

public OnMessageReceivedListener getOnMessageReceivedListener() 
    return onMessageReceivedListener;


public void setOnMessageReceivedListener(OnMessageReceivedListener onMessageReceivedListener) 
    this.onMessageReceivedListener = onMessageReceivedListener;

【问题讨论】:

你能解释一下(更多细节)到底是什么问题吗? 我在调用 GroupChatController.java 时遇到问题,在这个方法中 startChat(String buddyLogin)。它只通过了一个朋友登录。那么我们如何通过 2 或 3 个朋友登录来邀请多个朋友在这一点上 muc2.invite(friendLogin, "Welcome!");我想邀请很多朋友。 【参考方案1】:
public void startChat(String buddyLogin) 
...
List<String> usersLogins= new ArrayList<String>();
    for(String userLogin: usersLogins)
        muc2.invite(userLogin, "Welcome!");   
    
...


【讨论】:

以上是关于Quickblox android sdk 群聊的主要内容,如果未能解决你的问题,请参考以下文章

无法解决:com.quickblox:quickblox-android-sdk-chat:2.6.1

使用 QuickBlox 聊天 SDK 发送图像 - Android

QuickBlox Android SDK 1.2 在 14 之前的 Android API 上不再运行

Gradle 构建问题:在最新的 Android SDK23 上升级 Quickblox 和 httpclient

Quickblox Android sdk 2.0 Beta 缺少一些类

使用 Quickblox SDK for Android 更改视频通话的视频通话属性?