私はAndroidアプリに取り組んでおり、ユーザー用に新しいカレンダーを作成する必要があります。Eclipse、Windows 7、およびAndroidICS4.0.3を搭載したArchosG9タブレットを使用しています。今のところAPI14をターゲットにしています。
私はJava、Android環境、およびStackオーバーフローの両方に不慣れです。お楽しみください。
私はContentResolverを使用していますが、LOCALアカウントタイプで作業する場合は正常に機能します(ただし、参加者オプションなしでイベントを取得するための適切なパラメーターを見つけることができないようです)。
タブレットに登録したGmailアカウントを使用して、「com.google」アカウントタイプに切り替えようとすると、例外がスローされることなく機能しますが、新しいカレンダーアプリとイベントがGoogleカレンダーに表示されませんでした。ネイティブアプリ(以前はローカルアカウントタイプで即座に表示されていました)。また、アプリの実行中に一覧表示することはできますが、再起動して一覧表示すると、表示されなくなります(以前はGoogleカレンダーに残っていたため、ローカルアカウントタイプで再起動すると一覧表示される可能性があります)。
これが私のコードです、コメントされているので、私はより明確になりますメインクラス:
package com.example.testnativecalendar;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.app.Activity;
import android.content.ContentResolver;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity
{
static private final String CALENDAR_NAME = "MyLocalTestCalendar";
static private final String CALENDAR_DISPLAY_NAME = "My local test calendar";
static private final String[] CALENDARS_PROJECTION = { CalendarContract.Calendars._ID,
CalendarContract.Calendars.ACCOUNT_NAME,
CalendarContract.Calendars.ACCOUNT_TYPE,
CalendarContract.Calendars.NAME,
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView( R.layout.activity_main );
ContentResolver contentResolver = getContentResolver();
// I first list to check what is there before I do anything.
// If I tried to add a local account, it is still here.
// If I tried a com.google account, it is not in the list anymore.
CalendarUtilities.listCalendars( contentResolver, CALENDARS_PROJECTION, " | " );
// I clean the old calendars I tried to insert, if they are here.
long[] calendarIDs = CalendarUtilities.getCalendarsIDs( contentResolver, CALENDAR_NAME );
if ( calendarIDs.length != 0 )
for ( long id : calendarIDs )
CalendarUtilities.removeCalendar( contentResolver, id );
// I had a calendar
calendarIDs = new long[] { CalendarUtilities.addCalendar( contentResolver, CALENDAR_NAME, CALENDAR_DISPLAY_NAME ) };
// When I list, I see it.
// If it is a local account, it is also in Google calendar native app whith the events if I add any.
// If it is my com.google acount, I see it listed here, but it is not on Google calendar native app.
CalendarUtilities.listCalendars( contentResolver, CALENDARS_PROJECTION, " | " );
}
@Override
public boolean onCreateOptionsMenu( Menu menu )
{
getMenuInflater().inflate( R.menu.activity_main, menu );
return true;
}
}
そしてユーティリティクラス:
package com.example.testnativecalendar;
import java.util.Calendar;
import java.util.TimeZone;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.provider.CalendarContract;
import android.util.Log;
public class CalendarUtilities
{
static public void listCalendars( ContentResolver contentResolver, String[] projection, String separator )
{
Cursor cursor = contentResolver.query( CalendarContract.Calendars.CONTENT_URI, projection, null, null, null );
try
{
while ( cursor.moveToNext( ) )
{
String[] datas = new String[ cursor.getColumnCount() ];
for ( int i = 0; i < cursor.getColumnCount(); i++ )
datas[i] = cursor.getColumnName( i ) + ": " + cursor.getString( i );
Log.d( "trace", StringUtilities.join( datas, separator ) );
}
}
catch (Exception exception)
{
Log.e( "trace", exception.toString() );
}
cursor.close();
}
static public long addCalendar( ContentResolver contentResolver, String name, String displayName )
{
TimeZone timeZone = TimeZone.getDefault();
ContentValues contentValues = new ContentValues();
//So here when I use CalendarContract.ACCOUNT_TYPE_LOCAL, no problem, but local isn't what I whant.
//When I use my gmail address, it doesn't throw anything, but it doesn't leave
contentValues.put( CalendarContract.Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com" );
contentValues.put( CalendarContract.Calendars.ACCOUNT_TYPE, "com.google" ); //CalendarContract.ACCOUNT_TYPE_LOCAL );
contentValues.put( CalendarContract.Calendars.OWNER_ACCOUNT, "mygmailaddress@gmail.com" );
contentValues.put( CalendarContract.Calendars.NAME, name );
contentValues.put( CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, displayName );
contentValues.put( CalendarContract.Calendars.CALENDAR_COLOR, 0xFF000000 + Math.floor( Math.random() * 0xFF0000 ) );
contentValues.put( CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER );
contentValues.put( CalendarContract.Calendars.VISIBLE, 1);
contentValues.put( CalendarContract.Calendars.SYNC_EVENTS, 1);
contentValues.put( CalendarContract.Calendars.CALENDAR_TIME_ZONE, timeZone.getID() );
Uri calendarUri = CalendarContract.Calendars.CONTENT_URI;
calendarUri = calendarUri.buildUpon()
.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true" )
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com" )
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google" ) //CalendarContract.ACCOUNT_TYPE_LOCAL )
.build();
try
{
Uri result = contentResolver.insert(calendarUri, contentValues);
return Long.parseLong( result.getLastPathSegment() );
}
catch( Exception exception )
{
Log.e( "trace", exception.toString() );
}
return -1;
}
static public int removeLocalCalendar( ContentResolver contentResolver, long id )
{
int result = contentResolver.delete( CalendarContract.Calendars.CONTENT_URI, BaseColumns._ID + "=?", new String[] { Long.toString( id ) } );
Log.d( "trace", "Calendar deleted: " + result );
return result;
}
}
問題は、どういうわけかそれらのデータをサーバーに同期する必要があることだと思います。イベントを追加する方法やカレンダーを一覧表示する方法については、オンラインでいくつかのチュートリアルがありますが、カレンダーを挿入する方法についてはほとんどありません...
だから誰かがこれを手伝ってくれたら嬉しいです。ありがとう。よろしく。ホーストパス。