使用PubNub

时间:2016-09-13 16:11:31

标签: android pubnub

我创建了一个应用程序,使用Sinch实现应用程序调用app。它仅在调用者知道收件人的名称时才有效。

要克服这个Sinch建议使用PubNub来获取用户状态。他们也有一个tutorial here.问题是教程已经过时,PubNub已经更新了他们的API。我尝试使用他们自己的新API使用他们的文档来实现这些功能,但它不起作用或更准确,我不知道该怎么做。

我目前的代码是:

public class LoggedUsers extends Activity {
    private PubNub pubNub;
    String name;
    private ArrayList users;
    private JSONArray loggedUserList;
    ListView UserList;
    TextView allUsers;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_list);
        allUsers = (TextView) findViewById(R.id.JSONFromPubNub);
        SharedPreferences sp = getSharedPreferences("User_Details", MODE_APPEND);
        try {
            name = sp.getString("UserName", "");
        } catch (NullPointerException e) {

        }
        final PNConfiguration pnc = new PNConfiguration();
        pnc.setPublishKey("publish key");
        pnc.setSubscribeKey("subscribe key");
        pnc.setUuid(name);

        pubNub = new PubNub(pnc);
        users = new ArrayList<String>();
        UserList = (ListView) findViewById(R.id.listView);
        String user = getUserStatus();
        allUsers.setText(user);
        final ArrayAdapter adapter = new ArrayAdapter(getApplicationContext(), R.layout.single_item_list, users);
        UserList.setAdapter(adapter);

        pubNub.addListener(new SubscribeCallback() {
            @Override
            public void status(PubNub pubnub, PNStatus status) {
                if (status.getCategory() == PNStatusCategory.PNUnexpectedDisconnectCategory) {
                    // This event happens when radio / connectivity is lost
                    HashMap <String,String> map = new HashMap();
                    map.put("State","Offline");
                    pubNub.setPresenceState().channels(Arrays.asList("CallingChannel1")).state(map).uuid(pnc.getUuid());
                } else if (status.getCategory() == PNStatusCategory.PNConnectedCategory) {

                    // Connect event. You can do stuff like publish, and know you'll get it.
                    // Or just use the connected event to confirm you are subscribed for
                    // UI / internal notifications, etc
                    HashMap <String,String> map = new HashMap();
                    map.put("State","Online");
                    pubNub.setPresenceState().channels(Arrays.asList("CallingChannel1")).state(map).uuid(pnc.getUuid());
                  /*  if (status.getCategory() == PNStatusCategory.PNConnectedCategory) {
                        pubnub.publish().channel("awesomeChannel").message("hello!!").async(new PNCallback<PNPublishResult>() {
                            @Override
                            public void onResponse(PNPublishResult result, PNStatus status) {
                                // Check whether request successfully completed or not.
                                if (!status.isError()) {

                                    // Message successfully published to specified channel.
                                }
                                // Request processing failed.
                                else {

                                    // Handle message publish error. Check 'category' property to find out possible issue
                                    // because of which request did fail.
                                    //
                                    // Request can be resent using: [status retry];
                                }
                            }
                        });
                    }*/
                } else if (status.getCategory() == PNStatusCategory.PNReconnectedCategory) {
                    HashMap <String,String> map = new HashMap();
                    map.put("State","Online");
                    pubNub.setPresenceState().channels(Arrays.asList("CallingChannel1")).state(map).uuid(pnc.getUuid());

                    // Happens as part of our regular operation. This event happens when
                    // radio / connectivity is lost, then regained.
                } else if (status.getCategory() == PNStatusCategory.PNDecryptionErrorCategory) {

                    // Handle messsage decryption error. Probably client configured to
                    // encrypt messages and on live data feed it received plain text.
                }
            }

            @Override
            public void message(PubNub pubnub, PNMessageResult message) {

            }

            @Override
            public void presence(PubNub pubnub, PNPresenceEventResult presence) {

            }
        });
    }
    public String getUserStatus(){
        final StringBuilder allUsers = new StringBuilder();
        pubNub.subscribe().channels(Arrays.asList("CallingChannel1")).withPresence().execute();
        pubNub.hereNow()
                // tailor the next two lines to example
                .channels(Arrays.asList("CallingChannel1"))
                .includeState(true)
                .includeUUIDs(true)
                .async(new PNCallback<PNHereNowResult>() {
                    @Override
                    public void onResponse(PNHereNowResult result, PNStatus status) {
                        if (status.isError()) {
                            // handle error
                            return;
                        }

                        for (PNHereNowChannelData channelData : result.getChannels().values()) {
                            allUsers.append("---");
                            allUsers.append("channel:" + channelData.getChannelName());
                            allUsers.append("occoupancy: " + channelData.getOccupancy());
                            allUsers.append("occupants:");
                            for (PNHereNowOccupantData occupant : channelData.getOccupants()) {
                                allUsers.append("uuid: " + occupant.getUuid() + " state: " + occupant.getState());
                            }
                        }
                    }
                });
               return allUsers.toString();
    }



    @Override
    protected void onResume() {
        super.onResume();
    }
}

以下是我的问题:

  1. 我正在尝试显示我在textview中收到的所有数据(稍后它会安排在listview或者回收站视图中),但是我得到一个空白的屏幕,所以我从服务器上获取了null。 / p>

  2. 应不断更新用户状态,以了解用户是否更改状态(在线 - >离线),但代码中似乎没有async次调用,因此我认为会执行只有一次,然后数据集没有被更改。

  3. 我如何解决我的问题?

1 个答案:

答案 0 :(得分:1)

PubNub Presence

您可以使用PubNub Presence监控在线和状态变化。订阅时,订阅并启用状态,您将获得state-changejoinleave&amp; timeout events in the presence callback

Callback callback = new Callback() {
    @Override
    public void successCallback(String channel, Object message) {
        System.out.println(channel + " : "
                + message.getClass() + " : " + message.toString());

       // take action on the presence events here
    }

    @Override
    public void connectCallback(String channel, Object message) {
       System.out.println("CONNECT on channel:" + channel
                + " : " + message.getClass() + " : "
                + message.toString());
    }

    @Override
    public void disconnectCallback(String channel, Object message) {
        System.out.println("DISCONNECT on channel:" + channel
                + " : " + message.getClass() + " : "
                + message.toString());
    }

    @Override
    public void reconnectCallback(String channel, Object message) {
        System.out.println("RECONNECT on channel:" + channel
                + " : " + message.getClass() + " : "
                + message.toString());
    }

    @Override
    public void errorCallback(String channel, PubnubError error) {
        System.out.println("ERROR on channel " + channel
                + " : " + error.toString());
    }
};

try {
    pubnub.presence("my_channel", callback);
} 
catch (PubnubException e) {
    System.out.println(e.toString());
}

看来Sinch正在使用相当旧版本的PubNub Android SDK。我认为你仍然可以使用PubNub Android SDK v4在Sinch SDK之外做你需要做的事情,除非Sinch有一些明确的要求使用相同版本的SDK。