Статьи

Аутентификация и обмен в Android с помощью API Google+

Этот учебник был обновлен в апреле 2017 года для версии 10.2 Сервисов Google Play

В этом уроке я покажу, как подключить ваше приложение Android к API Google Plus и использовать его для входа в систему, получения и обмена данными.

Найти завершенный проект на GitHub .

Создать проект Android

Откройте Android Studio и создайте новый проект , назвав его по своему желанию. Нажмите Далее , выберите Минимальный уровень API 18 и снова нажмите Далее . Выберите « Пустое действие» в качестве первого действия, назовите его « LoginActivity» и нажмите « Готово» .

Настройка gradle

Откройте build.gradle (Модуль) и добавьте apply plugin: 'com.google.gms.google-services' в конец файла. Добавьте эти строки в dependencies :

  compile 'com.google.android.gms:play-services-auth:10.2.0' compile 'com.google.android.gms:play-services-identity:10.2.0' compile 'com.google.android.gms:play-services:10.2.0' 

Теперь откройте build.gradle (Project) и добавьте эту строку в dependencies :

  classpath 'com.google.gms:google-services:3.0.0' 

Следующим шагом является добавление файла google-services.json в ваш проект. Этот файл содержит учетные данные разработчика и параметры конфигурации для подключения к клиенту Google API. Вы можете скачать этот файл здесь , переместить его в папку приложения вашего проекта и синхронизировать Gradle.

Макеты

В папке макета вашего проекта удалите файл content_login.xml .

Внутри activity_login.xml удалите <include layout="@layout/content_login"/> и замените код кнопки плавающего действия этими строками. Единственное, что нам нужно в этом макете, это кнопка входа в систему:

 <RelativeLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="1"> <com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="visible" tools:visibility="gone" /> <LinearLayout android:id="@+id/sign_out_and_disconnect" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:orientation="horizontal" android:paddingLeft="16dp" android:paddingRight="16dp" android:visibility="gone" tools:visibility="visible"> <Button android:id="@+id/sign_out_button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Sign Out" /> </LinearLayout> </RelativeLayout> 

Откройте класс LoginActivity и удалите код кнопки плавающего действия внутри onCreate() .

Убедитесь, что ваш public class LoginActivity extends AppCompatActivity и implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener{

Перед onCreate() добавьте этот код:

 private static final String TAG = "LoginActivity"; private static final int SIGN_IN_CODE = 9001; private GoogleApiClient mGoogleApiClient; private GoogleSignInAccount account; 

Внутри метода onCreate перед закрывающей скобкой добавьте эти строки, которые устанавливают соединения с Google API, и привяжите их к кнопке входа:

 findViewById(R.id.sign_in_button).setOnClickListener(this); findViewById(R.id.sign_out_button).setOnClickListener(this); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button); signInButton.setSize(SignInButton.SIZE_STANDARD); 

После onCreate() мы собираемся реализовать переопределенные методы. Первый — это onStart() и заполнитель для метода onConnectionFailed . Добавьте их в класс LoginActivity :

 @Override public void onStart() { super.onStart(); OptionalPendingResult<GoogleSignInResult> optPenRes = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); if (optPenRes.isDone()) { Log.e(TAG, "Yayy!"); GoogleSignInResult result = optPenRes.get(); handleSignInResult(result); } else { optPenRes.setResultCallback(new ResultCallback<GoogleSignInResult>() { @Override public void onResult(GoogleSignInResult googleSignInResult) { handleSignInResult(googleSignInResult); } }); } } @Override public void onConnectionFailed(ConnectionResult connectionResult) { } 

Не беспокойтесь об ошибках, которые вы, скорее всего, увидите, так как мы собираемся реализовать эти методы позже.

Второй переопределенный метод — onActivityResult() . Добавьте его после последнего добавленного метода. Код выглядит следующим образом:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == SIGN_IN_CODE) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } }} 

Затем добавьте метод handeSignInResult() после метода onActivityResult() :

 private void handleSignInResult(GoogleSignInResult result) { Log.e(TAG, "handleSignInResult:" + result.isSuccess()); if (result.isSuccess()) { account = result.getSignInAccount(); Log.e(TAG,account.getDisplayName()); Log.e(TAG,account.getEmail()); Log.e(TAG,account.getId()); updateUI(true); } else { updateUI(false); } } 

Теперь мы добавим signIn() и signOut() :

 private void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, SIGN_IN_CODE); } private void signOut() { Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { updateUI(false); } }); } 

Следующий метод — updateUI() . Если пользователь выполнил вход, он изменяет видимость кнопок входа и выхода и создает новое Intent именем main которое представляет следующее действие, открытое после успешного входа в систему. Следующее действие — MainActivity . Прежде чем поменять деятельность, мы должны передать некоторые дополнительные данные, полученные в качестве учетной записи. Мы imageurl строки displayname и imageurl новому намерению в качестве дополнений.

 private void updateUI(boolean signedIn) { if (signedIn) { findViewById(R.id.sign_in_button).setVisibility(View.GONE); findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE); Intent main = new Intent(this, MainActivity.class); main.putExtra("displayname", account.getDisplayName()); main.putExtra("imageurl", account.getPhotoUrl().toString()); startActivity(main); finish(); } else { findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE); } } 

Последний метод, который нам нужно реализовать в нашем классе LoginActivity это onClick(View v) :

 @Override public void onClick(View v) { switch (v.getId()) { case R.id.sign_in_button: signIn(); break; case R.id.sign_out_button: signOut(); break; } } 

Класс LoginActivity теперь завершен.

Основной класс деятельности

Нам нужен еще один класс для отображения информации о пользователе и изображения профиля, а также для размещения кнопки Google Plus Share. Начните с создания нового класса, щелкнув правой кнопкой мыши по вашему пакету (например, com.example.theodhor.googleplusintegration) и выбрав « Новый» -> « Деятельность» -> « Пустое действие» . Оставьте имя MainActivity по умолчанию и нажмите « Готово» .

Удалите файл content_main.xml, потому что он нам не нужен.

Откройте файл activity_main.xml и замените <include layout="@layout/content_main"/> на:

 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingTop="100dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello" android:id="@+id/textView" android:layout_gravity="center_horizontal"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/nameSurnameText" android:layout_gravity="center_horizontal"/> <ImageView android:layout_width="150dp" android:layout_height="150dp" android:id="@+id/imageView" android:layout_gravity="center_horizontal"/> <Button android:id="@+id/share_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Share on Google+" android:layout_gravity="center_horizontal"/> <Button android:id="@+id/sign_out_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sign Out" android:visibility="visible" android:layout_gravity="center"/> </LinearLayout> 

Удалите код кнопки плавающего действия, поскольку мы не будем его использовать.

Теперь откройте класс MainActivity и мы добавим код, чтобы он работал.

Сначала убедитесь, что класс расширяет и реализует классы, которые мы будем использовать:

 public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener { 

Перед onCreate() добавьте эти две строки кода:

 GoogleApiClient mGoogleApiClient; private static final int SIGN_IN_CODE = 9001; 

Внутри onCreate() замените код кнопки с плавающим действием на следующие строки:

 findViewById(R.id.sign_out_button).setOnClickListener(this); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this , this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); 

Здесь мы создали кнопку выхода и создали новый GoogleApiClient который будет определять, какой API мы будем использовать для нашего приложения. В этом случае мы будем использовать Google Authentication, поскольку мы выполняем вход в систему Google Plus.

Внутри того же метода добавьте эти строки:

 Intent intent = getIntent(); String nameSurname = intent.getStringExtra("displayname"); String imageUrl = intent.getStringExtra("imageurl"); TextView displayName = (TextView)findViewById(R.id.nameSurnameText); displayName.setText("" + nameSurname); 

Здесь мы создаем намерение и используем его для получения дополнительных данных, отправленных из последнего действия, строк displayname и imageurl .

Далее мы должны добавить код, который создает кнопку «Поделиться»:

 Button shareButton = (Button) findViewById(R.id.share_button); shareButton.setOnClickListener(this); 

Поскольку View.OnClickListener реализован в этом классе, нам нужен переопределенный метод для него. Добавьте его после onCreate() :

 @Override public void onClick(View v) { switch (v.getId()) { case R.id.sign_in_button: signIn(); break; case R.id.sign_out_button: signOut(); break; case R.id.share_button: Intent shareIntent = new PlusShare.Builder(this) .setType("text/plain") .getIntent(); startActivityForResult(shareIntent, 0); break; } } 

Остальные методы для этого класса — signIn() , signOut() и переопределенный метод onConnectionFailed() :

 @Override public void onConnectionFailed(ConnectionResult connectionResult) { } private void signOut() { Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { Intent login = new Intent(MainActivity.this, LoginActivity.class); startActivity(login); finish(); } }); } private void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, SIGN_IN_CODE); } 

От LoginActivity мы получаем LoginActivity имя и imageurl виде строк. Первый будет отображаться в виде текста с использованием TextView но секунды должны отображаться в виде изображения. Давайте создадим другой класс, который использует нашу строку imageurl для загрузки и показа растрового изображения.

Создайте новый класс, щелкнув правой кнопкой мыши по вашему пакету и выбрав New -> Java Class . Я назвал это DownloadImageTask и это код ниже:

 public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { ImageView bmImage; public DownloadImageTask(ImageView mImage) { this.bmImage = mImage; } protected Bitmap doInBackground(String... urls) { String url = urls[0]; Bitmap mBitmap = null; try { InputStream in = new java.net.URL(url).openStream(); mBitmap = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return mBitmap; } protected void onPostExecute(Bitmap result) { bmImage.setImageBitmap(result); } } 

Чтобы вызвать его в нашем классе MainActivity добавьте MainActivity строку кода в метод onCreate() :

 new DownloadImageTask((ImageView) findViewById(R.id.imageView)).execute(imageUrl); 

Включение сервисов Google Play

Последняя задача — подключить наше приложение к API Google. Нажмите здесь, чтобы просмотреть страницу служб Google.

Добавьте имя приложения и имя пакета и нажмите « Продолжить» .

На следующем экране добавьте свой ключ идентификации SHA-1. Если вы не знаете, как это сделать, страницы справки Google являются лучшим источником информации.

Нажмите Продолжить, чтобы сгенерировать нужные нам файлы конфигурации, скачать файл google-services.json и переместить его в свой каталог YourProjectName / app / или mobile / .

Теперь вы можете запустить приложение.

Окончательная заявка

Вывод

В этом уроке я показал несколько основных шагов по интеграции Google Plus в приложение Android для аутентификации и обмена контентом. С помощью этой интеграции можно достичь гораздо большего, например, информации из социальных сетей, глубоких ссылок и установок через эфир.

Я хотел бы услышать любые вопросы, проблемы и идеи, которые могут у вас возникнуть .