需求:在默认的日历中预置一条不可删除的活动,并且设定其中的默认参数。
平台:80N
tools:NavicatPremium、adb
解决方案:通过添加数据库的方式将活动预置到Calendar的数据库中
1.使用adb命令导出默认Calendar的默认数据库
2.使用Navicat Premium查看默认数据库并导出main表
注:一条活动是有多个数据库语句插入到不同表实现的
先导出默认main表,然后在手机中添加预置的活动,再同样的方式导出main表,与原来的表进行对比,这样的话可以获取所有的插 入语句
3.在CalendarDatabaseHelper.java
修改路径:packages/providers/CalendarProvider/src/com/android/providers/calendar/CalendarDatabaseHelper.java
导包:
// add 20180113 Calendar Event
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
// end
添加方法:readRaw(int index)
// add 20180113 Calendar Event
public String readRaw(int index){
try {
//获取文件中的内容
InputStream inputStream=mContext.getResources().openRawResource(index);
//将文件中的字节转换为字符
InputStreamReader isReader=new InputStreamReader(inputStream,"UTF-8");
//使用bufferReader去读取字符
BufferedReader reader=new BufferedReader(isReader);
String out="";
try {
while((out=reader.readLine())!=null){
Log.d("lds","======="+out);
return out;
}
} catch (IOException e) {
e.printStackTrace();
return "";
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "";
}
return "";
}
//end
插入数据库:
在onCreate方法中进行插入数据库操作:
public void onCreate(SQLiteDatabase db) {
bootstrapDB(db);
// add liudongsheng 20180113 Calendar Event
db.execSQL(readRaw(R.raw.sql0));
db.execSQL(readRaw(R.raw.sql1));
db.execSQL(readRaw(R.raw.sql2));
db.execSQL(readRaw(R.raw.sql3));
// end
}
在onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法中也进行数据库插入操作
// add 20180113 Calendar Event
db.execSQL(readRaw(R.raw.sql0));
db.execSQL(readRaw(R.raw.sql1));
db.execSQL(readRaw(R.raw.sql2));
db.execSQL(readRaw(R.raw.sql3));
// end
long endWhen = System.nanoTime();
Log.d(TAG, "Calendar upgrade took " + ((endWhen - startWhen) / 1000000) + "ms");
由于数据语句过长为了方便放到资源文件中,然后用readRaw方法读取资源文件:
资源文件路径:packages/providers/CalendarProvider/res/raw/
改文件下的数据库语句是通过Navicat Premium工具获取的
如果是调试版本进行push测试该方法修改是否有效需要修改该文件中的版本,要不可能会无效
// Bump this to the next hundred at each major release.
static final int DATABASE_VERSION = 606;
该需求添加的活动需要插入四个数据库
资源文件路径:packages/providers/CalendarProvider/res/raw/
预置为不可删除:
路径:vendor/mediatek/proprietary/packages/apps/Calendar/src/com/android/calendar/EventInfoFragment.java
final int itemId = item.getItemId();
+ Log.d("log_calendar","mEventId = " + mEventId);//打印出预置的那条活动的ID
if (itemId == android.R.id.home) {
Utils.returnToCalendarHome(mContext);
mActivity.finish();
@@ -1968,10 +1969,16 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange
MenuItem edit = mMenu.findItem(R.id.info_action_edit);
MenuItem changeColor = mMenu.findItem(R.id.info_action_change_color);
if (delete != null) {
+ if(mEventId == 8){
+ mCanModifyCalendar=false;//根据ID隐藏掉删除选项
+ }
delete.setVisible(mCanModifyCalendar);
delete.setEnabled(mCanModifyCalendar);
}
if (edit != null) {
+ if(mEventId == 8){
+ mCanModifyEvent=false;//根据ID隐藏掉删除选项
+ }
edit.setVisible(mCanModifyEvent);
edit.setEnabled(mCanModifyEvent);
}