Google Play服务:请求身份验证时,TokenActivity显示为空

时间:2013-05-08 22:31:48

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

我正在开发一款使用Google云端硬盘作为后端的应用。我已经完成了DrEdit示例,我遇到了授权问题。我到达了UserRecoverableAuthException并使用它来发布用户必须做某事的通知。问题是当我点击该通知时似乎没有任何事情发生。

我说“看起来”似乎没有发生任何事情,因为看起来Google Play正在推出处理它,它只是看不见。如果我点击应用程序切换按钮,我可以看到具有半透明背景的Google Play服务磁贴,但用户从未看到过身份验证屏幕。

App Switcher

有什么我想念的吗?我在API控制台中有一个项目配置了驱动器访问权限,并添加了我的发布和开发版本的密钥。

这是我用于通知的代码。它几乎就是DrEdit样本中的内容(也有同样的问题)。

try {
    GoogleAccountCredential credential =
            GoogleAccountCredential.usingOAuth2(mContext, DriveScopes.DRIVE_FILE);
    credential.setSelectedAccountName(mAccount.name);
    // Trying to get a token right away to see if we are authorized
    credential.getToken();
    mService = new Drive.Builder(AndroidHttp.newCompatibleTransport(),
            new GsonFactory(), credential).build();
} catch (UserRecoverableAuthException e) {
    Log.e("Failed to get token");
    // If the exception is User Recoverable, we display a notification that will trigger the
    // intent to fix the issue.
    Log.e("Notifying with intent: " + e.getIntent().toString());
    NotificationManager notificationManager = (NotificationManager) mContext
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Intent authorizationIntent = e.getIntent();
    authorizationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(
            Intent.FLAG_FROM_BACKGROUND);
    PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, 
            authorizationIntent, 0);
    Notification notification = new Notification.Builder(mContext)
            .setSmallIcon(android.R.drawable.ic_dialog_alert)
            .setTicker("Permission requested")
            .setContentTitle("Permission requested")
            .setContentText("for account " + mAccount.name)
            .setContentIntent(pendingIntent).setAutoCancel(true).build();
    notificationManager.notify(0, notification);
} catch (Exception e) {
        e.printStackTrace();
}

编辑:

我只是想澄清一下,我确实有一个Google API项目设置,可以访问Drive API(最初是Drive SDK,但我修复了它),我的应用程序的调试密钥是用keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v获取的。仍然没有运气。

3 个答案:

答案 0 :(得分:3)

我终于想出了这个。看起来文档和示例有点过时,因为只有DriveScopes.DRIVE_FILE的范围是不够的,它需要加上"oauth:"

这是我的代码:

try {
    // Trying to get a token right away to see if we are authorized
    GoogleAuthUtil.getTokenWithNotification(mContext, mAccount.name, 
            "oauth2:" + DriveScopes.DRIVE_FILE, null, mAuthority, mSyncBundle);
} catch (UserRecoverableNotifiedException e) {
    Log.e("Failed to get token but notified user");
    return null;
} catch (Exception e) {
    Log.e("Failed to get token", e);
    return null;
}

try {
    GoogleAccountCredential credential =
        GoogleAccountCredential.usingOAuth2(mContext, DriveScopes.DRIVE_FILE);
    credential.setSelectedAccountName(mAccount.name);
    ...

注意:我还决定切换到GoogleAuthUtil.getTokenWithNotification让库为我处理通知,并在完成时重新启动同步适配器。

答案 1 :(得分:2)

这是我使用的getDriveService方法。 (复制自rharter的回复)

 private Drive getDriveService() {
    if (mService == null) {
        try {
            // Trying to get a token right away to see if we are authorized
            GoogleAuthUtil.getTokenWithNotification(mContext,
                mAccount.name, "oauth2:" + DriveScopes.DRIVE_FILE,
                null);//, mAuthority, mSyncBundle);
            } 
        catch (Exception e) {
            Log.e(TAG, "error can't get token GREG GREG GREG", e);
            return null;
        }
      try {
        GoogleAccountCredential credential =
            GoogleAccountCredential.usingOAuth2(mContext, DriveScopes.DRIVE_FILE);
        credential.setSelectedAccountName(mAccount.name);
        // Trying to get a token right away to see if we are authorized
        credential.getToken();
        mService = new Drive.Builder(AndroidHttp.newCompatibleTransport(),
                new GsonFactory(), credential).build();
            } catch (Exception e) {
                Log.e(TAG, "Failed to get token");
                // If the Exception is User Recoverable, we display a notification that will trigger the
                // intent to fix the issue.
                if (e instanceof UserRecoverableAuthException) {
                    UserRecoverableAuthException exception = (UserRecoverableAuthException) e;
                    NotificationManager notificationManager = (NotificationManager) mContext
                        .getSystemService(Context.NOTIFICATION_SERVICE);
                    Intent authorizationIntent = exception.getIntent();
                    authorizationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(
                        Intent.FLAG_FROM_BACKGROUND);
                    PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0,
                        authorizationIntent, 0);
                    Notification notification = new Notification.Builder(mContext)
                        .setSmallIcon(android.R.drawable.ic_dialog_alert)
                        .setTicker("Permission requested")
                        .setContentTitle("Permission requested")
                        .setContentText("for account " + mAccount.name)
                        .setContentIntent(pendingIntent).setAutoCancel(true).build();
                    notificationManager.notify(0, notification);
                } else {
                    e.printStackTrace();
                }
            }
    }
    return mService;
  }

答案 2 :(得分:0)

确保您已在API控制台上正确注册了正在为应用程序签名的签名。我们的应用程序遇到了类似的问题,修复签名足迹解决了我们的问题。