2016-10-04 151 views
2

为什么我得到这个错误?我已经在Google开发者控制台中创建了一个项目,启用了Drive API和Google+ API,并添加了我的已签名apk的sha1(我已经在Google Play控制台上作为测试版共享)的“Android客户端ID”。

我得到的权限GET_ACCOUNTS,当我选择我的G +邮件列表中,我得到这个错误:G +连接失败statusCode = SIGN_IN_REQUIRED

D/G+: Connection failed4ConnectionResult{statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent 

我必须在我的项目文件夹添加client_id.json地方? (我只是创造了它在谷歌开发者控制台驱动API)。

代码:

 // initialize g+ api client 
    if (Sp.getBoolean("plus_pic", false)) { 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(Drive.API) 
       .addScope(Drive.SCOPE_FILE) 
       .build(); 
    } 

和:

@Override 
public void onConnected(Bundle bundle) { 

    if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) { 
     Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); 

     String accountName = Plus.AccountApi.getAccountName(mGoogleApiClient); 
     Person.Image personImage; 
     Person.Cover.CoverPhoto personCover; 

     try { 

      personImage = currentPerson.getImage(); 
      personCover = currentPerson.getCover().getCoverPhoto(); 
     } catch (Exception e) { 
      Log.e("G+ COnnection error"," ->"+e.toString()); 
      personCover = null; 
      personImage = null; 
     } 

     if (personCover != null && personImage != null) { 

      String imgUrl = personImage.getUrl(); 
      Log.e("g+ connection","cover and pic not null"); 
      // getting full size image 
      StringBuilder stringBuilder = new StringBuilder(); 
      stringBuilder.append(imgUrl); 
      stringBuilder.delete(imgUrl.length() - 6, imgUrl.length()); 
      Log.d("G+", stringBuilder.toString()); 
      mGoogleName.setText(currentPerson.getDisplayName()); 
      mGoogleId.setText(accountName); 
      // setting cover pic 
      ImageLoader.getInstance().loadImage(personCover.getUrl(), displayImageOptions, new SimpleImageLoadingListener() { 
       @Override 
       public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
        super.onLoadingComplete(imageUri, view, loadedImage); 
        drawerHeaderParent.setBackgroundColor(Color.parseColor("#ffffff")); 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
         drawerHeaderView.setBackground(new BitmapDrawable(loadedImage)); 
        } else 
         drawerHeaderView.setBackgroundDrawable(new BitmapDrawable(loadedImage)); 

       } 

       @Override 
       public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
        super.onLoadingFailed(imageUri, view, failReason); 
        drawerHeaderView.setBackgroundResource(R.drawable.app_header); 
        drawerHeaderParent.setBackgroundColor(Color.parseColor((currentTab == 1 ? skinTwo : skin))); 
       } 

       @Override 
       public void onLoadingStarted(String imageUri, View view) { 
        super.onLoadingStarted(imageUri, view); 
        drawerHeaderView.setBackgroundResource(R.drawable.app_header); 
        drawerHeaderParent.setBackgroundColor(Color.parseColor((currentTab == 1 ? skinTwo : skin))); 
       } 
      }); 

      // setting profile pic 
      ImageLoader.getInstance().loadImage(stringBuilder.toString(), displayImageOptions, new SimpleImageLoadingListener() { 
       @Override 
       public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
        super.onLoadingComplete(imageUri, view, loadedImage); 
        drawerProfilePic.setImageBitmap(loadedImage); 
        drawerProfilePic.setVisibility(View.VISIBLE); 
       } 

       @Override 
       public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
        super.onLoadingFailed(imageUri, view, failReason); 
       } 
      }); 


     } else { 
      Toast.makeText(this, getResources().getText(R.string.no_cover_photo), Toast.LENGTH_SHORT).show(); 
      drawerHeaderView.setBackgroundResource(R.drawable.app_header); 
      drawerHeaderParent.setBackgroundColor(Color.parseColor((currentTab == 1 ? skinTwo : skin))); 
     } 
    } 
} 

@Override 
public void onConnectionSuspended(int i) { 

    Log.d("G+", "Connection suspended"); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      if (mGoogleApiClient != null) { 

       mGoogleApiClient.connect(); 
      } 
     } 
    }).run(); 
} 

public void onConnectionFailed(final ConnectionResult result) { 
    Log.d("G+", "Connection failed"+ result.getErrorCode()+result.toString()); 

    if (!mIntentInProgress && result.hasResolution()) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        mIntentInProgress = true; 
        startIntentSenderForResult(result.getResolution().getIntentSender(), 
          RC_SIGN_IN, null, 0, 0, 0); 
       } catch (IntentSender.SendIntentException e) { 
        // The intent was canceled before it was sent. Return to the default 
        // state and attempt to connect to get an updated ConnectionResult. 
        mIntentInProgress = false; 
        if (mGoogleApiClient != null) { 

         mGoogleApiClient.connect(); 
        } 
       } 
      } 
     }).run(); 
    } 
} 

和:

protected void onActivityResult(int requestCode, int responseCode, Intent intent) { 
    if (requestCode == RC_SIGN_IN && !mGoogleApiKey && mGoogleApiClient != null) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       mIntentInProgress = false; 
       mGoogleApiKey = true; 
       // !mGoogleApiClient.isConnecting 
       if (mGoogleApiClient.isConnecting()) { 
        mGoogleApiClient.connect(); 
       } else 
        mGoogleApiClient.disconnect(); 

      } 
     }).run(); 
    } 

回答

1

你得到了错误SIGN_IN_REQUIRED因为客户端尝试连接到该服务但用户未登录。

The client may choose to continue without using the API. Alternately, if hasResolution() returns true the client may call [ startResolutionForResult(Activity, int) ](https://developers.google.com/android/reference/com/google/android/gms/common/ConnectionResult.html#startResolutionForResult(android.app.Activity , int)) to prompt the user to sign in. After the sign in activity returns with RESULT_OK further attempts should succeed.

从这个forum基础,尝试通过从您的Gmail帐户要去谷歌API控制台来解决此问题。您会在Google Drive API前看到禁用按钮。你会看到一个齿轮或设置按钮,点击它并生成oAuth令牌。

这里有一些相关的主题:

希望这有助于!

+0

我已经生成了auth2令牌,并且我将google_services.json导入到“app /”文件夹中,并且出现此错误。是否必须在我的代码中使用该client_id? – erginduran

+0

btw我检查了你的链接没有回答的问题,我认为许多脂肪酶都面临着这个问题。 – erginduran

0

在我的原因我错误地使用发行版SHA1密钥在开发人员控制台中生成API。然后用debug.keystore创建SHA1密钥并在我的API证书中更新。它开始工作。

keytool -list -v -keystore "C:\Users\<user>n\.android\debug.keystore" -alias androiddebugkey -storepass andro 
id -keypass android