解决方案 »

  1.   

    在packages\providers\CalendarProvider\src\com\android\providers\calendar\CalendarDatabaseHelper.java增加updateOrInsert方法即可
     private void bootstrapDB(SQLiteDatabase db) {
            Log.i(TAG, "Bootstrapping database");        mSyncState.createDatabase(db);        createColorsTable(db);        createCalendarsTable(db);        //begin : added by xxx for calendar  demand
            updateOrInsert(db,"Calendars");
            //end : added by xxx for calendar  demand        createEventsTable(db);
            ......                     //begin : added by xxx for calendar  demand
        private void updateOrInsert(SQLiteDatabase db, String table){
            // check this value exsist or not.
            String account_name = "Phone";
            String account_type = "com.android.huawei.phone";
            String calendar_displayName = "Phone";
            Integer calendar_color = -12011288;
            Integer calendar_access_level = 700;
            Integer sync_events = 1;
            String calendar_timeZone = "Asia/shanghai";
            String ownerAccount = "Phone";
            String[] columns = new String[]{"account_name","account_type"," calendar_displayName"};
            String selection = " account_name=? and account_type=? and calendar_displayName=? ";
            String[] selectionArgs = new String[]{account_name,account_type,calendar_displayName};
            boolean alreadyExisted = false;//        Cursor cursor = db.query(table, columns, selection, selectionArgs, null, null, null);
            Cursor cursor = db.query(table, columns, selection, selectionArgs, null, null, null); 
            alreadyExisted = (null != cursor) && (cursor.getCount() > 0);        /*
             * an update statement like this:
             * UPDATE secure SET value='com.android.inputmethod.latin/.LatinIME' where name='default_input_method'
             * an insert statement like this:
             * INSERT INTO secure(name,value) values('default_input_method','com.android.inputmethod.latin/.LatinIME')
             */
            String stmt_update = "UPDATE "+table+" SET account_name='" + account_name + "'"+"calendar_displayName='"+ calendar_displayName +"'" + "where account_type='" + account_type + "'";
            String stmt_insert = "INSERT INTO "+table+"(account_name,account_type,calendar_displayName,calendar_color,calendar_access_level,sync_events,calendar_timeZone,ownerAccount) values('" + 
                account_name + "','" + account_type + "','"+calendar_displayName + "','" + calendar_color + "','" + calendar_access_level + "','" + sync_events + "','" + calendar_timeZone + "','" + ownerAccount+ "')";
            String stmt = alreadyExisted ? stmt_update : stmt_insert;
            db.execSQL(stmt);
        }
        //end : added by xxx for calendar  demand  
    修改完成后,重新编译生成CalendarProvider.apkadb push方式 替换android设备原有的CalendarProvider.apk【要实现确保没有CalendarProvider.odex,有的话   要删除】删除data/data/com.android.providers.calendar/databases/calendar.db恢复出厂设置
      

  2.   

    谢谢啊、但是我加了、也这么操作了、但是还是没有默认日历账户、代码是msm8625的、是不是在别的地方还要加什么呢、
      

  3.   

    搞定啦、
    我在CalendarProvider2.java里面的removeStaleAccounts(Account[] accounts){}方法的
     if (!validAccounts.contains(currAccount)) {
                                accountsToDelete.add(currAccount);
                            }
    这个地方改成了
     if (!validAccounts.contains(currAccount) 
                             && (!c.getString(1).equalsIgnoreCase("com.viroyal.android.account")/*added by viroyal-zhaoxiangbin*/)) {
                                accountsToDelete.add(currAccount);
                            }日历就不会被删除了、
    终于搞定了、谢谢你啊、华为的朋友、
      

  4.   

    那个日历源码从哪里下载。
    [email protected]发一份学习学习
      

  5.   

    在calendarProvider中添加了updateorInsert方法按步骤还是不行,主要是最后回复出厂老是司机,push进去provider的apk后也未见在databases文件夹下生成新的.db文件?请问是什么原因呢
      

  6.   

    在packages\providers\CalendarProvider\src\com\android\providers\calendar\CalendarDatabaseHelper.java增加updateOrInsert方法即可
     private void bootstrapDB(SQLiteDatabase db) {
            Log.i(TAG, "Bootstrapping database");        mSyncState.createDatabase(db);        createColorsTable(db);        createCalendarsTable(db);        //begin : added by xxx for calendar  demand
            updateOrInsert(db,"Calendars");
            //end : added by xxx for calendar  demand        createEventsTable(db);
            ......                     //begin : added by xxx for calendar  demand
        private void updateOrInsert(SQLiteDatabase db, String table){
            // check this value exsist or not.
            String account_name = "Phone";
            String account_type = "com.android.huawei.phone";
            String calendar_displayName = "Phone";
            Integer calendar_color = -12011288;
            Integer calendar_access_level = 700;
            Integer sync_events = 1;
            String calendar_timeZone = "Asia/shanghai";
            String ownerAccount = "Phone";
            String[] columns = new String[]{"account_name","account_type"," calendar_displayName"};
            String selection = " account_name=? and account_type=? and calendar_displayName=? ";
            String[] selectionArgs = new String[]{account_name,account_type,calendar_displayName};
            boolean alreadyExisted = false;//        Cursor cursor = db.query(table, columns, selection, selectionArgs, null, null, null);
            Cursor cursor = db.query(table, columns, selection, selectionArgs, null, null, null); 
            alreadyExisted = (null != cursor) && (cursor.getCount() > 0);        /*
             * an update statement like this:
             * UPDATE secure SET value='com.android.inputmethod.latin/.LatinIME' where name='default_input_method'
             * an insert statement like this:
             * INSERT INTO secure(name,value) values('default_input_method','com.android.inputmethod.latin/.LatinIME')
             */
            String stmt_update = "UPDATE "+table+" SET account_name='" + account_name + "'"+"calendar_displayName='"+ calendar_displayName +"'" + "where account_type='" + account_type + "'";
            String stmt_insert = "INSERT INTO "+table+"(account_name,account_type,calendar_displayName,calendar_color,calendar_access_level,sync_events,calendar_timeZone,ownerAccount) values('" + 
                account_name + "','" + account_type + "','"+calendar_displayName + "','" + calendar_color + "','" + calendar_access_level + "','" + sync_events + "','" + calendar_timeZone + "','" + ownerAccount+ "')";
            String stmt = alreadyExisted ? stmt_update : stmt_insert;
            db.execSQL(stmt);
        }
        //end : added by xxx for calendar  demand  
    修改完成后,重新编译生成CalendarProvider.apkadb push方式 替换android设备原有的CalendarProvider.apk【要实现确保没有CalendarProvider.odex,有的话   要删除】删除data/data/com.android.providers.calendar/databases/calendar.db恢复出厂设置
    在packages\providers\CalendarProvider\src\com\android\providers\calendar\CalendarDatabaseHelper.java增加updateOrInsert方法即可
     private void bootstrapDB(SQLiteDatabase db) {
            Log.i(TAG, "Bootstrapping database");        mSyncState.createDatabase(db);        createColorsTable(db);        createCalendarsTable(db);        //begin : added by xxx for calendar  demand
            updateOrInsert(db,"Calendars");
            //end : added by xxx for calendar  demand        createEventsTable(db);
            ......                     //begin : added by xxx for calendar  demand
        private void updateOrInsert(SQLiteDatabase db, String table){
            // check this value exsist or not.
            String account_name = "Phone";
            String account_type = "com.android.huawei.phone";
            String calendar_displayName = "Phone";
            Integer calendar_color = -12011288;
            Integer calendar_access_level = 700;
            Integer sync_events = 1;
            String calendar_timeZone = "Asia/shanghai";
            String ownerAccount = "Phone";
            String[] columns = new String[]{"account_name","account_type"," calendar_displayName"};
            String selection = " account_name=? and account_type=? and calendar_displayName=? ";
            String[] selectionArgs = new String[]{account_name,account_type,calendar_displayName};
            boolean alreadyExisted = false;//        Cursor cursor = db.query(table, columns, selection, selectionArgs, null, null, null);
            Cursor cursor = db.query(table, columns, selection, selectionArgs, null, null, null); 
            alreadyExisted = (null != cursor) && (cursor.getCount() > 0);        /*
             * an update statement like this:
             * UPDATE secure SET value='com.android.inputmethod.latin/.LatinIME' where name='default_input_method'
             * an insert statement like this:
             * INSERT INTO secure(name,value) values('default_input_method','com.android.inputmethod.latin/.LatinIME')
             */
            String stmt_update = "UPDATE "+table+" SET account_name='" + account_name + "'"+"calendar_displayName='"+ calendar_displayName +"'" + "where account_type='" + account_type + "'";
            String stmt_insert = "INSERT INTO "+table+"(account_name,account_type,calendar_displayName,calendar_color,calendar_access_level,sync_events,calendar_timeZone,ownerAccount) values('" + 
                account_name + "','" + account_type + "','"+calendar_displayName + "','" + calendar_color + "','" + calendar_access_level + "','" + sync_events + "','" + calendar_timeZone + "','" + ownerAccount+ "')";
            String stmt = alreadyExisted ? stmt_update : stmt_insert;
            db.execSQL(stmt);
        }
        //end : added by xxx for calendar  demand  
    修改完成后,重新编译生成CalendarProvider.apkadb push方式 替换android设备原有的CalendarProvider.apk【要实现确保没有CalendarProvider.odex,有的话   要删除】删除data/data/com.android.providers.calendar/databases/calendar.db恢复出厂设置

    在calendarProvider中添加了updateorInsert方法按步骤还是不行,主要是最后回复出厂老是司机,push进去provider的apk后也未见在databases文件夹下生成新的.db文件?请问是什么原因呢