I’m encountering a 403 Forbidden error when trying to connect to the Drive API in my Android application. The error message indicates “Access Not Configured” despite having enabled both the Drive SDK and Drive API in my console setup.
Here’s a sample of my code that manages authentication and file retrieval:
package com.driveapp.cloudexample;
import java.io.IOException;
import java.util.List;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.android.gms.common.AccountPicker;
import com.google.api.client.auth.oauth2.BearerToken;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.android2.AndroidHttp;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;
public class CloudActivity extends Activity {
private static final int SELECT_ACCOUNT = 1;
private String userToken;
private Button connectButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
connectButton = (Button) findViewById(R.id.connect_btn);
connectButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
selectUserAccount();
}
});
}
private void selectUserAccount() {
Intent picker = AccountPicker.newChooseAccountIntent(
null, null, new String[]{"com.google"}, false, null, null, null, null);
startActivityForResult(picker, SELECT_ACCOUNT);
}
private void authenticateUser(Account userAccount) {
AsyncTask<Account, Void, String> authTask = new AsyncTask<Account, Void, String>() {
@Override
protected String doInBackground(Account... accounts) {
try {
return GoogleAuthUtil.getToken(
CloudActivity.this,
accounts[0].name,
"oauth2:" + DriveScopes.DRIVE);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(String token) {
if (token != null) {
userToken = token;
fetchCloudFiles();
}
}
};
authTask.execute(userAccount);
}
private Drive createDriveService() {
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JacksonFactory jsonFactory = new JacksonFactory();
Credential creds = new Credential(BearerToken.authorizationHeaderAccessMethod())
.setAccessToken(userToken);
return new Drive.Builder(transport, jsonFactory, creds).build();
}
private void fetchCloudFiles() {
Drive driveService = createDriveService();
try {
Drive.Files.List fileQuery = driveService.files().list();
FileList results = fileQuery.execute(); // This line throws the exception
List<File> items = results.getItems();
Log.d("CloudApp", "Found files: " + items.size());
for (File item : items) {
Log.d("CloudApp", "File: " + item.getTitle());
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SELECT_ACCOUNT && resultCode == RESULT_OK) {
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
// Handle account selection
}
}
}
The problem occurs at the execute() function where I receive a 403 error related to “usageLimits” with the reason “accessNotConfigured.” Although I’ve enabled the relevant APIs and tried several client IDs, I’m still unsure what I may have missed in setting everything up.