마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

구글 캘린더 연동 샘플코드와 직접 캘린더 연결 하는 게 많이 다른가요? [closed]

0 추천

구글 로그인하면 바로 캘린더 리스트를 받아오는 샘플코드로 공부하고 있습니다.

최종 하고 싶은게 구글 로그인을 하면 제가 만든 캘린더로 액티비티가 전환되면서

구글 캘린더의 정보를 얻어오는 것 입니다.

계속 샘플코드만 고치려고 했는데 이 방법이 아닌거 같아서요..

그리고 API 참조하면 REST 방식이랑 클라이언트를 직접 사용하는 방식이 있다고 하는데

샘플 코드는 어느 것을 이용한 것인지 궁금합니다. 



public final class CalendarSample extends ListActivity {

  /** Logging level for HTTP requests/responses. */
  private static final Level LOGGING_LEVEL = Level.OFF;

  private static final String TAG = "CalendarSample";

  private static final String AUTH_TOKEN_TYPE = "cl";

  private static final int MENU_ACCOUNTS = 0;

  private static final int MENU_ADD = 1;

  private static final int CONTEXT_EDIT = 0;

  private static final int CONTEXT_DELETE = 1;

  private static final int REQUEST_AUTHENTICATE = 0;

  final HttpTransport transport = AndroidHttp.newCompatibleTransport();

  final JsonFactory jsonFactory = new GsonFactory();

  static final String PREF_ACCOUNT_NAME = "accountName";

  static final String PREF_AUTH_TOKEN = "authToken";

  GoogleAccountManager accountManager;

  SharedPreferences settings;

  String accountName;

  String authToken;

  com.google.api.services.calendar.Calendar client;

  List<CalendarInfo> calendars = Lists.newArrayList();

  private boolean received401;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    HttpRequestInitializer requestInitializer = new HttpRequestInitializer() {
      public void initialize(HttpRequest request) throws IOException {
        request.getHeaders().setAuthorization(GoogleHeaders.getGoogleLoginValue(authToken));
      }
    };
    client = new com.google.api.services.calendar.
        Calendar.Builder(transport, jsonFactory, requestInitializer)
          .setApplicationName("Google-CalendarAndroidSample/1.0")
          .setJsonHttpRequestInitializer(new GoogleKeyInitializer(ClientCredentials.KEY))
          .build();
    settings = getPreferences(MODE_PRIVATE);
    accountName = settings.getString(PREF_ACCOUNT_NAME, null);
    authToken = settings.getString(PREF_AUTH_TOKEN, null);
    Logger.getLogger("com.google.api.client").setLevel(LOGGING_LEVEL);
    accountManager = new GoogleAccountManager(this);
    registerForContextMenu(getListView());
    gotAccount();
  }

  void gotAccount() {
    Account account = accountManager.getAccountByName(accountName);
    if (account == null) {
      chooseAccount();
      return;
    }
    if (authToken != null) {
      onAuthToken();
      return;
    }
    accountManager.getAccountManager()
        .getAuthToken(account, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>() {

          public void run(AccountManagerFuture<Bundle> future) {
            try {
              Bundle bundle = future.getResult();
              if (bundle.containsKey(AccountManager.KEY_INTENT)) {
                Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
                intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivityForResult(intent, REQUEST_AUTHENTICATE);
              } else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
                setAuthToken(bundle.getString(AccountManager.KEY_AUTHTOKEN));
                onAuthToken();
              }
            } catch (Exception e) {
              Log.e(TAG, e.getMessage(), e);
            }
          }
        }, null);
  }

  private void chooseAccount() {
    accountManager.getAccountManager().getAuthTokenByFeatures(GoogleAccountManager.ACCOUNT_TYPE,
        AUTH_TOKEN_TYPE,
        null,
        CalendarSample.this,
        null,
        null,
        new AccountManagerCallback<Bundle>() {

          public void run(AccountManagerFuture<Bundle> future) {
            Bundle bundle;
            try {
              bundle = future.getResult();
              setAccountName(bundle.getString(AccountManager.KEY_ACCOUNT_NAME));
              setAuthToken(bundle.getString(AccountManager.KEY_AUTHTOKEN));
              onAuthToken();
            } catch (OperationCanceledException e) {
              // user canceled
            } catch (AuthenticatorException e) {
              Log.e(TAG, e.getMessage(), e);
            } catch (IOException e) {
              Log.e(TAG, e.getMessage(), e);
            }
          }
        },
        null);
  }

  void setAccountName(String accountName) {
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(PREF_ACCOUNT_NAME, accountName);
    editor.commit();
    this.accountName = accountName;
  }

  void setAuthToken(String authToken) {
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(PREF_AUTH_TOKEN, authToken);
    editor.commit();
    this.authToken = authToken;
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
      case REQUEST_AUTHENTICATE:
        if (resultCode == RESULT_OK) {
          gotAccount();
        } else {
          chooseAccount();
        }
        break;
    }
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, MENU_ADD, 0, "New Calendar");
    if (accountManager.getAccounts().length >= 2) {
      menu.add(0, MENU_ACCOUNTS, 0, "Switch Account");
    }
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case MENU_ADD:
        Calendar entry = new Calendar();
        entry.setSummary("Calendar " + new DateTime(new Date()));
        new AsyncInsertCalendar(this, entry).execute();
        return true;
      case MENU_ACCOUNTS:
        chooseAccount();
        return true;
    }
    return false;
  }

  @Override
  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, CONTEXT_EDIT, 0, "Update Title");
    menu.add(0, CONTEXT_DELETE, 0, "Delete");
  }

  @Override
  public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    int calendarIndex = (int) info.id;
    CalendarInfo calendarInfo = calendars.get(calendarIndex);

    switch (item.getItemId()) {
      case CONTEXT_EDIT:
        Calendar entry = new Calendar();
        entry.setSummary(calendarInfo.summary + " UPDATED " + new DateTime(new Date()));
        new AsyncUpdateCalendar(this, calendarIndex, entry).execute();
        return true;
      case CONTEXT_DELETE:
        new AsyncDeleteCalendar(this, calendarIndex).execute();
        return true;
      default:
        return super.onContextItemSelected(item);
    }
  }

  void onAuthToken() {
    new AsyncLoadCalendars(this).execute();
  }

  void onRequestCompleted() {
    received401 = false;
  }

  void handleGoogleException(final IOException e) {
    if (e instanceof GoogleJsonResponseException) {
      GoogleJsonResponseException exception = (GoogleJsonResponseException) e;
      if (exception.getStatusCode() == 401 && !received401) {
        received401 = true;
        accountManager.invalidateAuthToken(authToken);
        authToken = null;
        SharedPreferences.Editor editor2 = settings.edit();
        editor2.remove(PREF_AUTH_TOKEN);
        editor2.commit();
        gotAccount();
      }
    }
    Log.e(TAG, e.getMessage(), e);
    runOnUiThread(new Runnable() {
      public void run() {
        new AlertDialog.Builder(CalendarSample.this).setTitle("Exception").setMessage(
            e.getMessage()).setNeutralButton("ok", null).create().show();
      }
    });
  }

  void refresh() {
    Collections.sort(calendars);
    setListAdapter(
        new ArrayAdapter<CalendarInfo>(this, android.R.layout.simple_list_item_1, calendars));
  }
}

 

질문을 종료한 이유: 해결
이죠 (420 포인트) 님이 2013년 2월 21일 질문
이죠님이 2013년 2월 22일 closed
...