亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android如何實現集成google登錄并獲取性別等隱私信息

發布時間:2020-07-17 11:19:26 來源:億速云 閱讀:1533 作者:小豬 欄目:移動開發

這篇文章主要為大家展示了Android如何實現集成google登錄并獲取性別等隱私信息,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

前言

公司做海外產品的,集成的是 google 賬號登錄,賬號信息、郵箱等這些不涉及隱私的按 google 的正常登錄流程可以輕松實現 。但是一旦需要獲取涉及隱私的信息就比較麻煩,文檔也不是十分清晰,非常難找,很多坑。

google 賬號登錄

官方鏈接:https://developers.google.com/identity/sign-in/android/start
https://developers.google.com/identity/sign-in/android/sign-in
google 賬號登錄接入的坑:

  • 申請的 client_id必須是 api console 后臺 :https://console.cloud.google.com/apis 與 google play 后臺對應的應用關聯起來。
  • client_id 下的簽名信息和報名信息必須和測試時的 apk 的簽名信息和報名信息一致。
  • 在 google play 下啟動 google 的二次簽名,則 api console 后臺的簽名信息是二次簽名后的信息。打包測試時使用上傳 到 Google play 后臺的 apk 的簽名證書即可。

google 登錄的流程在這個文檔寫的比較清楚了:https://developers.google.com/identity/sign-in/android/sign-in,這里大致說一下,不貼代碼了

構建需求請求的內容:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
  .requestEmail()
  .requestIdToken("your client_id")
  .build();
// Build a GoogleSignInClient with the options specified by gso.
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

2.發起登錄請求,跳轉 google 登錄頁面。

Intent signInIntent = mGoogleSignInClient.getSignInIntent();
 startActivityForResult(signInIntent, RC_SIGN_IN);

獲取 Google 登錄返回

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);

 // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
 if (requestCode == RC_SIGN_IN) {
  // The Task returned from this call is always completed, no need to attach
  // a listener.
  Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
  handleSignInResult(task);
 }
}

獲取 用戶 id token,傳到你自己的 服務端 做驗證

private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
 try {
  GoogleSignInAccount account = completedTask.getResult(ApiException.class);
  // Signed in successfully, show authenticated UI. 
 } catch (ApiException e) {
  // The ApiException status code indicates the detailed failure reason.
  // Please refer to the GoogleSignInStatusCodes class reference for more information.
  Log.w(TAG, "signInResult:failed code=" + e.getStatusCode()); 
 }
}

切換賬號

 /**
  * 重新獲取賬號列表
  */
 public void revokeAccess() {
  try {
   if (mGoogleSignInClient!=null && mActivity!=null){
    mGoogleSignInClient.revokeAccess().addOnCompleteListener(mActivity, new OnCompleteListener<Void>() {
     @Override
     public void onComplete(@NonNull Task<Void> task) {
      Log.d(TAG, "onComplete: ");
     }
    });
   }
  } catch (Exception e){
   e.printStackTrace();
  }
 }

獲取公開資料和需要特別授權的信息(性別、生日等)

1、在構建請求是新增獲取 的公共資料信息 及 需要獲取的特殊信息

private static final String GENDER_SCOPE = "https://www.googleapis.com/auth/user.gender.read";
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
  .requestEmail()
  .requestIdToken("your client_id")
  .requestScopes(new Scope(GENDER_SCOPE));
  .build();
// Build a GoogleSignInClient with the options specified by gso.
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

需要請求的信息可在如下鏈接查找:https://developers.google.com/people/api/rest/v1/people/get

2、檢測是否有權限

 GoogleSignInAccount lastSignedInAccount = GoogleSignIn.getLastSignedInAccount(mActivity);
  Scope scope = new Scope(GENDER_SCOPE);
  if (Utils.isNeedRequest() && !GoogleSignIn.hasPermissions(lastSignedInAccount,scope)){
     SGLog.d(TAG+" need requst permission...");
   GoogleSignIn.requestPermissions(mActivity,RC_GET_TOKEN,lastSignedInAccount,scope);
  }

注意:這一步不需要也可以,有這一步會出現一個 “再確認” 的授權頁面,沒有也不影響獲取的信息。
3、跳轉登錄頁面 (同以上 google 賬號登錄)
4、獲取登錄信息 (同以上 Google賬號登錄)
5、開啟線程獲取 特殊信息

 getProfileAsyncTask = new GetProfileAsyncTask(mActivity, new GpProfileInfoCallback() {
   @Override
   public void onGetProfileInfo(Person person) {
    SGLog.d(TAG+" onGetProfileInfo... ");
    getProfileInfo(person);
   }
  });
  getProfileAsyncTask.execute(signInAccount);

異步任務

// Global instance of the HTTP transport
 private static final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();

 // Global instance of the JSON factory
 private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

 private static class GetProfileAsyncTask extends AsyncTask<GoogleSignInAccount, Void, Person> {

  // Retrieved from the sigin result of an authorized GoogleSignIn
  private WeakReference<Activity> mActivityRef;
  private GpProfileInfoCallback mProfileInfoCallback;

  public GetProfileAsyncTask(Activity activity,GpProfileInfoCallback callback) {
   mActivityRef = new WeakReference<>(activity);
   mProfileInfoCallback = callback;
  }

  @Override
  protected Person doInBackground(GoogleSignInAccount... params) {
   if (mActivityRef.get() == null){
    SGLog.d(TAG+" GetProfileAsyncTask doInBackground activity is null.");
    return null;
   }

   GoogleSignInAccount signInAccount = params[0];
   Context context = mActivityRef.get().getApplicationContext();
   GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth3(
     context,
     Collections.singleton(GENDER_SCOPE));
   credential.setSelectedAccount(signInAccount.getAccount());
   SGLog.d(TAG+" get profile info start.");
   PeopleService service =
     new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
     .setApplicationName(ApkUtils.getAppName(context)) // your app name
     .build();
   SGLog.d(TAG+" get profile info start.");
   // Get info. on user
   Person person =null;
   try {
    person = service
      .people()
      .get("people/me")
      .setPersonFields("genders")
      .execute();
    SGLog.d(TAG+" getPerson end.");
    // return the result
    if (mProfileInfoCallback!=null){
     mProfileInfoCallback.onGetProfileInfo(person);
    }
   } catch (Exception e) {
    SGLog.e(TAG+e.getMessage());
    if (mProfileInfoCallback!=null){
     mProfileInfoCallback.onGetProfileInfo(null);
    }
    e.printStackTrace();
   }
   return person;
  }

  @Override
  protected void onPostExecute(Person aVoid) {
   super.onPostExecute(aVoid);
  }
 }

獲取性別信息

private void getProfileInfo(Person person){
  SGLog.d(TAG+" executeProfileInfo...");
  if (person == null){
   notifyResult(mLastUser,Utils.SUCCESS);
  }else {
   try {
    List<Gender> genders = person.getGenders();
    Gender gender = genders.get(0);
    String value = gender.getValue();
    SGLog.d(TAG+" genders:"+genders.size()+ " gender:"+value);
    mLastUser.setGender(value);
    notifyResult(mLastUser,Utils.SUCCESS);
   }catch (Exception e){
    SGLog.e(TAG+" getProfileInfo error.");
    notifyResult(null,SGErrorCode.LOGIN_FAILED);
    e.printStackTrace();
   }
  }
 }

以上就是關于Android如何實現集成google登錄并獲取性別等隱私信息的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汶川县| 阿荣旗| 桐柏县| 通化市| 沈丘县| 岚皋县| 遵义市| 徐州市| 龙岩市| 新昌县| 嘉禾县| 遂溪县| 承德市| 炉霍县| 利辛县| 西充县| 灵丘县| 舟山市| 新源县| 兴业县| 绥化市| 滁州市| 鄂托克旗| 读书| 阿瓦提县| 汉寿县| 东丰县| 西贡区| 永登县| 安徽省| 德令哈市| 边坝县| 彭泽县| 田阳县| 成都市| 甘洛县| 大洼县| 顺义区| 米易县| 云霄县| 崇仁县|