初接触Android,小白一个,记录一下生活学习的 点滴,理解和分析不到位请见谅。
刚接触安卓,书也没翻几页,见地实在浅薄
首先是从问题出手。客户丢来的问题:
1.日历调用提醒成功后,到时间没有提醒。(也就是闹钟没有响)
网上可以搜到相关的demo
这里我贴一个链接,我就不手敲代码了
http://blog.csdn.net/zhaoshuyu111/article/details/53195142?ref=myread
以上是Android向日历添加日程的demo。
然后我们写的api接口函数
public static void addCalendarEventRemind(Context context, @NonNull String title, String description, long begintime, long endtime, int remind_minutes, onCalendarRemindListener callback) {
long calendar_id = checkAndAddCalendarAccounts(context);
if (calendar_id < 0) {
// 获取日历失败直接返回
if (null != callback) {
callback.onFailed(onCalendarRemindListener.Status.CALENDAR_ERROR);
}
return;
}
//根据标题、描述、开始时间查看提醒事件是否已经存在
String event_id = queryCalendarEvent(context, calendar_id, title, description, begintime, endtime);
//如果提醒事件不存在,则新建事件
if (TextUtils.isEmpty(event_id)) {
Uri newEvent = insertCalendarEvent(context, calendar_id, title, description, begintime, endtime);
if (newEvent == null) {
// 添加日历事件失败直接返回
if (null != callback) {
callback.onFailed(onCalendarRemindListener.Status.EVENT_ERROR);
}
return;
}
event_id = ContentUris.parseId(newEvent) + "";
}
//为事件设定提醒
ContentValues values = new ContentValues();
values.put(CalendarContract.Reminders.EVENT_ID, event_id);
// 提前remind_minutes分钟有提醒
values.put(CalendarContract.Reminders.MINUTES, remind_minutes);
values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALARM);
Uri uri = context.getContentResolver().insert(Uri.parse(calanderRemiderURL), values);
if (uri == null) {
// 添加提醒失败直接返回
if (null != callback) {
callback.onFailed(onCalendarRemindListener.Status.REMIND_ERROR);
}
return;
}
//添加提醒成功
if (null != callback) {
callback.onSuccess();
}
}
因为只是丢给我个接口,所以我用android studio创建了一个activity来调用该接口。
我在这里顺路说一个我遇到的 另外一个问题(对初学者可能会有帮助):
如果有人遇到了在AndroidManifast.xml中添加了permission权限不生效的问题。
其实就是新版本的SDK对权限进行了大改,很多别的帖子 都讲过了
有人说sdk23降到22就行,但是我的sdk版本已经29了,贸然改build.gradle会导致编译的时候找不到依赖
所以遇到像添加读写权限的时候 ,用下文的requestPermission就行了
动态请求权限。(这里也就是进入app后,会询问一次是否打开权限,我在疯狂系列和第一行系列,都看到类似的说法就是:早期的安卓版本不需要动态申请权限,之后更新是因为,不动态申请就会有app作者滥用和窃取用户信息),所以现在你自己亲自授权后就是签字画押后的卖身了,境界上了一层。
这里是Activiy主函数:
public class MainActivity extends 的 AppCompatActivity {
private TextView textview;
private Button button;
private Context mcontext;
final int MY_PERMISSIONS_REQUEST_CALENDAR = 0;
private static String[] PERMISSSION_CALENDAR ={
Manifest.permission.READ_CALENDAR,
Manifest.permission.WRITE_CALENDAR
};
public MainActivity (){
mcontext= MainActivity.this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
button = (Button) findViewById(R.id.Button);
Buttonlistener buttonlistener = new Buttonlistener();
button.setOnClickListener(buttonlistener);
requestPermission();
calendarEntry();
}
private void requestPermission() {
int permission = ActivityCompat.checkSelfPermission(this,"android.permission.READ_CALENDAR");
int permissionl = ActivityCompat.checkSelfPermission(this,"android.permission.WRITE_CALENDAR");
if((permission!= PackageManager.PERMISSION_GRANTED)||(permissionl!=PackageManager.PERMISSION_GRANTED)){
ActivityCompat.requestPermissions(this,PERMISSSION_CALENDAR, MY_PERMISSIONS_REQUEST_CALENDAR);
}
}
class listenerCallback implements CalendarUtils.onCalendarRemindListener{
public void onFailed(Status error_code) {
}
public void onSuccess() {
}
}
public void calendarEntry(){
String Ctitle = "clork1";
String Cdescrption = "recieve clork1";
Long tslong=System.currentTimeMillis();
listenerCallback callback=new listenerCallback();
Calendar calendar = Calendar.getInstance();
Long time=calendar.getTimeInMillis();
CalendarUtils.addCalendarEventRemind(mcontext,Ctitle,Cdescrption,tslong+2*60*1000,tslong+7*60*1000,1,callback);
}
言归正传。我也不讲太多东西了。我直接说改那里,可以让闹钟(警报)定时响起:
上面第一段代码 addCalendarEventRemind 函数中
values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALARM)
这里METHOD_ALERM改为METHOD_ALERT即可
客户说小米手机可以用ALARM,然后我用vivo和华为都不行,我手上的样机也不行。
我看了下代码,应该是改了实现方式,MIUI控制闹钟提示不是用传统的EVENT表中的HAS_ALARM字段,而是ExtendPorperties中的values字段,我看不到小米的Calendar源码,我推测小米用的提醒是Alarm,而其他平台用的是Alert。
如下我再贴一段JAVA 公用SDK中CalendarContract类中的成员
` protected static interface RemindersColumns {
java.lang.String EVENT_ID = "event_id";
java.lang.String METHOD = "method";
int METHOD_ALARM = 4;
int METHOD_ALERT = 1;
int METHOD_DEFAULT = 0;
int METHOD_EMAIL = 2;
int METHOD_SMS = 3;
java.lang.String MINUTES = "minutes";
int MINUTES_DEFAULT = -1;
}`
这里就是reminder的接口成员了。
METHOD有闹钟,警报,默认,邮件和短信
你如果设置了某一项,提前时间没有生效,那么可能就是你的app里没有对应成员或功能,最简单的验证方法,就是打开你的日历,自己亲自设置一下你想要的功能看它能否实现。如果你自己在app能都实现不了,那么你用api在你的activity里是死活也无法实现的
还有就是你要确保自己的机器里有calendar APP ,我这的设备把不用的app都给删除了