2016-06-23 1 views
1

Я хочу прочитать часы событий из андроид-календаря. Как я могу прочитать часы событий? Теперь мой код возвращает только имя события, дату начала и дату окончания.Чтение часовых поясов из календара android

package com.examples.android.calendar;

import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 

import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.net.Uri; 


public class Utility extends Activity { 
    public static ArrayList<String> nameOfEvent = new ArrayList<String>(); 
    public static ArrayList<String> startDates = new ArrayList<String>(); 
    public static ArrayList<String> endDates = new ArrayList<String>(); 
    public static ArrayList<String> descriptions = new ArrayList<String>(); 

    public static ArrayList<String> readCalendarEvent(Context context) { 
     Cursor cursor = context.getContentResolver() 
       .query(Uri.parse("content://com.android.calendar/events"), 
         new String[] { "calendar_id", "title", "description", 
           "dtstart", "dtend", "eventLocation" }, null, 
         null, null); 
     cursor.moveToFirst(); 
     // fetching calendars name 
     String CNames[] = new String[cursor.getCount()]; 

     // fetching calendars id 
     nameOfEvent.clear(); 
     startDates.clear(); 
     endDates.clear(); 
     descriptions.clear(); 
     for (int i = 0; i < CNames.length; i++) { 

      nameOfEvent.add(cursor.getString(1)); 
      startDates.add(getDate(Long.parseLong(cursor.getString(3)))); 
      endDates.add(getDate(Long.parseLong(cursor.getString(4)))); 
      descriptions.add(cursor.getString(2)); 
      CNames[i] = cursor.getString(1); 
      cursor.moveToNext(); 

     } 
     return nameOfEvent; 
    } 

    public static String getDate(long milliSeconds) { 
     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(milliSeconds); 
     return formatter.format(calendar.getTime()); 
    } 
} 

MainActivity

package com.examples.android.calendar; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.GregorianCalendar; 
import java.util.Locale; 

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.GridView; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.example.newrosoft74.myapplication3.R; 

/** 
* @author Mukesh Y 
*/ 
public class MainActivity extends Activity { 

    public GregorianCalendar month, itemmonth;// calendar instances. 

    public Main3Activity adapter;// adapter instance 
    public Handler handler;// for grabbing some event values for showing the dot 
    // marker. 
    public ArrayList<String> items; // container to store calendar items which 
    // needs showing the event marker 
    ArrayList<String> event; 
    LinearLayout rLayout; 
    ArrayList<String> date; 
    ArrayList<String> desc; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Locale.setDefault(Locale.US); 

     rLayout = (LinearLayout) findViewById(R.id.text); 
     month = (GregorianCalendar) GregorianCalendar.getInstance(); 
     itemmonth = (GregorianCalendar) month.clone(); 

     items = new ArrayList<String>(); 

     adapter = new Main3Activity(this, month); 

     GridView gridview = (GridView) findViewById(R.id.gridView); 
     gridview.setAdapter(adapter); 

     handler = new Handler(); 
     handler.post(calendarUpdater); 

     TextView title = (TextView) findViewById(R.id.title); 
     title.setText(android.text.format.DateFormat.format("MMMM yyyy", month)); 

     RelativeLayout previous = (RelativeLayout) findViewById(R.id.previous); 

     previous.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       setPreviousMonth(); 
       refreshCalendar(); 
      } 
     }); 

     RelativeLayout next = (RelativeLayout) findViewById(R.id.next); 
     next.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       setNextMonth(); 
       refreshCalendar(); 

      } 
     }); 

     gridview.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, 
            int position, long id) { 
       // removing the previous view if added 
       if (((LinearLayout) rLayout).getChildCount() > 0) { 
        ((LinearLayout) rLayout).removeAllViews(); 
       } 
       desc = new ArrayList<String>(); 
       date = new ArrayList<String>(); 
       ((Main3Activity) parent.getAdapter()).setSelected(v); 
       String selectedGridDate = Main3Activity.dayString 
         .get(position); 
       String[] separatedTime = selectedGridDate.split("-"); 
       String gridvalueString = separatedTime[2].replaceFirst("^0*", 
         "");// taking last part of date. ie; 2 from 2012-12-02. 
       int gridvalue = Integer.parseInt(gridvalueString); 
       // navigate to next or previous month on clicking offdays. 
       if ((gridvalue > 10) && (position < 8)) { 
        setPreviousMonth(); 
        refreshCalendar(); 
       } else if ((gridvalue < 7) && (position > 28)) { 
        setNextMonth(); 
        refreshCalendar(); 
       } 
       ((Main3Activity) parent.getAdapter()).setSelected(v); 

       for (int i = 0; i < Utility.startDates.size(); i++) { 
        if (Utility.startDates.get(i).equals(selectedGridDate)) { 
         desc.add(Utility.nameOfEvent.get(i)); 
        } 
       } 

       if (desc.size() > 0) { 
        for (int i = 0; i < desc.size(); i++) { 
         TextView rowTextView = new TextView(MainActivity.this); 

         // set some properties of rowTextView or something 
         rowTextView.setText("Event:" + desc.get(i)); 
         rowTextView.setTextColor(Color.BLACK); 

         // add the textview to the linearlayout 
         rLayout.addView(rowTextView); 

        } 

       } 

       desc = null; 

      } 

     }); 
    } 

    protected void setNextMonth() { 
     if (month.get(GregorianCalendar.MONTH) == month 
       .getActualMaximum(GregorianCalendar.MONTH)) { 
      month.set((month.get(GregorianCalendar.YEAR) + 1), 
        month.getActualMinimum(GregorianCalendar.MONTH), 1); 
     } else { 
      month.set(GregorianCalendar.MONTH, 
        month.get(GregorianCalendar.MONTH) + 1); 
     } 

    } 

    protected void setPreviousMonth() { 
     if (month.get(GregorianCalendar.MONTH) == month 
       .getActualMinimum(GregorianCalendar.MONTH)) { 
      month.set((month.get(GregorianCalendar.YEAR) - 1), 
        month.getActualMaximum(GregorianCalendar.MONTH), 1); 
     } else { 
      month.set(GregorianCalendar.MONTH, 
        month.get(GregorianCalendar.MONTH) - 1); 
     } 

    } 

    protected void showToast(String string) { 
     Toast.makeText(this, string, Toast.LENGTH_SHORT).show(); 

    } 

    public void refreshCalendar() { 
     TextView title = (TextView) findViewById(R.id.title); 

     adapter.refreshDays(); 
     adapter.notifyDataSetChanged(); 
     handler.post(calendarUpdater); // generate some calendar items 

     title.setText(android.text.format.DateFormat.format("MMMM yyyy", month)); 
    } 

    public Runnable calendarUpdater = new Runnable() { 

     @Override 
     public void run() { 
      items.clear(); 

      // Print dates of the current week 
      DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
      String itemvalue; 
      event = Utility.readCalendarEvent(MainActivity.this); 
      Log.d("=====Event====", event.toString()); 
      Log.d("=====Date ARRAY====", Utility.startDates.toString()); 

      for (int i = 0; i < Utility.startDates.size(); i++) { 
       itemvalue = df.format(itemmonth.getTime()); 
       itemmonth.add(GregorianCalendar.DATE, 1); 
       items.add(Utility.startDates.get(i).toString()); 
      } 
      adapter.setItems(items); 
      adapter.notifyDataSetChanged(); 
     } 
    }; 
} 

Main3Activity

package com.examples.android.calendar; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.GregorianCalendar; 
import java.util.List; 
import java.util.Locale; 

import android.content.Context; 
import android.graphics.Color; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.example.newrosoft74.myapplication3.R; 


public class Main3Activity extends BaseAdapter { 
    private Context mContext; 

    private java.util.Calendar month; 
    public GregorianCalendar pmonth; // calendar instance for previous month 

    public GregorianCalendar pmonthmaxset; 
    private GregorianCalendar selectedDate; 
    int firstDay; 
    int maxWeeknumber; 
    int maxP; 
    int calMaxP; 
    int lastWeekDay; 
    int leftDays; 
    int mnthlength; 
    String itemvalue, curentDateString; 
    DateFormat df; 

    private ArrayList<String> items; 
    public static List<String> dayString; 
    private View previousView; 

    public Main3Activity(Context c, GregorianCalendar monthCalendar) { 
     Main3Activity.dayString = new ArrayList<String>(); 
     Locale.setDefault(Locale.US); 
     month = monthCalendar; 
     selectedDate = (GregorianCalendar) monthCalendar.clone(); 
     mContext = c; 
     month.set(GregorianCalendar.DAY_OF_MONTH, 1); 
     this.items = new ArrayList<String>(); 
     df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
     curentDateString = df.format(selectedDate.getTime()); 
     refreshDays(); 
    } 

    public void setItems(ArrayList<String> items) { 
     for (int i = 0; i != items.size(); i++) { 
      if (items.get(i).length() == 1) { 
       items.set(i, "0" + items.get(i)); 
      } 
     } 
     this.items = items; 
    } 

    public int getCount() { 
     return dayString.size(); 
    } 

    public Object getItem(int position) { 
     return dayString.get(position); 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new view for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     TextView dayView; 
     if (convertView == null) { // if it's not recycled, initialize some 
      // attributes 
      LayoutInflater vi = (LayoutInflater) mContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.activity_main2, null); 

     } 
     dayView = (TextView) v.findViewById(R.id.date); 
     // separates daystring into parts. 
     String[] separatedTime = dayString.get(position).split("-"); 
     // taking last part of date. ie; 2 from 2012-12-02 
     String gridvalue = separatedTime[2].replaceFirst("^0*", ""); 
     // checking whether the day is in current month or not. 
     if ((Integer.parseInt(gridvalue) > 1) && (position < firstDay)) { 
      // setting offdays to white color. 
      dayView.setTextColor(Color.WHITE); 
      dayView.setClickable(false); 
      dayView.setFocusable(false); 
     } else if ((Integer.parseInt(gridvalue) < 7) && (position > 28)) { 
      dayView.setTextColor(Color.WHITE); 
      dayView.setClickable(false); 
      dayView.setFocusable(false); 
     } else { 
      // setting curent month's days in blue color. 
      dayView.setTextColor(Color.BLUE); 
     } 

     if (dayString.get(position).equals(curentDateString)) { 
      setSelected(v); 
      previousView = v; 
     } else { 
      v.setBackgroundResource(R.drawable.list_item_background); 
     } 
     dayView.setText(gridvalue); 

     // create date string for comparison 
     String date = dayString.get(position); 

     if (date.length() == 1) { 
      date = "0" + date; 
     } 
     String monthStr = "" + (month.get(GregorianCalendar.MONTH) + 1); 
     if (monthStr.length() == 1) { 
      monthStr = "0" + monthStr; 
     } 

     // show icon if date is not empty and it exists in the items array 
     ImageView iw = (ImageView) v.findViewById(R.id.date_icon); 
     if (date.length() > 0 && items != null && items.contains(date)) { 
      iw.setVisibility(View.VISIBLE); 
     } else { 
      iw.setVisibility(View.INVISIBLE); 
     } 
     return v; 
    } 

    public View setSelected(View view) { 
     if (previousView != null) { 
      previousView.setBackgroundResource(R.drawable.list_item_background); 
     } 
     previousView = view; 
     view.setBackgroundResource(R.drawable.calendar_cel_selectl); 
     return view; 
    } 

    public void refreshDays() { 
     // clear items 
     items.clear(); 
     dayString.clear(); 
     Locale.setDefault(Locale.US); 
     pmonth = (GregorianCalendar) month.clone(); 
     // month start day. ie; sun, mon, etc 
     firstDay = month.get(GregorianCalendar.DAY_OF_WEEK); 
     // finding number of weeks in current month. 
     maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH); 
     // allocating maximum row number for the gridview. 
     mnthlength = maxWeeknumber * 7; 
     maxP = getMaxP(); // previous month maximum day 31,30.... 
     calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ... 
     /** 
     * Calendar instance for getting a complete gridview including the three 
     * month's (previous,current,next) dates. 
     */ 
     pmonthmaxset = (GregorianCalendar) pmonth.clone(); 
     /** 
     * setting the start date as previous month's required date. 
     */ 
     pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1); 

     /** 
     * filling calendar gridview. 
     */ 
     for (int n = 0; n < mnthlength; n++) { 

      itemvalue = df.format(pmonthmaxset.getTime()); 
      pmonthmaxset.add(GregorianCalendar.DATE, 1); 
      dayString.add(itemvalue); 

     } 
    } 

    private int getMaxP() { 
     int maxP; 
     if (month.get(GregorianCalendar.MONTH) == month 
       .getActualMinimum(GregorianCalendar.MONTH)) { 
      pmonth.set((month.get(GregorianCalendar.YEAR) - 1), 
        month.getActualMaximum(GregorianCalendar.MONTH), 1); 
     } else { 
      pmonth.set(GregorianCalendar.MONTH, 
        month.get(GregorianCalendar.MONTH) - 1); 
     } 
     maxP = pmonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); 

     return maxP; 
    } 

} 

ответ

0

Вы должны принять столбец

CalendarContract.Events.DURATION.

Дата будет в формате RFC2445.

Или

(DTEND - DTSTART) = продолжительность в Millis.

Также вы можете использовать эту часть кода для преобразования формата RFC2445 в миллисекунду от off documentation.

Time time = new Time(); 
String date = "20081013T160000Z"; 
time.parse(date); 
long millis = time.normalize(false); 
Смежные вопросы