如果提示让我的应用访问其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();
我如何确认他们是否说"取消"并不想连接?我不想经常纠缠用户登录。
答案 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云端硬盘会记住此授权,因此您通常只会看到一次。如果您需要重置,请转到网络云端硬盘,设置>管理应用>断开驱动器
回顾:
步骤2和3可能不按此处描述的顺序排列,这取决于您的应用程序逻辑。
祝你好运。