본문 바로가기
슬기로운 자바 개발자 생활/스프링 및 자바웹 서비스

구글 API 사용하기 1 - 구글계정 로그인 - 안드로이드

by 슬기로운 동네 형 2016. 5. 15.
반응형

안드로이드 구글 API 사용하기

1. 구글 API 라이브러리 사용하기 위해서는 구글 개발자 API 프로젝트 등록

2. 안드로이드 API 키 만들기

3. 사용할 API 제품 설정

4. 사용자 인증정보 생성

 

오늘 내용은 구글 클라우드, 맵, 소셜, 유튜브 등을 안드로이드 어플과 연동하기 위한 방법 설명

1. 시작 https://console.developers.google.com 접속하기

프로젝트를 생성 클릭

 

2. Google+API 클릭

3. 사용설정 클릭

4. 사용자 인증 정보로 이동 클릭

5. 호출 위치를 안드로이드, 액세스할 데이터는 사용자 데이터, 어떤 사용자 인증정보가 필요한가요? 클릭

 

6. 사용자 인증정보에 값넣어보기

  1. OAuth 클라이언트 ID 만들기는 자신이 진행하고 있는 앱이름? 같은거 넣으면 됩니다. 저는 테스트 구글 API 란 이름으로 넣을 겁니다.

  2. 서명 인증서는 안드로이드 스튜디오를 사용하신다면 쉽게 찾을 수 있습니다. 다음 캡쳐를 참고 하시면 됩니다.

  3. 패키지는 개발중인 매니페이스의 패키지명을 넣어 주시면 됩니다.

  4. 그리고 클라이언트 Id만들기 클릭

인증키구하기, 메니페스트 기타 참고

 

아래 처럼 입력하고 클라이언트 만들기 클릭

 

아래와 같이 페이지가 바뀝니다. 사용자에게 표시되는 이름은 구글정보 연결시 구글정보를 사용하겠냐? 라는 메세지가 개발앱에서 뜨게 됩니다.

저는 테스트구글api로 하겠습니다.

 

계속을 클릭하면 아래 화면이 다시 나옵니다. 완료를 클릭해주세요. 아래 다운로드라고 나온것은 옵션사항입니다. 언저든지 파일을 내려 받을 수 있으니 지금 글에서는 패스 하겠습니다.

OAuth2.0 클라이언트 ID가 만들어진 후에 화면이 다시 뜨게 되면 아래 처럼 사용자 인증정보 만들기를 클릭해서 안드로이드 API키를 만드는 작업을 합니다.

사용자 인증정보 만들기를 클릭하면 아래처럼 탭들이 뜹니다. 그러면 API키를 클릭해주세요

안드로이드에서 사용할것이니 android 키를 클릭

이름은 자신이 원하는 것 그리고 아래 지문키와 패키지 이름은 전단계에서 했던것을 참고해서 동일하게 입력합니다. 그후 생성

생성을 클릭하면 잠깐 API키 창을 보여주고 최종적으로 아래 화면으로 넘어옵니다. 아래 api키를 복사해서 개발할 앱에서 사용합니다.

이제 거의 앱으로 넘어가서 사용자 정보를 가져오는지 테스트를 해봅니다.

저는 버튼하나와 텍스트뷰 하나 만들고 그것을 클릭했을때 텍스트뷰에 구글에 등록된 자신의 이름을 가져오는 프로그램을 간단하게 만들겠습니다.

 

그래들에 아래 소스 추가해주고요.

compile 'com.google.android.gms:play-services-plus:7.8.0'
compile 'com.google.apis:google-api-services-youtube:v3-rev120-1.19.0'
compile 'com.google.http-client:google-http-client-android:+'
compile 'com.google.api-client:google-api-client-android:+'
compile 'com.google.api-client:google-api-client-gson:+'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.mcxiaoke.volley:library:1.0.18'
compile 'com.github.bumptech.glide:glide:3.6.0'

 

매니페스트에 아래 설정

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

xml 레이아웃은

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.app.usegoogleapi.MainActivity">

    <TextView
        android:id="@+id/userName"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Button
        android:id="@+id/btn_con"
        android:onClick="mOnClick"
        android:text="접속"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Auth.java 클래스 하나만들어줍니다. 아래 key 가 아까 구글에서 생성된 API 키입니다.

public class Auth {
    // Register an API key here: https://console.developers.google.com
    public static final String KEY = "AIzaSyBNHsUz1hye4Cs9a_1XwLzO7ipqZsF0_Dk";
    public static final String[] SCOPES = {Scopes.PROFILE, YouTubeScopes.YOUTUBE};
}

MainActivity.java

package com.app.googletest;

import android.content.IntentSender;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.model.people.Person;

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener {

    private static final String TAG = "MainActivity";
    private GoogleApiClient mGoogleApiClient;

    TextView userName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        userName = (TextView) findViewById(R.id.userName);
    }

    public void mOnClick(View view){
        switch (view.getId()){
            case R.id.btn_con:
                Toast.makeText(this, "접속합니다", Toast.LENGTH_SHORT).show();

                mGoogleApiClient = new GoogleApiClient.Builder(this)
                        .addConnectionCallbacks(this)
                        .addOnConnectionFailedListener(this)
                        .addApi(Plus.API)
                        .addScope(Plus.SCOPE_PLUS_PROFILE)
                        .build();

                mGoogleApiClient.connect();

                break;
        }
    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.d(TAG, "구글 플레이 연결이 되었습니다.");

        if (!mGoogleApiClient.isConnected() || Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) == null) {

            Log.d(TAG, "onConnected 연결 실패");

        } else {
            Log.d(TAG, "onConnected 연결 성공");

            Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);

            if (currentPerson.hasImage()) {

                Log.d(TAG, "이미지 경로는 : " + currentPerson.getImage().getUrl());

               /* Glide.with(MainActivity.this)
                        .load(currentPerson.getImage().getUrl())
                        .into(userphoto);*/

            }
            if (currentPerson.hasDisplayName()) {
                Log.d(TAG,"디스플레이 이름 : "+ currentPerson.getDisplayName());
                Log.d(TAG, "디스플레이 아이디는 : " + currentPerson.getId());
                userName.setText(currentPerson.getDisplayName());
            }

        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.d(TAG, "연결 에러 " + connectionResult);

        if (connectionResult.hasResolution()) {

            Log.e(TAG,
                    String.format(
                            "Connection to Play Services Failed, error: %d, reason: %s",
                            connectionResult.getErrorCode(),
                            connectionResult.toString()));
            try {
                //이게 핵심?
                connectionResult.startResolutionForResult(this, 0);
            } catch (IntentSender.SendIntentException e) {
                Log.e(TAG, e.toString(), e);
            }
        }else{
            Toast.makeText(getApplicationContext(), "이미 로그인 중", Toast.LENGTH_SHORT).show();
        }
    }
}

안드로이드 실행을 한 후에 접속버튼을 클릭하게 되면 자동으로 아래 창을 뛰워주고요  클릭하게 되면 hello world 가 구글 로그인 이름으로 변경됩니다.

 

안드로이드 스튜디오에서 로그캣을 보시면 위의 코딩에서 적용한 소스들이 적용되서 나옵니다.

 

핵심소스는

private GoogleApiClient mGoogleApiClient;
mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(Plus.API)
        .addScope(Plus.SCOPE_PLUS_PROFILE)
        .build();

mGoogleApiClient.connect();

임플리먼트

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener {

임플리먼트된 

onConnected 메소드에서 구글과 연결되었는지 확인 한다음

Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);

를 사용해서 유저정보를 갖고 활용하시면 됩니다.

@Override
public void onConnected(Bundle bundle) {
    Log.d(TAG, "구글 플레이 연결이 되었습니다.");

    if (!mGoogleApiClient.isConnected() || Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) == null) {

        Log.d(TAG, "onConnected 연결 실패");

    } else {
        Log.d(TAG, "onConnected 연결 성공");

        Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);

        if (currentPerson.hasImage()) {

            Log.d(TAG, "이미지 경로는 : " + currentPerson.getImage().getUrl());

           /* Glide.with(MainActivity.this)
                    .load(currentPerson.getImage().getUrl())
                    .into(userphoto);*/

        }
        if (currentPerson.hasDisplayName()) {
            Log.d(TAG,"디스플레이 이름 : "+ currentPerson.getDisplayName());
            Log.d(TAG, "디스플레이 아이디는 : " + currentPerson.getId());
            userName.setText(currentPerson.getDisplayName());
        }

    }
}

참고로 구글 로그인계정 선택후에 onActivityResult

구현해야하는데 제가 안했습니다.

접속 한번 누르고 계정 선택한다음. 다시 접속 눌러야 텍스트 뷰 아이템 이름이 구글 계정으로 바뀌게 될겁니다.

 

반응형

댓글