2016-09-13 2 views
0

Я создал приложение, которое реализует приложение для вызова приложения с использованием 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(); 
    } 
} 

Вот мои проблемы:

  1. Я пытаюсь отобразить все данные, которые я получаю в TextView (позже она будет расположена в ListView или просмотр recycler), но я получаю пустой экран, поэтому я получаю null от сервера.

  2. Статус пользователя должен постоянно обновляться, чтобы узнать, изменяется ли пользователь в состоянии (онлайн -> в автономном режиме), но, похоже, нет никаких вызовов async, поэтому я думаю, что он будет выполнен только один раз, а затем набор данных не меняется.

Как я могу решить свои проблемы?

+0

Вы можете отслеживать изменения в Интернете и вносить изменения с помощью Присутствия. Когда вы подписываетесь, подписывайтесь с включенным присутствием, и вы получите 'state-change',' join', 'leave' &' timeout' события в обратном вызове 'присутствия'' listener'. Дайте мне знать, если это приведет вас в правильном направлении. –

+0

@CraigConover Я проверю его. В основном я собираюсь заполнить список с пользователями, которые находятся в сети (подключены к Интернету и имеют мое приложение, работающее на переднем плане или в фоновом режиме), и я собираюсь обновить список асинхронно, чтобы основные действия пользователей не пострадали. –

+0

@cjensen .. Я просто хотел, чтобы вы, ребята, знали, что учебник устарел, это будет полезно, если вы его обновите. –

ответ

1

PubNub Наличие

Вы можете следить за онлайн и изменения состояния с помощью PubNub Presence. Когда вы подписываетесь, подписывайтесь с включенным присутствием, и вы получите state-change, join, leave & timeoutevents 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.

+0

Я попробую это и дам вам знать результат. –

Смежные вопросы