谷歌日历Api Android:403错误

时间:2016-08-08 13:14:21

标签: android api oauth google-calendar-api android-calendar

我在尝试让Google Calendar Api与我合作时遇到了很多麻烦。我经常搜索并尝试了许多似乎失败的解决方案。

我尝试了什么: - 启用Contacts API - Google+ API - Google Calendar API - 在调试/发布模式下运行应用程序 - 多次重新创建SHA1代码 - 更改应用名称

这是我的MainActivity,它类似于快速入门中的那个,但我做了一些事情来改变它以创建一个事件。

package com.example.roudy.calendarplayground;

public class MainActivity extends AppCompatActivity  implements EasyPermissions.PermissionCallbacks{
private GoogleAccountCredential mCredential;

private static final int REQUEST_ACCOUNT_PICKER = 1000;
private static final int REQUEST_AUTHORIZATION = 1001;
private static final int REQUEST_GOOGLE_PLAY_SERVICES = 1002;
private static final int REQUEST_PERMISSION_GET_ACCOUNTS = 1003;
private static final String PREF_ACCOUNT_NAME = "accountName";
private static final String[] SCOPES = { CalendarScopes.CALENDAR };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mCredential = GoogleAccountCredential.usingOAuth2(
            getApplicationContext(), Arrays.asList(SCOPES))
            .setBackOff(new ExponentialBackOff());
    getResultsFromApi();
}

@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {

}

@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {

}

private void getResultsFromApi() {
    if (!isGooglePlayServicesAvailable()) {
        acquireGooglePlayServices();
    } else if (mCredential.getSelectedAccountName() == null) {
        chooseAccount();
    } else if (!isDeviceOnline()) {
        Toast.makeText(this, "No network connection available.", Toast.LENGTH_SHORT).show();
    } else if (!EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_CALENDAR)){
        EasyPermissions.requestPermissions(
                this,
                "This app needs to write to your calendar.",
                REQUEST_PERMISSION_GET_ACCOUNTS,
                Manifest.permission.WRITE_CALENDAR);
    } else if(!EasyPermissions.hasPermissions(this, Manifest.permission.READ_CALENDAR)){
        EasyPermissions.requestPermissions(
                this,
                "This app needs to read from your calendar.",
                REQUEST_PERMISSION_GET_ACCOUNTS,
                Manifest.permission.READ_CALENDAR);
    } else {
        new createEvent(mCredential).execute();
    }

}

private class createEvent extends AsyncTask<Void, Void, Void>{
    private com.google.api.services.calendar.Calendar service = null;
    private Exception mLastError;
    public createEvent (GoogleAccountCredential credential) {
        HttpTransport transport = AndroidHttp.newCompatibleTransport();
        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        service = new com.google.api.services.calendar.Calendar.Builder(
                transport, jsonFactory, credential)
                .setApplicationName("CalendarPlayground")
                .build();
    }
    @Override
    protected Void doInBackground(Void... voids) {
        Event event = new Event()
                .setSummary("Tutor Meetting!")
                .setLocation("beirut, Lebanon")
                .setDescription("Some weird description!");

        DateTime startDateTime = new DateTime("2016-08-08T17:00:00");
        EventDateTime start = new EventDateTime()
                .setDateTime(startDateTime)
                .setTimeZone("GMT+3");
        event.setStart(start);

        DateTime endDateTime = new DateTime("2016-08-08T18:00:00");
        EventDateTime end = new EventDateTime()
                .setDateTime(endDateTime)
                .setTimeZone("GMT+3");
        event.setEnd(end);

        EventReminder[] reminderOverrides = new EventReminder[] {
                new EventReminder().setMethod("email").setMinutes(24 * 60),
                new EventReminder().setMethod("popup").setMinutes(10),
        };

        Event.Reminders reminders = new Event.Reminders()
                .setUseDefault(false)
                .setOverrides(Arrays.asList(reminderOverrides));
        event.setReminders(reminders);


        String calendarId = "primary";
        try {
           service.events().insert(calendarId, event).execute();
        } catch (Exception e) {
            mLastError = e;
            e.printStackTrace();
            cancel(true);
        }
        return null;
    }
    @Override
    protected void onCancelled() {
        Toast.makeText(MainActivity.this, "Task canceled", Toast.LENGTH_SHORT).show();
        if (mLastError != null) {
            if (mLastError instanceof GooglePlayServicesAvailabilityIOException) { // not entered
                showGooglePlayServicesAvailabilityErrorDialog(
                        ((GooglePlayServicesAvailabilityIOException) mLastError)
                                .getConnectionStatusCode());
            } else if (mLastError instanceof UserRecoverableAuthIOException) { // not entered
                startActivityForResult(
                        ((UserRecoverableAuthIOException) mLastError).getIntent(),
                        MainActivity.REQUEST_AUTHORIZATION);
            } else {

            }
        } else {

        }
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        Toast.makeText(MainActivity.this, "Event created !", Toast.LENGTH_SHORT).show();
        super.onPostExecute(aVoid);
    }
}

@AfterPermissionGranted(REQUEST_PERMISSION_GET_ACCOUNTS)
private void chooseAccount() {
    if (EasyPermissions.hasPermissions(
            this, Manifest.permission.GET_ACCOUNTS)) {
        String accountName = getPreferences(Context.MODE_PRIVATE)
                .getString(PREF_ACCOUNT_NAME, null);
        if (accountName != null) {
            mCredential.setSelectedAccountName(accountName);
            getResultsFromApi();
        } else {
            startActivityForResult(
                    mCredential.newChooseAccountIntent(),
                    REQUEST_ACCOUNT_PICKER);
        }
    } else {
        EasyPermissions.requestPermissions(
                this,
                "This app needs to access your Google account (via Contacts).",
                REQUEST_PERMISSION_GET_ACCOUNTS,
                Manifest.permission.GET_ACCOUNTS);
    }
}

@Override
protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode) {
        case REQUEST_GOOGLE_PLAY_SERVICES:
            if (resultCode != RESULT_OK) {
                Toast.makeText(this, "This app requires Google Play Services. Please install " +
                        "Google Play Services on your device and relaunch this app.", Toast.LENGTH_SHORT).show();

            } else {
                getResultsFromApi();
            }
            break;
        case REQUEST_ACCOUNT_PICKER:
            if (resultCode == RESULT_OK && data != null &&
                    data.getExtras() != null) {
                String accountName =
                        data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                if (accountName != null) {
                    SharedPreferences settings =
                            getPreferences(Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putString(PREF_ACCOUNT_NAME, accountName);
                    editor.apply();
                    mCredential.setSelectedAccountName(accountName);
                    getResultsFromApi();
                }
            }
            break;
        case REQUEST_AUTHORIZATION:
            if (resultCode == RESULT_OK) {
                getResultsFromApi();
            }
            break;
    }
}

public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    EasyPermissions.onRequestPermissionsResult(
            requestCode, permissions, grantResults, this);
}
private boolean isDeviceOnline() {
    ConnectivityManager connMgr =
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    return (networkInfo != null && networkInfo.isConnected());
}

private boolean isGooglePlayServicesAvailable() {
    GoogleApiAvailability apiAvailability =
            GoogleApiAvailability.getInstance();
    final int connectionStatusCode =
            apiAvailability.isGooglePlayServicesAvailable(this);
    return connectionStatusCode == ConnectionResult.SUCCESS;
}

private void acquireGooglePlayServices() {
    GoogleApiAvailability apiAvailability =
            GoogleApiAvailability.getInstance();
    final int connectionStatusCode =
            apiAvailability.isGooglePlayServicesAvailable(this);
    if (apiAvailability.isUserResolvableError(connectionStatusCode)) {
        showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
    }
}

private void showGooglePlayServicesAvailabilityErrorDialog(
        final int connectionStatusCode) {
    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
    Dialog dialog = apiAvailability.getErrorDialog(
            MainActivity.this,
            connectionStatusCode,
            REQUEST_GOOGLE_PLAY_SERVICES);
    dialog.show();
}





}

以下是我得到的错误。在询问这个问题之前,我已经确定一切都是应该的,我到处搜索答案,似乎没有任何效果。 &#34;取消(真)&#34;当然是触发但是没有输入if条件,顺便说一下。 (见代码)

    W/System.err: {
W/System.err:   "code" : 403,
W/System.err:   "errors" : [ {
W/System.err:     "domain" : "usageLimits",
W/System.err:     "message" : "Access Not Configured. Calendar API has not been used in project 608941808256 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/calendar/overview?project=608941808256 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",
W/System.err:     "reason" : "accessNotConfigured",
W/System.err:     "extendedHelp" : "https://console.developers.google.com/apis/api/calendar/overview?project=608941808256"
W/System.err:   } ],
W/System.err:   "message" : "Access Not Configured. Calendar API has not been used in project 608941808256 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/calendar/overview?project=608941808256 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry."
W/System.err: }

I have tried recreating the SHA1 many, many times

Package name copy pasted and everything looks the same

1 个答案:

答案 0 :(得分:0)

由于错误可以报告项目#,这意味着您已正确输入SHA-1和API密钥。它必须是Google Dev Console中的一个问题。

这是您需要做的事情:

登录&gt;图书馆&gt; Google Calendar API

在该屏幕上,您应该能够为所有API密钥启用此API。单击“启用”后,继续执行凭据页面。

创建凭据&gt;帮我选择

进入后,请输入您正在使用的API以及使用它的位置。在您的情况下,它将是Google Calendar API和Android。输入后,开发者控制台应该帮助您创建0Auth 2.0凭据,以便Google用户可以登录并在您的应用中使用Google日历API。希望这有帮助!