Kalender

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tom299, 12.04.2012.

  1. Tom299, 12.04.2012 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Hallo,

    soweit ich gelesen habe gibts bei Android erst ab 4.03 einen "Standard-Kalender" zum anprogrammieren? Ich stehe aber vor dem Problem, daß ich unsere 1. Programmversion auf 2.3.3 ausliefern muss und eine Kalender-Integration brauch (einfache Termine anlegen und anzeigen).

    Hat jemand Erfahrung mit Kalender-Apps anderer Hersteller und kann mir was empfehlen? Muß auch nicht kostenlos sein, aber brauchbar.

    Ein Bonus wäre, wenn es die Möglichkeit gäbe, vom Kalender-Event in meine App zu springen. Aber das ist vermutlich nicht machbar, wenn man den Kalender nicht selbst entwickelt hat ...


    Gruß,
    Tom
     
  2. DieGoldeneMitte, 12.04.2012 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Android Kalender lesen geht ja noch, aber Android-Kalender beschreiben ist die Hölle! Man muss wissen, dass es keinen Passiven Kalender in dem Sinne gibt, sondern dass die Daten von einem Servicemanager verwaltet werden. Der schreibt seine Daten zwar in sqlite Tabellen, aber das ist alles ziemlich undokumentiert (und je nach Hersteller wohl auch unterscheidlich - siehe unten)

    Zum Anlegen konnte man aber zumindest (iirc) schon immer per Intent in Kalenderapps springen.

    Ich bin seinerzeit kläglich gescheitert, eine Eingabeapp zu entwickeln. Ich konnte zwar Einträge auf dem Androiden schreiben, aber auf einem Samsung Gerät wurden die Termine nicht gegen den Googlekalender gesynct, auf einem Nexus One klappte es.
    Ich weiß bis heute nicht, wieso :cursing:
     
    Zuletzt bearbeitet: 12.04.2012
  3. Tom299, 12.04.2012 #3
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ich hatte folgendes Beispiel probiert -> Working with the Android Calendar - Developer.com

    Code:
    				String[] projection = new String[] { "_id", "name" };
    				Uri calendars = Uri.parse("content://calendar/calendars");
    				Cursor managedCursor = managedQuery(calendars, projection, null, null, null);
    				Cursor managedCursorActive = managedQuery(calendars, projection,"selected=1", null, null);
    				if (managedCursor != null && managedCursor.moveToFirst()) {
    					 String calName; 
    					 String calId; 
    					 int nameColumn = managedCursor.getColumnIndex("name"); 
    					 int idColumn = managedCursor.getColumnIndex("_id");
    					 do {
    					    calName = managedCursor.getString(nameColumn);
    					    calId = managedCursor.getString(idColumn);
    					    System.out.println("calName: " + calName);
    					    System.out.println("calID: " + calId);
    					 }
    					 while (managedCursor.moveToNext());
    				}
    				
    				String sID = null;
    				if (managedCursorActive != null && managedCursorActive.moveToFirst()) {
    					 String calName; 
    					 String calId; 
    					 int nameColumn = managedCursor.getColumnIndex("name"); 
    					 int idColumn = managedCursor.getColumnIndex("_id");
    					 do {
    					    calName = managedCursor.getString(nameColumn);
    					    calId = managedCursor.getString(idColumn);
    					    System.out.println("calName: " + calName);
    					    System.out.println("calID: " + calId);					    
    					 } 
    					 while (managedCursor.moveToNext());
    					 sID = calId;
    				}
    
    Beide Cursor sind immer NULL, egal ob mit Samsung Galaxy S2, Galaxy Note oder meinem HTC Sensation.

    Das einzige, was funktionieren würde, wäre:
    Code:
    					Calendar calStart = Calendar.getInstance();
    					calStart.set(Calendar.HOUR_OF_DAY, 14);
    					calStart.set(Calendar.MINUTE, 0);
    					calStart.set(Calendar.SECOND, 0);
    					calStart.set(Calendar.MILLISECOND, 0);					
    					Calendar calEnd = Calendar.getInstance();
    					calEnd.set(Calendar.HOUR_OF_DAY, 15);
    					calEnd.set(Calendar.MINUTE, 0);
    					calEnd.set(Calendar.SECOND, 0);
    					calEnd.set(Calendar.MILLISECOND, 0);					       
    					Intent intent = new Intent(Intent.ACTION_EDIT);
    					intent.setType("vnd.android.cursor.item/event");
    					intent.putExtra("beginTime", calStart.getTimeInMillis());
    					intent.putExtra("endTime", calEnd.getTimeInMillis());
    					intent.putExtra("title", "Titel");
    					intent.putExtra("description", "Beschreibung");
    					intent.putExtra("eventLocation", "Location");					
    					startActivity(intent);
    
    Allerdings bringt mir das nichts, da man dann jeden Termin von Hand bestätigen / speichern müßte, es soll aber automatisch passieren.

    Also gehts wirklich nur ab 4.03?
     
  4. DieGoldeneMitte, 12.04.2012 #4
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Tom299 bedankt sich.
  5. Tom299, 12.04.2012 #5
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Danke für den Tip mit der geänderten URI, damit klappts :thumbsup:
     
  6. Tom299, 13.04.2012 #6
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ist es möglich, beim Kalender den Intent abzufangen, wenn ein Termin zur Detailansicht geöffnet werden soll und anstatt im Kalender dann in meiner APP angezeigt / verarbeitet wird?

    Wenn ich den Kalender öffne und z.B. den ersten Termin anklicke, dann seh ich folgendes im LogCat -> Starting: Intent { act=android.intent.action.VIEW dat=content://com.android.calendar/events/1 cmp=com.android.calendar/.EventInfoActivity (has extras) } from pid 31111

    Jetzt hab ich mal in meiner App eine Activity angelegt:
    Code:
    public class CalendarActivity extends Activity {
    
    	public final static String INTENT_CALENDAR_ACTIVITY = "android.intent.action.VIEW";
    	
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		
    		TextView tvCalendar = new TextView(this);
    		tvCalendar.setText("Test 1234");
    		setContentView(tvCalendar);
    	}
    
    }
    
    und im Manifest folgendes hinzugefügt:
    Code:
            <activity android:name=".activity.CalendarActivity"
                      android:label="@string/app_name"
                      android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:path="content://com.android.calendar/events"/>
                </intent-filter>
            </activity>
    
    Ich hatte es zuerst mal ohne -> <data android: path="content://com.android.calendar/events"/> versucht, aber das macht scheinbar keinen Unterschied. Leider passiert nichts, wenn ich den Termin im Kalender anklicke, man kommt direkt in die Detailansicht des Kalenders ...

    Ist es überhaupt möglich, an das Intent so ranzukommen oder bin ich da auf dem Holzweg? :rolleyes2:


    Gruß,
    Tom
     

Diese Seite empfehlen