Android-приложение, которое управляет несколькими конференц-залами Outlook

Я разрабатываю приложение для Android, которое будет управлять бронированием нескольких конференц-залов Outlook (пользователей). Идея состоит в том, чтобы просто отображать их наличие и бронировать номер на определенное время.

До сих пор мне удавалось получать события только в моем собственном календаре с помощью Outlook SDK Android.

// logon() {
       ...
       mResolver = new DependencyResolver.Builder(
              new OkHttpTransport().setInterceptor(new LoggingInterceptor()),  
              new GsonSerializer(),
              new AuthenticationCredentials() {
                   @Override
                   public Credentials getCredentials() {
                      return new OAuthCredentials(
                                   authenticationResult.getAccessToken()
                      );
                   }
              }).build();


// onCreate() {

      Futures.addCallback( logon(), new FutureCallback<Boolean>() { 
            @Override
            public void onSuccess(Boolean result) {
                mClient = new OutlookClient(outlookBaseUrl, mResolver);
                getCalendars();
            }

            @Override
            public void onFailure(Throwable t) {
                Log.e("logon", t.getMessage());
            }
      });


      ...

      protected void getCalendars() {
          DateTime startDate = new DateTime(   
              DateTime.parse("2016-02-05T00:00:00Z"));
          DateTime endDate = new DateTime(
              DateTime.parse("2016-02-06T00:00:00Z"));
          Futures.addCallback(
              mClient.getMe()
                      .getCalendarView()
                      .addParameter("startDateTime", startDate)
                      .addParameter("endDateTime", endDate)
                      .read(),

              new FutureCallback<OrcList<Event>>() {
                  @Override
                  public void onSuccess(final OrcList<Event> result) {
                      runOnUiThread(new Runnable() {
                          @Override
                          public void run() {
                              StringBuilder sb = new StringBuilder();
                              ListIterator<Event> events =
                                          result.listIterator();
                              while (events.hasNext()) {
                                  Event event = events.next();
                                  sb.append(event.getSubject() + "\n");
                              }
                              messagesTextView.setText(sb.toString());
                          }
                      });
                  }

                  @Override
                  public void onFailure(Throwable t) {
                      Log.e("Calendar error", t.getLocalizedMessage());
                  }
              }
          );
      }    

Или, в качестве альтернативы, используя getUsers() вместо getMe(): см. здесь.

Итак, теперь следующие шаги:

  1. Нужен ли мне пользователь с правами администратора даже для чтения календаря конференц-залов или есть какой-то другой способ?

  2. Если мне не разрешат использовать учетную запись администратора, могу ли я управлять несколькими пользователями с хорошим удобством использования / производительностью, полагаясь на поток Oauth?

  3. Я новичок в Android, проще ли работать с Outlook REST API или Microsoft Graph?

Спасибо


person Gabe    schedule 07.02.2016    source источник


Ответы (2)


  1. Сегодня вам необходимо использовать поток учетных данных клиента (AppOnly), если вы хотите, чтобы ваше приложение имело доступ к календарю другого пользователя. Мы работаем над API, который позволит получать информацию о доступности, подробности скоро.

  2. Используя поток OAuth, вы получаете токен доступа и токен обновления, токен доступа действителен в течение короткого периода времени, и токен обновления можно использовать для создания новых токенов доступа. Токены предназначены для каждого пользователя, вы в основном храните токены обновления в своем приложении в кеше для каждого пользователя.

  3. С точки зрения платформы это то же самое, что и взаимодействие с отдельной конечной точкой Outlook или Microsoft Graph. Если ваше приложение хочет получить доступ не только к данным календаря, например к профилю пользователя или файлам, то рекомендуется использовать Microsoft Graph, поскольку вы можете получить доступ к данным из нескольких служб в одной конечной точке и с одним токеном доступа.

person Yina - MSFT    schedule 08.02.2016
comment
Спасибо. Еще одна вещь о пункте 2: приложение будет получать обновленные данные как минимум каждые 30 секунд, но, поскольку оно автоматически перестанет работать в ночное время, мне нужно получать новый токен доступа каждое утро при запуске приложения, верно? Нужно ли мне хранить все учетные данные пользователя, чтобы иметь возможность всегда входить в систему? Новый вопрос: stackoverflow.com/questions/35353319/. ТА снова - person Gabe; 12.02.2016
comment
Вам не нужно хранить учетные данные пользователя, на самом деле мы не советуем этого делать. То, что вы храните, является токеном обновления. Используя токен обновления, вы можете вернуться к конечной точке токена и запросить новый токен доступа. - person Yina - MSFT; 13.02.2016
comment
Под потоком учетных данных клиента вы имеете в виду использование приложения службы/демона? (msdn.microsoft.com/en-us/library/azure/dn645543 .aspx) Это единственный способ? Мне предоставили учетную запись с делегированным доступом к комнатам собраний (с уровнем разрешений автора), но я получаю ответ 403. :( - person Gabe; 14.03.2016

Вам нужна учетная запись администратора только для настройки приложения в Azure. После того, как вы установите правильные разрешения приложения, вам не понадобится учетная запись администратора, если вы используете только авторизацию приложения.

Outlook REST API предоставляет информацию только о текущем пользователе, однако с Graph API вы можете получить информацию о любом конференц-зале или любом пользовательском событии, просто отправив запрос на

https://graph.microsoft.com/v1.0/users/<meetingroom/user email>/calendarView/?endDateTime=2015-12-28T22:23:00Z&startDateTime=2015-12-28T00:00:00Z

Обратите внимание, что формат даты должен быть в формате ISO 8601.

Надеюсь, поможет.

person Onur Kucukkece    schedule 12.02.2016
comment
Я зарегистрировал приложение с помощью рабочей учетной записи Outlook, все работало нормально. Я думаю, что могу добиться того же, используя API календаря. Я попробовал это с помощью песочницы Outlook Oauth (oauthplay.azurewebsites.net): GET outlook.office.com/api/v2.0/users/[email protected] /calendar, но я получил 403 — токен содержит недостаточно области действия, чтобы сделать этот вызов делегированного доступа. Так что проблема только в разрешениях.. - person Gabe; 12.02.2016
comment
Кажется, он не согласен с графиком: stackoverflow.com/questions/34858409/ Спасибо. - person Gabe; 12.02.2016
comment
Существует такое утверждение, как «поскольку запросы Outlook REST API всегда выполняются от имени текущего пользователя». в разделе целевого пользователя на следующей странице msdn.microsoft.com /office/office365/api/use-outlook-rest-api. Может быть что-то с этим связано? - person Onur Kucukkece; 27.03.2016