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.
For this firstly I have to get an Authorization code. For this I am using following 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;
}
Here is exception I got in Logcat:
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)
Here I am using same project for both Android and Server side access. I am also passing Client-ID for web.
Earlier I was using not using Cross-Client Identity and my app getting access token correctly.
previously my scope was
String scope = "oauth2:"+DriveScopes.DRIVE;
Waiting for your reply
Edit:2
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.
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<Void, Void, Void> {
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 && data != null && 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);
}
}
}
}
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.
May be there be any more permission I have to give but I don't now which permission.
Sorry for my bad english.