同时添加事件和阅读事件google calendar API android

时间:2017-05-17 18:26:04

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

我正在尝试创建一个可以从用户输入中编写Google日历事件的应用,还可以从我的Google日历中读取事件列表。我试图寻找很多例子,但大多数只展示了非常基本的例子。

我正在使用alertdialog从用户那里获取输入,并希望将数据发送到AsyncTask。我想在createEvent()

中拨打mActivity.updateResultsText1(createEvent())时我错了

这是我的calendar_activity代码。

public class CalendarActivity extends FragmentActivity implements OnClickListener {

private ListView listevent;
private Button addeventbtn;
private Button deleteeventbtn;
public String nama, tanggal, mulai, beres;

private ArrayAdapter<String> adapter;
List<String> eventlist =new ArrayList<String>();

com.google.api.services.calendar.Calendar mService;
GoogleAccountCredential credential;
private TextView mStatusText;

final HttpTransport transport = AndroidHttp.newCompatibleTransport();
final JsonFactory jsonFactory = GsonFactory.getDefaultInstance();

static final int REQUEST_ACCOUNT_PICKER = 1000;
static final int REQUEST_AUTHORIZATION = 1001;
static final int REQUEST_GOOGLE_PLAY_SERVICES = 1002;
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_calendar);
    listevent=(ListView)findViewById(R.id.kalenderlist);
    addeventbtn=(Button) findViewById(R.id.addeventbutton);
    addeventbtn.setOnClickListener(this);
    deleteeventbtn=(Button)findViewById(R.id.deleteevent);
    deleteeventbtn.setOnClickListener(this);

    adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,eventlist);

    mStatusText = (TextView)findViewById(R.id.statustext);

    mStatusText.setTypeface(null, Typeface.BOLD);
    mStatusText.setText("Retrieving data...");

    // Initialize credentials and service object.
    SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
    credential = GoogleAccountCredential.usingOAuth2(
            getApplicationContext(), Arrays.asList(SCOPES))
            .setBackOff(new ExponentialBackOff())
            .setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));

    mService = new com.google.api.services.calendar.Calendar.Builder(
            transport, jsonFactory, credential)
            .setApplicationName("Google Calendar API Android")
            .build();
}

public void onClick(View v) {
    if (v.getId()==R.id.addeventbutton) {

        AlertDialog.Builder addeventdialog = new AlertDialog.Builder(CalendarActivity.this);
        View mViewaddevent = getLayoutInflater().inflate(R.layout.activity_addevent,null);
        final EditText namaevent=(EditText)mViewaddevent.findViewById(eventname);
        final EditText tanggalevent=(EditText)mViewaddevent.findViewById(eventdate);
        final EditText mulaievent=(EditText)mViewaddevent.findViewById(R.id.eventtimestart);
        final EditText beresevent=(EditText)mViewaddevent.findViewById(R.id.eventtimeend);


        addeventdialog.setView(mViewaddevent);
        final AlertDialog dialog = addeventdialog.create();
        dialog.show();

        Button addbutton=(Button)mViewaddevent.findViewById(R.id.eventsavebutton);
        addbutton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!namaevent.getText().toString().isEmpty()&&!tanggalevent.getText().toString().isEmpty()&&!mulaievent.getText().toString().isEmpty()&&!beresevent.getText().toString().isEmpty()){
                    nama = namaevent.getText().toString();
                    tanggal = tanggalevent.getText().toString();
                    mulai = mulaievent.getText().toString();
                    beres = beresevent.getText().toString();

                    dialog.dismiss();
                }
                else {
                    Toast.makeText(CalendarActivity.this,"Masukan tidak lengkap",Toast.LENGTH_SHORT).show();
                    dialog.dismiss();
                }
            }
        });
        Button cancelbtn=(Button)mViewaddevent.findViewById(R.id.eventcancelbutton);
        cancelbtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });

    }
    if (v.getId()==R.id.deleteevent) {

    }
}

public void updateResultsText(final List<String> dataStrings) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (dataStrings == null) {
                mStatusText.setText("Error retrieving data!");
            } else if (dataStrings.size() == 0) {
                mStatusText.setText("No data found.");
            } else {
                mStatusText.setText("Data retrieved using" +
                        " the Google Calendar API:");
                eventlist.addAll(dataStrings);
                listevent.setAdapter(adapter);

            }
        }
    });
}

public void updateResultsText1(final String dataStrings1) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (dataStrings1 == null) {
                mStatusText.setText("Error retrieving data!");
            } else if (dataStrings1 == "") {
                mStatusText.setText("No data found.");
            } else {
                mStatusText.setText("Data retrieved using" +
                        " the Google Calendar API:");

            }
        }
    });
}

这是我的AsyncTask代码。

public class ApiAsyncTask extends AsyncTask<Void, Void, String> {
private CalendarActivity mActivity;

ApiAsyncTask(CalendarActivity activity) {
    this.mActivity = activity;
}

@Override
protected String doInBackground(Void... params) {
    try {
        mActivity.clearResultsText();
        mActivity.updateResultsText(getDataFromApi());
        mActivity.updateResultsText1(createEvent());

    } catch (final GooglePlayServicesAvailabilityIOException availabilityException) {
        mActivity.showGooglePlayServicesAvailabilityErrorDialog(
                availabilityException.getConnectionStatusCode());

    } catch (UserRecoverableAuthIOException userRecoverableException) {
        mActivity.startActivityForResult(
                userRecoverableException.getIntent(),
                CalendarActivity.REQUEST_AUTHORIZATION);

    } catch (IOException e) {
        mActivity.updateStatus("The following error occurred: " +
                e.getMessage());
    }
    return null;
}

private List<String> getDataFromApi() throws IOException {
    // List the next 20 events from the primary calendar.
    DateTime now = new DateTime(System.currentTimeMillis());
    List<String> eventStrings = new ArrayList<String>();
    Events events = mActivity.mService.events().list("primary")
            .setMaxResults(20)
            .setTimeMin(now)
            .setOrderBy("startTime")
            .setSingleEvents(true)
            .execute();
    List<Event> items = events.getItems();

    for (Event event : items) {
        DateTime start = event.getStart().getDateTime();
        if (start == null) {
            // All-day events don't have start times, so just use
            // the start date.
            start = event.getStart().getDate();
        }
        eventStrings.add(
                String.format("%s (%s)", event.getSummary(), start));
    }
    return eventStrings;
}

private String createEvent() throws IOException {

    Event event2 = new Event()
            .setSummary(mActivity.nama);

    DateTime startDateTime = new DateTime(mActivity.tanggal+"T"+mActivity.mulai+":00+07:00");
    EventDateTime start = new EventDateTime()
            .setDateTime(startDateTime)
            .setTimeZone("Asia/Jakarta");
    event2.setStart(start);

    DateTime endDateTime = new DateTime(mActivity.tanggal+"T"+mActivity.beres+":00+07:00");
    EventDateTime end = new EventDateTime()
            .setDateTime(endDateTime)
            .setTimeZone("Asia/Jakarta");
    event2.setEnd(end);

    String[] recurrence = new String[] {"RRULE:FREQ=DAILY;COUNT=1"};
    event2.setRecurrence(Arrays.asList(recurrence));

    String calendarId = "primary";
    try {
        event2 =  mActivity.mService.events().insert(calendarId, event2).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }

    System.out.printf("Event created: %s\n", event2.getHtmlLink());
    Log.e("Event", "created : " + event2.getHtmlLink());
    String eventStrings = "created : " + event2.getHtmlLink();
    return eventStrings;
}

以下是我的应用{%3}和Calendar activity的内容。我还有另一个问题。将事件列表放在阅读Google日历活动的列表视图中仅显示1个事件。如果我使用textview而不是Listview,并将所有事件连接成一个字符串,则可以显示20个事件。

感谢您阅读我的问题并完成我的错误代码。希望你能回答他们。

0 个答案:

没有答案