title: Always getting NEED_PERMISSION Exception even after giving permission
body: <p>I am using Google Drive cross client identity so that when user gives Drive access permission to my Android App, my web server also gains access to user Google Drive.</p>
  
  <p>For this firstly I have to get an Authorization code. For this I am using following code:</p>
  
  <pre><code>private String getAccessToken(Context mContext) {
        String SERVER_CLIENT_ID = "1009999994.apps.googleusrcontent.com";
        String scopes = "oauth2:server:client_id:"+SERVER_CLIENT_ID+":api_scope:"+DriveScopes.DRIVE;
        String accessToken = null;
  
        try {
          accessToken = GoogleAuthUtil.getToken(mContext, accountName, scopes); 
          Log.d("token is:", "token:"+accessToken);
      } catch (UserRecoverableAuthException e) {
  
          e.printStackTrace();
      } catch (IOException e) {
  
          e.printStackTrace();
      } catch (GoogleAuthException e) {
  
          e.printStackTrace();
      } catch (Exception e) {
          e.printStackTrace();
      }
  
        return accessToken;
    }
  </code></pre>
  
  <p>Here is exception I got in Logcat:</p>
  
  <pre><code>   07-20 12:12:10.210: W/GLSActivity(29164): [qq] Status from wire: INVALID_SCOPE status: INVALID_SCOPE
      07-20 12:12:12.453: W/System.err(29037): com.google.android.gms.auth.GoogleAuthException: INVALID_SCOPE
      07-20 12:12:12.492: W/System.err(29037):    at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
      07-20 12:12:12.492: W/System.err(29037):    at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
      07-20 12:12:12.500: W/System.err(29037):    at com.example.googledriveaccess1.MainActivity.getAccessToken(MainActivity.java:161)
      07-20 12:12:12.500: W/System.err(29037):    at com.example.googledriveaccess1.MainActivity.access$0(MainActivity.java:155)
  </code></pre>
  
  <p>Here I am using same project for both Android and Server side access.
  I am also passing Client-ID for web.</p>
  
  <p>Earlier I was using not using Cross-Client Identity and my app getting access token correctly.</p>
  
  <p>previously my scope was</p>
  
  <pre><code>String scope = "oauth2:"+DriveScopes.DRIVE;
  </code></pre>
  
  <p>Waiting for your reply</p>
  
  <p><strong>Edit:2</strong></p>
  
  <p>Here I am uploading my full code. In this code INVALID_SCOPE problem resolved after I use PLUS.LOGIN scope as well with DriveScope.Drive.</p>
  
  <pre><code>package com.example.googleaccess;
  
  import java.io.IOException;
  
  import android.accounts.AccountManager;
  import android.app.Activity;
  import android.content.Context;
  import android.content.Intent;
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.Menu;
  
  import com.google.android.gms.auth.GoogleAuthException;
  import com.google.android.gms.auth.GoogleAuthUtil;
  import com.google.android.gms.auth.GooglePlayServicesAvailabilityException;
  import com.google.android.gms.auth.UserRecoverableAuthException;
  import com.google.android.gms.common.GooglePlayServicesUtil;
  import com.google.android.gms.common.Scopes;
  import com.google.android.gms.plus.PlusClient;
  import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
  import com.google.api.services.drive.DriveScopes;
  
  
  public class MainActivity extends Activity {
  
      private String accountName = null;
      private GoogleAccountCredential credential;
      private int REQUEST_ACCOUNT_PICKER = 2;
      private int REQUEST_AUTHORIZATION = 11;
  
      @SuppressWarnings("deprecation")
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          String CLIENT_ID = "60000000007.apps.googleusercontent.com";
          String scope = "server:client_id:"+CLIENT_ID+":api_scope:"+DriveScopes.DRIVE+" "+"https://www.googleapis.com/auth/plus.login";
          credential = GoogleAccountCredential.usingOAuth2(MainActivity.this, scope);
          startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
          GooglePlayServicesUtil.isGooglePlayServicesAvailable(MainActivity.this);
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          getMenuInflater().inflate(R.menu.main, menu);
          return false;
      }
  
      class Async extends AsyncTask&lt;Void, Void, Void&gt; {
  
          Context credential = null;
  
          public Async(Context credential) {
              this.credential = credential;
          }
  
          @Override
          protected Void doInBackground(Void... params) {
              getAccessToken(credential);
              return null;
          }
  
      }
  
      public void getAccessToken(Context mContext) {
  
          try {
  
              String token = credential.getToken();
              Log.d("Token", "token:"+token);
          } catch (GooglePlayServicesAvailabilityException playEx) {
              playEx.getMessage();
              playEx.printStackTrace();
  
            }catch (UserRecoverableAuthException e) {
              e.printStackTrace();
              Log.d("Token", "token:"+e.getCause());
  
              startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
          } catch (IOException e) {
              e.printStackTrace();
              Log.d("Token", "token:"+e.getMessage());
          } catch (GoogleAuthException e) {
              e.printStackTrace();
              Log.d("Token", "token:"+e.getMessage());
          }
      }
  
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          if(requestCode == REQUEST_ACCOUNT_PICKER) {
              if (resultCode == RESULT_OK &amp;&amp; data != null &amp;&amp; data.getExtras() != null) {
              accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
  
                  if (accountName != null) {
                    credential.setSelectedAccountName(accountName);
  
                    new Async(getApplicationContext()).execute();
                  }
                }
          }
  
          if(requestCode == REQUEST_AUTHORIZATION) {
              if (resultCode == Activity.RESULT_OK) {
                  data.getExtras();
                  new Async(getApplicationContext()).execute();
                } else {
                    startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
                }
          }
      }
  
  
  }
  </code></pre>
  
  <p>Now I always got Need_Permission exception, I always gives permission from device but it's not working.
  Again and again NEED_EXCEPTION error comes. You can also try my code by inputting your project CLIENT_ID. Please help me I am really stuck at this point.</p>
  
  <p>May be there be any more permission I have to give but I don't now which permission.</p>
  
  <p>Sorry for my bad english.</p>