如何确认用户何时不想连接到Google Play服务?

时间:2015-02-10 18:32:10

标签: android google-play-services google-drive-android-api

如果提示让我的应用访问其Google云端硬盘帐户的用户点击"取消,"有没有办法承认他们点击取消?现在,我的应用程序不断要求他们选择要使用的Google云端硬盘帐户。

这是代码:

    @Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    // This is the XML for this activity
    setContentView(R.layout.view_all_timelines_activity);

    // This is used for authentication and uploading to Google Drive
    googleApiClient = new GoogleApiClient.Builder(this).addApi(Drive.API)
            .addScope(Drive.SCOPE_FILE).addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();

    googleApiClient.connect();

我如何确认他们是否说"取消"并不想连接?我不想经常纠缠用户登录。

1 个答案:

答案 0 :(得分:4)

我将尝试更深入地阐述,因此答案涵盖了使Google Drive Android API(GDAA)连接并正常工作所涉及的整个过程。假设您在the console注册了自己的应用,那么您的应用必须通过3个障碍。所有这些都涉及你的活动放弃对另一个活动(对话框)的控制并在回调中捕获结果。我试着写一个小的,精简的和平均的演示,可以是found here。通常情况下,我失败了,代码最终没有接近瘦和平均值(更像是臃肿和丑陋:)。

我注意到许多开发人员偶然发现了授权/身份验证。需要强调的是,“控制台”必须知道应用程序的包名称,并且它是SHA1。应用程序的SHA1包含在* .APK文件中。您有2个版本的APK文件,调试版和发行版,每个版本都有不同的SHA1。 It was discussed here

所以,障碍是:

1 /检查播放服务

在OnCreate()的某个地方,您可以初步检查是否有可用的Google Play服务以及您的版本是否正常。

@Override
protected void onCreate(Bundle bundle) {   super.onCreate(bundle);
  ...
  if (checkPlayServices() && checkUserAccount()) {
    GooDrive.init(this, UT.AM.getActiveEmil());
    GooDrive.connect(true);
  }
  ...
}

上面是'checkPlayServices()',就像这样

private boolean checkPlayServices() { 
  int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
  if (status != ConnectionResult.SUCCESS) {
    if (GooglePlayServicesUtil.isUserRecoverableError(status)) {
      errorDialog(status, REQ_RECOVER);
    } else {
      finish();
    }
    return false;
  }
  return true;
}

如果不成功(但可恢复),控件将被放弃到GooPlaySvcs对话框,最终导致'onActivityResult'回调REQ_RECOVER:

@Override
protected void onActivityResult(int request, int result, Intent data) {
  switch (request) {
    case REQ_RECOVER: {
      mIsInAuth = false;
      if (result == Activity.RESULT_OK) {
        GooDrive.connect(true);
      } else if (result == RESULT_CANCELED) {
        finish();
      }
      break;
    }
  }
  super.onActivityResult(request, result, data);
}

如果恢复成功并且用户没有退出,应用程序可以愉快地继续进行连接尝试,这可能(或可能不)成功(我们稍后会看到);

2 /获取用户帐户。

您需要用户帐户(gmail),如果没有它,Google云端硬盘将不会与您通话。有几种方法可以获得它,你可以硬编码“myown@gmail.com”,或者你可以通过帐号选择器对话框从你设备的帐户列表中获取它:

private boolean checkUserAccount() {  
  String email = UT.AM.getActiveEmil();
  Account accnt = UT.AM.getPrimaryAccnt(true);
  if (email == null) {
    if (accnt == null) {         // multiple or no accounts available, go pick/create one
      accnt = UT.AM.getPrimaryAccnt(false);  // pre-select primary account if present
      Intent it = AccountPicker.newChooseAccountIntent(accnt, null,
       new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null
      );
      startActivityForResult(it, REQ_ACCPICK);
      return false;  //--------------------->>>
    } else {  // there's only one goo account registered with the device, skip the picker
      UT.AM.setEmil(accnt.name);
    }
    return true;  //------------------>>>>
  }

  // UNLIKELY BUT POSSIBLE,
  // emil's OK, but the account have been removed (through settings), re-select
  accnt = UT.AM.getActiveAccnt();
  if (accnt == null) {
    accnt = UT.AM.getPrimaryAccnt(false);
    Intent it = AccountPicker.newChooseAccountIntent(accnt, null,
     new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null
    );
    startActivityForResult(it, REQ_ACCPICK);
    return false;  //------------------>>>
  }
  return true;
}

上面的代码从缓存或设备的帐户列表中获取gmail帐户,考虑到用户在应用程序运行时在设置中删除帐户的可能性。它与缓存先前选择的帐户的AM(AccountManager)合作。同样,它最终可能会在Account Picker Dialog中结束,从而导致回调(与上面相同):

@Override
protected void onActivityResult(int request, int result, Intent data) {
  switch (request) {
    case REQ_ACCPICK: {  // return from account picker
      if (result == Activity.RESULT_OK && data != null) { 
        String email = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
        if (UT.AM.setEmil(email) == UT.AM.CHANGED) {
          GooDrive.init(this, UT.AM.getActiveEmil());
          GooDrive.connect(true);
        }
      } else if (UT.AM.getActiveEmil() == null) { 
        finish();
      }
      break;
    }
  }
  super.onActivityResult(request, result, data);
}

如果用户没有退出,应用程序可以愉快地初始化GoogleApiClient并进行另一次尝试,这可能会(或可能不会)成功;

3 /连接尝试可能会导致onConnectionFailed(),这可能有恢复解决方案

@Override
public void onConnectionFailed(ConnectionResult result) {
  if (!mIsInAuth) {
    if (result.hasResolution()) {
      try {
        mIsInAuth = true;
        result.startResolutionForResult(this, REQ_AUTH);
      } catch (IntentSender.SendIntentException e) {
        finish();
      }
    } else {
      finish();
    }
  }
}

如果有解决方案,则可能需要用户授权。基本上用户确认此应用可以与Google云端硬盘进行派对。再次,结果返回onActivityResult回调。

@Override
protected void onActivityResult(int request, int result, Intent data) {
  switch (request) {
    case REQ_AUTH: {
      mIsInAuth = false;
      if (result == RESULT_OK) {
        GooDrive.connect(true);
      } else if (result == RESULT_CANCELED) {
        finish();
      }
      break;
    }
  }
  super.onActivityResult(request, result, data);
}

此处的代码与步骤1 /中的代码相同,即成功连接,退出故障/用户取消。 Google云端硬盘会记住此授权,因此您通常只会看到一次。如果您需要重置,请转到网络云端硬盘,设置>管理应用>断开驱动器

回顾:

  • 第1步:如果你没有通过障碍,你就是DOA。
  • 步骤2:如果您只有一个帐户或用户选择了一个帐户,并且您已将其缓存,请将其交给GooDrive初始化,而不会引起用户烦扰。
  • 步骤3:如果用户授权该应用程序,它将永远不会再次对他造成伤害,除非他/她在网络上与“断开驱动器”混淆。

步骤2和3可能不按此处描述的顺序排列,这取决于您的应用程序逻辑。

祝你好运。