2012-09-17 18 views
10

के साथ नया सिंक किया गया कैलेंडर बनाएं, मैं कुछ खातों से प्राप्त होने वाली घटनाओं को भरने के लिए अपने खाते पर एक कैलेंडर बनाने की कोशिश कर रहा हूं। मैंने कुछ नया एंड्रॉइड 4.0 कैलेंडर उदाहरण खोजा और पाया है जिसे मैंने प्राप्त करने के लिए संशोधित किया है। समस्या यह है कि कैलेंडर बनाया गया है, घटनाओं से भरा है लेकिन Google कैलेंडर के साथ समन्वयित नहीं है, इसलिए अगली सिंक में इसे मिटा दिया गया है।एंड्रॉइड एपीआई

public static Uri createEventWithName(Context ctx, long id, String name, String data) { 
     long startMillis = 0; 
     long endMillis = 0;  
     int id2=(int)id; 
     String[] divisi = data.split("/"); 
     Calendar beginTime = Calendar.getInstance(); 
     beginTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1])); 
     startMillis = beginTime.getTimeInMillis(); 
     Calendar endTime = Calendar.getInstance(); 
     endTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1])); 
     endMillis = endTime.getTimeInMillis(); 


     ContentValues cv = new ContentValues(); 
     cv.put(Events.TITLE, name); 
     cv.put(Events.DTSTART, startMillis); 
     cv.put(Events.DTEND, endMillis); 
     cv.put(Events.CALENDAR_ID, id2); 
     Log.d("aggiungo a calendario",Integer.toString(id2)); 
     cv.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().toString()); 
     //cv.put(Events.RRULE, "FREQ=DAILY;INTERVAL=2"); 

     Uri newEvent = ctx.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, cv); 
     return newEvent; 
} 
:

public static Uri createCalendarWithName(Context ctx, String name,String accountName) { 

      Uri target = Uri.parse(CalendarContract.Calendars.CONTENT_URI.toString()); 
      target = target.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") 
      .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName) 
      .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google").build(); 

      ContentValues values = new ContentValues(); 
      values.put(Calendars.ACCOUNT_NAME, accountName); 
      values.put(Calendars.ACCOUNT_TYPE, "com.google"); 
      values.put(Calendars.NAME, name); 
      values.put(Calendars.CALENDAR_DISPLAY_NAME, name); 
      values.put(Calendars.CALENDAR_COLOR, 0x00FF00); 
      values.put(Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_ROOT); 
      values.put(Calendars.OWNER_ACCOUNT, accountName); 
      values.put(Calendars.VISIBLE, 1); 
      values.put(Calendars.SYNC_EVENTS, 1); 
      values.put(Calendars.CALENDAR_TIME_ZONE, "Europe/Rome"); 
      values.put(Calendars.CAN_PARTIALLY_UPDATE, 1); 
      values.put(Calendars.CAL_SYNC1, "https://www.google.com/calendar/feeds/" + accountName + "/private/full"); 
      values.put(Calendars.CAL_SYNC2, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName); 
      values.put(Calendars.CAL_SYNC3, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName); 
      values.put(Calendars.CAL_SYNC4, 1); 
      values.put(Calendars.CAL_SYNC5, 0); 
      values.put(Calendars.CAL_SYNC8, System.currentTimeMillis()); 

      Uri newCalendar = ctx.getContentResolver().insert(target, values); 

      return newCalendar; 
    } 

और है कि एक सहभागिता के बिना नई घटना बनाने:

इस नए कैलेंडर जोड़ने अगर alreay नहीं भी मौजूद हैं के लिए एक है: funcion मैं का उपयोग इन कर रहे हैं

मैं एंड्रॉइड प्रोग्रामिंग में इतना अनुभवी नहीं हूं इसलिए मुझे लगता है कि यह एक बेवकूफ सवाल है =) मैंने उस खाते को पढ़ लिया है नाम और खाता प्रकार वही होना चाहिए जो एंड्रॉइड डिवाइस पर संग्रहीत है, अन्यथा ईवेंट रद्द कर दिया गया है। मुझे एंड्रॉइड एपीआई से खाता नाम मिलता है और मुझे लगता है कि वे सही हैं। खाता प्रकार अन्य के लिए काम करता प्रतीत होता है ....

मेरी मदद करने वाले किसी के लिए धन्यवाद!

+0

कोई बेवकूफ सवाल नीचे के रूप में है, केवल लोगों को आप अभी तक उत्तर नहीं पता के लिए :) – Codeman

उत्तर

1
CalendarContract.Calendars के लिए जावाडोक के अनुसार

:

"कैलेंडर मुख्य रूप से एक सिंक अनुकूलक द्वारा प्रबंधित किया जा करने के लिए और नए कैलेंडर डालने एक सिंक एडाप्टर के रूप में किया जाना चाहिए डिजाइन किए हैं।"

यदि आप एक सिंक एडाप्टर नहीं हैं (यदि आप केवल एक मनमानी ऐप हैं, तो आप एक सिंक एडाप्टर नहीं हैं), जो यह समझा सकता है कि आपका नया कैलेंडर सिंक्रनाइज़ क्यों नहीं हो रहा है जैसा आप उम्मीद करेंगे।

2

अभी के लिए संभव नहीं है।

बहुत सारे गुगल होने के बाद मुझे जीमेल खाते में नया सिंक करने योग्य कैलेंडर बनाने का कोई तरीका नहीं मिला (खाता प्रकार "com.google")। मैंने इन परिदृश्यों को आजमाया है:
1. सिंक एडाप्टर के बिना और मुझे वही व्यवहार मिलता है - कैलेंडर जो मैंने हाल ही में जोड़े गए सभी कार्यक्रमों के साथ बाहरी Google कैलेंडर ऐप में दिखाई देता है लेकिन कुछ ही समय बाद (जैसे कुछ सेकंड के बाद) सभी ईवेंट और कैलेंडर गायब हो जाते हैं।
SyncAdapter और com.google प्रमाणक के साथ 2. - कैलेंडर बनाने के लिए संभव है, लेकिन नहीं Gmail में खाता

नोट आप नया खाता बना सकते हैं - मैं इस प्रक्रिया
SyncAdapter और com.example प्रमाणक के साथ 3. दौरान कोई त्रुटि मिलती है और उस खाते के लिए नया कैलेंडर बनाएं (सिंकएडाप्टर, परिदृश्य 3 का उपयोग करके) लेकिन यह जीमेल खाता नहीं है, इसलिए कैलेंडर जीमेल कैलेंडर के साथ सिंक करने योग्य नहीं है (उदाहरण के लिए यदि आप वेब ब्राउजर में जीमेल अकाउंट में लॉगिन करते हैं और उस कैलेंडर को खोलते हैं जिसे आपने अभी बनाया है नहीं दिखाएगा)।

2

http://developer.android.com/reference/android/provider/CalendarContract.html

सार्वजनिक स्थिर अंतिम स्ट्रिंग ACCOUNT_TYPE_LOCAL

जोड़ा गया एपीआई स्तर 14 किसी भी खाते से संबद्ध नहीं कैलेंडर के लिए एक विशेष खाता प्रकार में से। आम तौर पर कैलेंडर पर खाते से मेल नहीं खाते कैलेंडर हटा दिए जाएंगे। कैलेंडर पर account_type को सेट करने से इसे मिटा दिया जा सकता है अगर यह से किसी मौजूदा खाते से मेल नहीं खाता है।"स्थानीय"

2

एक ही मुद्दा मैं का सामना करना पड़ रहा था:

देखें इसके अलावा लगातार मूल्य ACCOUNT_TYPE। नीचे परिवर्तन करने के बाद अब मैं अपने कैलेंडर में स्थायी रूप से चिपकने वाली घटनाओं को देख रहा हूं।

addEvent विधि में नीचे पंक्ति जोड़ें

Uri uri = getContentResolver().insert(asSyncAdapter(Events.CONTENT_URI,"[email protected]","com.gmail"), cv); 

asSyncAdapter के लिए कोड

static Uri asSyncAdapter(Uri uri, String account, String accountType) { 
     return uri.buildUpon() 
      .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true") 
      .appendQueryParameter(Calendars.ACCOUNT_NAME, account) 
      .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build(); 
    } 
संबंधित मुद्दे