1

私はこれについて何週間も苦労してきたので、ここで誰かが私に明確にしてくれることを願っています.

私が取り組んでいるプロジェクト(ICS以前)には、会社のサーバーにログオンし、将来の仕事のスケジュールを取得し、これを電話の別のカレンダーに保存することが含まれています。このカレンダーは、すべての主要なカレンダー アプリ (ジョルテ、ビジネス カレンダー、スムース カレンダー++) で表示できる必要があります。スケジュールを解析して電話の SQLite データベースに保存しました。しかし、私の苦労は、そこから別のローカル カレンダーを作成し、そこにすべてのイベントを保存することです。これにはアカウントを作成する必要があると思いました(電話で他のアカウントを台無しにしないためです。それはコードでうまく機能しました:

AccountManager man = (AccountManager) getSystemService(ACCOUNT_SERVICE);
Account acc = new Account("myCalendar", "com.lumabyte.mycalendar");

しかし、そのアカウントでカレンダーを作成するのは非常に簡単だと思いました:

ContentValues calendar = new ContentValues();
calendar.put("_sync_account", "myCalendar"); // My account
calendar.put("_sync_account_type","com.lumabyte.mycalendar"); 
calendar.put("name", "myCalendar");
calendar.put("displayName", "myCalendar");
calendar.put("hidden",0);
calendar.put("color",0xFF008080);
calendar.put("access_level", 700);
calendar.put("sync_events", 1);
calendar.put("timezone", "Europe/Paris");
calendar.put("ownerAccount", sync_account);
Uri calendarUri = Uri.parse(getCalendarUriBase() + "calendars");
this.getContentResolver().insert(calendarUri, calendar);

関数 getCalendarUriBase():

private String getCalendarUriBase() {

    String calendarUriBase = null;
    Uri calendars = Uri.parse("content://calendar/calendars");
    Cursor managedCursor = null;
    try {
        managedCursor = this.managedQuery(calendars, null, null, null, null);
    } catch (Exception e) {
        // eat
    }

    if (managedCursor != null) {
        calendarUriBase = "content://calendar/";
    } else {
        calendars = Uri.parse("content://com.android.calendar/calendars");
        try {
            managedCursor = this.managedQuery(calendars, null, null, null, null);
        } catch (Exception e) {
            // eat
        }

        if (managedCursor != null) {
            calendarUriBase = "content://com.android.calendar/";
        }

    }

    managedCursor.close();

    return calendarUriBase;
}

マニフェストには次が含まれます。

  <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
  <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
  <uses-permission android:name="android.permission.MAMAGE_ACCOUNTS"/>
  <uses-permission android:name="android.permission.GET_ACCOUNTS" />    
  <uses-permission android:name="android.permission.READ_CALENDAR">
  <uses-permission android:name="android.permission.WRITE_CALENDAR">    

私のauthenticator.xmlは次のようなものです:

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"  
    android:accountType="com.lumabyte.mycalendar"
    android:icon="@drawable/icon"
    android:smallIcon="@drawable/icon"
    android:label="@string/authenticator_label"
/>

エラー メッセージは表示されませんが、アカウントのみが作成され、カレンダーは作成されません。コードに小さなエラーがありますか、それとも概念全体を誤解していますか? 私は、ICS より前に API がなく、リスクが伴うことを知っています。しかし、とにかくそれを行う必要があります。できるだけ多くの電話で安定していることが望ましいです。どんな助けや例も大歓迎です。

ICS がそのためのパブリック API を持っていることを理解しているので、後で ICS と連携します。

r

4

3 に答える 3

2

hiii rudder............. 多くの研究開発の後、次のコードを使用して 2.3.6 にカレンダーを追加しました........

ContentValues calendar=new ContentValues();
Uri calendarUri =Uri.parse(getBaseCalUri() + "/calendars");

calendar.put("_sync_account", "Test1");
calendar.put("_sync_account_type", "LOCAL");

    calendar.put("name", "CalenTest");
    calendar.put("displayName", "calDispName");
    calendar.put("color", 0xFF008080);
    calendar.put("access_level", 700);
    calendar.put("ownerAccount", true);
    calendar.put("sync_events", 1);

    calendarUri = calendarUri.buildUpon()
        .appendQueryParameter("_sync_account", "Test1")
        .appendQueryParameter("_sync_account_type", "LOCAL")  
        .build();
    Uri result = getContentResolver().insert(calendarUri, calendar);

そして私の getBaseCalUri() は

private Uri getBaseCalUri(){
        Class<?> calendarProviderClass;
        Field uriField;
        Uri calendarUri=null;
        try {
            calendarProviderClass = Class.forName("android.provider.Calendar");
            uriField = calendarProviderClass.getField("CONTENT_URI");
            calendarUri = (Uri) uriField.get(null);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return calendarUri;
    }

これを試して....

于 2012-11-08T07:13:59.893 に答える
0

calendar.db /data/data/com.android.providers.calendar/databases/calendar.db にレコードを追加するだけです。sqlite3 calendar.db "insert into Calendars (_id,name,displayName,access_level) values (0,') Local','MyCal',700)"

于 2013-03-24T05:03:26.817 に答える
-2

これは私が試した良い方法です。お役に立てば幸いです。

/** * カレンダー イベントを追加します。*/

private void addCalendarEvent(){
                    Context context = getContext();
                    Intent intent = new Intent(Intent.ACTION_EDIT);
            intent.setType("vnd.android.cursor.item/event");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("beginTime", stTime);
            intent.putExtra("allDay", true);
            intent.putExtra("description", description);
            intent.putExtra("eventLocation", place);
            intent.putExtra("rrule", "FREQ=YEARLY");
            intent.putExtra("endTime", enTime);
            intent.putExtra("title", category);
                    context.startActivity(intent);
}
于 2012-11-07T10:11:14.430 に答える