Я создал приложение, которое реализует приложение для вызова приложения с использованием Sinch. Он работает только тогда, когда вызывающий абонент знает имя получателя.Получить статус пользователя с помощью PubNub
Чтобы преодолеть этот синдром, предлагается использовать 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();
}
}
Вот мои проблемы:
Я пытаюсь отобразить все данные, которые я получаю в TextView (позже она будет расположена в ListView или просмотр recycler), но я получаю пустой экран, поэтому я получаю null от сервера.
Статус пользователя должен постоянно обновляться, чтобы узнать, изменяется ли пользователь в состоянии (онлайн -> в автономном режиме), но, похоже, нет никаких вызовов
async
, поэтому я думаю, что он будет выполнен только один раз, а затем набор данных не меняется.
Как я могу решить свои проблемы?
Вы можете отслеживать изменения в Интернете и вносить изменения с помощью Присутствия. Когда вы подписываетесь, подписывайтесь с включенным присутствием, и вы получите 'state-change',' join', 'leave' &' timeout' события в обратном вызове 'присутствия'' listener'. Дайте мне знать, если это приведет вас в правильном направлении. –
@CraigConover Я проверю его. В основном я собираюсь заполнить список с пользователями, которые находятся в сети (подключены к Интернету и имеют мое приложение, работающее на переднем плане или в фоновом режиме), и я собираюсь обновить список асинхронно, чтобы основные действия пользователей не пострадали. –
@cjensen .. Я просто хотел, чтобы вы, ребята, знали, что учебник устарел, это будет полезно, если вы его обновите. –