系統(tǒng)鬧鐘包名:com.android.deskclock
調(diào)用系統(tǒng)鬧鐘,首先在清單文件AndroidManifest.xml中添加權限:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
設置系統(tǒng)鬧鐘:
public static void setAlarm(Context context, String title, Date date) {
Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM);
intent.putExtra(AlarmClock.EXTRA_HOUR, date.getHours());
intent.putExtra(AlarmClock.EXTRA_MINUTES, date.getMinutes());
LogUtils.d("date.getHours() date.getMinutes()",date.getHours() +" "+date.getMinutes());;
if (!TextUtils.isEmpty(title)) {
intent.putExtra(AlarmClock.EXTRA_MESSAGE, title);
LogUtils.d(title);
}
intent.putExtra(AlarmClock.EXTRA_VIBRATE, true);
intent.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
// context.startActivity(intent);//系統(tǒng)鬧鐘數(shù)據(jù)可能會插入失敗,可以重復調(diào)用一次
}
測試的8.0系統(tǒng)鬧鐘存在bug,設置鬧鐘顯示成功,鬧鐘列表里也能顯示,但是有些可以取消,有些取消失敗,經(jīng)過重復測試發(fā)現(xiàn),有些鬧鐘數(shù)據(jù)設置后雖然顯示正常,但是未插入數(shù)據(jù)庫,重啟設備后這些數(shù)據(jù)并不存在了,會造成取消失敗,解決辦法是,可以在設置鬧鐘的時候重復調(diào)用一次,然后測試設置和取消鬧鐘都是正常的。
取消系統(tǒng)鬧鐘:
手機等非原生系統(tǒng)鬧鐘可能會取消無效,會跳轉(zhuǎn)到鬧鐘列表頁面,需用戶手動點擊取消
public static void cancelAlarm(Context context, String title, Date date) {
Intent i = new Intent(AlarmClock.ACTION_DISMISS_ALARM);
i.putExtra(AlarmClock.EXTRA_ALARM_SEARCH_MODE, AlarmClock.ALARM_SEARCH_MODE_LABEL);
if (!TextUtils.isEmpty(title)) {//通過標簽取消
i.putExtra(AlarmClock.EXTRA_MESSAGE, title);
LogUtils.d(title);
} else {//通過小時分鐘取消
i.putExtra(AlarmClock.EXTRA_ALARM_SEARCH_MODE, AlarmClock.ALARM_SEARCH_MODE_TIME);
i.putExtra(AlarmClock.EXTRA_IS_PM, TimeUtils.isPm(date));//其中false = AM且true = PM
i.putExtra(AlarmClock.EXTRA_HOUR,date.getHours()>12?date.getHours()-12:date.getHours());
i.putExtra(AlarmClock.EXTRA_MINUTES, date.getMinutes());
LogUtils.d("date.getHours() date.getMinutes()",(date.getHours()>12?date.getHours()-12:date.getHours()) +" "+date.getMinutes()+" "+TimeUtils.isPm(date));
}
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
注意:設置鬧鐘小時格式是0-23,取消鬧鐘時間小時格式是0-12。
中間也曾嘗試過直接操作系統(tǒng)鬧鐘數(shù)據(jù)庫,雖然設備有root權限,但是/data/data/com.android.deskclock/databases目錄下為空,并未看到alarms.db數(shù)據(jù)庫。
后來嘗試通過ClockProvider操作:,但是會報如下錯誤:
Permission Denial: opening provider com.android.deskclock.provider.ClockProvider
查看系統(tǒng)鬧鐘源碼可以看到:
<provider
android:name=".provider.ClockProvider"
android:authorities="com.android.deskclock"
android:directBootAware="true"
android:exported="false" />
Alarm的AndroidManifest.xml中的定義,ClockProvider定義如下:
android:exported="false",設置為不允許其他應用使用AlarmProvider,因此才報了這個異常。
AlarmClock中文API:https://www.apiref.com/android-zh/android/provider/AlarmClock.html#EXTRA_ALARM_SEARCH_MODE