在Android中将事件插入Google日历

时间:2016-11-28 17:13:00

标签: android api google-calendar-api

我正在创建一个允许用户通过Android应用程序插入事件的应用程序。我的应用程序使用谷歌日历API for Android,我目前很困惑,我的应用程序只允许我自己的帐户将事件插入谷歌日历。任何人都可以帮我解决我的问题。如果您想知道

,这就是代码
private class MakeNotificationTask extends AsyncTask<Void, Void, Boolean>{

    private com.google.api.services.calendar.Calendar mService = null;
    private Exception mLastError = null;

    public MakeNotificationTask(GoogleAccountCredential credential) {
        HttpTransport transport = AndroidHttp.newCompatibleTransport();
        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        mService = new com.google.api.services.calendar.Calendar.Builder(
                transport, jsonFactory, credential)
                .setApplicationName("Google Calendar API Android Quickstart")
                .build();
    }

    public void MakeNotification(String name, String date){

        Event event = new Event()
                .setSummary(name + "'s vehicle registration license expires")
                .setDescription("Please renew your vehicle registration license!!!");

        String newId = generateTimeStamp();

        event.setId(newId);

        VehiclesDatabase dbase = new VehiclesDatabase(getApplicationContext());

        dbase.insertSTNK(newId, name);

        DateTime startDateTime = new DateTime(date+"T09:00:00+07:00");
        EventDateTime start = new EventDateTime()
                .setDateTime(startDateTime);
        event.setStart(start);

        DateTime endDateTime = new DateTime(date+"T23:59:59+07:00");
        EventDateTime end = new EventDateTime()
                .setDateTime(endDateTime);
        event.setEnd(end);

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

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

        String calendarId = "primary";

        try {
            mService.events().insert(calendarId, event).execute();
            Log.e("event making", "success");
        } catch (IOException e) {

            Log.e("event making", "goes horribly wrong "+e.getMessage());
            e.printStackTrace();
        }
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            MakeNotification(vehicleName, stnkDate);
            Log.e("event insertion success", "Success in making event");
            return true;
        } catch (Exception e) {
            mLastError = e;
            Log.e("event insertion error", "Failed in making event " + e.getMessage());
            return false;
        }
    }

    @Override
    protected void onCancelled() {
        if (mLastError != null) {
            if (mLastError instanceof GooglePlayServicesAvailabilityIOException) {
                showGooglePlayServicesAvailabilityErrorDialog(
                        ((GooglePlayServicesAvailabilityIOException) mLastError)
                                .getConnectionStatusCode());
            } else if (mLastError instanceof UserRecoverableAuthIOException) {
                startActivityForResult(
                        ((UserRecoverableAuthIOException) mLastError).getIntent(),
                        AddVehicles.REQUEST_AUTHORIZATION);
            } else {
                Log.e("error when cancelled", mLastError.getMessage());
            }
        } else {
            Log.e("cancelled", "request cancelled");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

尝试添加以下代码(除了IOException之外);它会弹出一个单独的提示,用户会向您提供您的App权限以修改用户的日历:

catch (UserRecoverableAuthIOException e) {
    context.startActivity(e.getIntent());
}

请注意,这将在某种程度上触发用户的Google帐户的安全警报。不过,我没有看到任何负面影响,也不需要他们进一步确认。根据帐户设置的不同,可能有一种方法可以拥有一个Google帐户,该帐户只是不允许此权限,并且可能永远不会触发该异常;最好只是在那个时候失败。