菜鸡
菜鸡
  • 发布:2017-09-03 01:06
  • 更新:2022-04-12 13:12
  • 阅读:8615

mui(准确的说是html5+)Android原生日历提醒插入案例踩坑经历

分类:HTML5+
  • 缘起
    需要在app里弄个定时提醒功能
  • 过程
    在问答社区看到一个大佬分享的安卓插入日历提醒的按理
    点击这里过去看看???
  • 但是
    看得有点晕,很多代码都不知道在干嘛(毕竟不懂原生)
    开始的时候就原样复制了一遍代码,也没怎么看,心想着能把项目完成了再说
  • 后来发现
    没登录日历账号的手机不能设置提醒,反正就是各种报错
    好了,不说心路历程了
    直接上干货
    (html和引入date picker就省略了哈)
    (function($) {  
    var setcalendar = function() {  
        $.toast('功能加载中,请稍后', {  
            type: 'div',  
            duration: 1000  
        });  
    };  
    $.plusReady(function() {  
        var calanderURL = 'content://com.android.calendar/calendars',  
            ContentValues = plus.android.importClass("android.content.ContentValues"),  
            Uri = plus.android.importClass('android.net.Uri'),  
            Calendar = plus.android.importClass('java.util.Calendar'),  
            main = plus.android.runtimeMainActivity(),  
            userCursor = plus.android.invoke(main.getContentResolver(), 'query', Uri.parse(calanderURL), null, null, null, null),  
            userCursor_count = plus.android.invoke(userCursor, 'getCount'),  
            TimeZone = plus.android.importClass('java.util.TimeZone'),  
            TimeZone_str = plus.android.invoke(TimeZone.getDefault(), 'getID');  
        setcalendar = function(title, description, date_str) {  
            if(userCursor_count <= 0) {//如果没有日历账户  
                var account = new ContentValues(),  
                    buildUpon = plus.android.invoke(Uri.parse(calanderURL), 'buildUpon'),  
                    CalendarContract = plus.android.importClass('android.provider.CalendarContract');  
                plus.android.invoke(buildUpon, 'appendQueryParameter', CalendarContract.CALLER_IS_SYNCADAPTER, 'true');  
                plus.android.invoke(buildUpon, 'appendQueryParameter', 'account_name', 'someone@something.com');  
                plus.android.invoke(buildUpon, 'appendQueryParameter', 'account_type', 'com.android.exchange');  
                //设置账户信息  
                account.put('name', 'someone');  
                account.put('account_name', 'someone@something.com');  
                account.put('account_type', 'com.android.exchange');  
                account.put('calendar_displayName', 'someone_calendar');  
                account.put('visible', 1);  
                account.put('calendar_color', '-9206951');  
                account.put('calendar_access_level', '700');  
                account.put('sync_events', 1);  
                account.put('calendar_timezone', TimeZone_str);  
                account.put('ownerAccount', 'someone@something.com');  
                account.put('canOrganizerRespond', 0);  
                //保存账户信息  
                plus.android.invoke(main.getContentResolver(), 'insert', plus.android.invoke(buildUpon, 'build'), account);  
                //重新定义userCursor  
                userCursor = plus.android.invoke(main.getContentResolver(), 'query', Uri.parse(calanderURL), null, null, null, null);  
                //重新定义userCursor_count  
                userCursor_count++;  
            }  
            plus.android.invoke(userCursor, 'moveToLast');  
            var calId = plus.android.invoke(userCursor, 'getString', plus.android.invoke(userCursor, 'getColumnIndex', '_id')),  
                events = new ContentValues(),  
                mCalendar = Calendar.getInstance(),  
                date = date_str.split(/\s{1}|:|-/g);  
            plus.android.invoke(mCalendar, 'set', Calendar.YEAR, ~~date[0]);  
            plus.android.invoke(mCalendar, 'set', Calendar.MONTH, ((~~date[1]) - 1));  
            plus.android.invoke(mCalendar, 'set', Calendar.DATE, ~~date[2]);  
            plus.android.invoke(mCalendar, 'set', Calendar.HOUR_OF_DAY, ~~date[3]);  
            plus.android.invoke(mCalendar, 'set', Calendar.MINUTE, ~~date[4]);  
            var start = plus.android.invoke(plus.android.invoke(mCalendar, 'getTime'), 'getTime'),  
                  end = plus.android.invoke(plus.android.invoke(mCalendar, 'getTime'), 'getTime');  
            //设置日历事件  
            events.put('title', title);  
            events.put('description', description);  
            events.put('calendar_id', calId);  
            events.put('dtstart', start);  
            events.put('dtend', end);  
            events.put('hasAlarm', 1);  
            events.put('eventTimezone', TimeZone_str);  
            var newEvent = plus.android.invoke(main.getContentResolver(), 'insert', Uri.parse('content://com.android.calendar/events'), events);  
            var id = plus.android.invoke(newEvent, 'getLastPathSegment');  
            var values = new ContentValues();  
            values.put('event_id', id);  
            values.put('minutes', '5');  
            values.put('method', '1');  
            plus.android.invoke(main.getContentResolver(), 'insert', Uri.parse('content://com.android.calendar/reminders'), values);  
            $.toast('设置提醒成功');  
        }  
    });  
    $.ready(function() {  
        $('.mui-content').on('tap', 'button.mui-btn', function() {  
            var picker = new $.DtPicker();  
            picker.show(function(rs) {  
                setcalendar('测试提醒标题', '测试提醒内容', rs.text);  
                picker.dispose();  
            });  
        });  
    });  
    })(mui);
  • 最后说一句
  • 打包的时候记得勾选日历权限
  • 这个问题坑死我了
5 关注 分享
zapoi 赵梦欢 水灵退散 lhyh 咕噜啦

要回复文章请先登录注册

1***@qq.com

1***@qq.com

现在还能用吗我运行时出现了这样的问题,可是我已经在manifest.json上配置了,Uncaught java.lang.SecurityException: Permission Denial: opening provider com.android.providers.calendar.CalendarProvider2 from ProcessRecord{f03408b 3681:io.dcloud.HBuilder/u0a41} (pid=3681, uid=10041) requires android.permission.READ_CALENDAR or android.permission.WRITE_CALENDAR;at android.app.ContextImpl$ApplicationContentResolver.query at index.html:1
2022-04-12 13:12
DCloud_heavensoft

DCloud_heavensoft

uni-app的app端可以用Native.js。别用示例中的dom、window那些api。iOS上也uni-app插件见:https://ext.dcloud.net.cn/search?q=%E6%B7%BB%E5%8A%A0%E6%97%A5%E5%8E%86
2020-03-27 18:34
1***@qq.com

1***@qq.com

如何使用呢
2020-03-07 12:39
1***@qq.com

1***@qq.com

uniapp能使用吗
2020-03-07 12:39
efeea

efeea

好好好好
2019-06-13 10:41
t***@sina.com

t***@sina.com

怎么样打包安卓的日历权限,有哪位大神知道
2018-09-12 18:34
我是大笨蛋

我是大笨蛋

斗你个坤子
2018-06-04 13:46
崔尐磊

崔尐磊

回复 FOFxjc :
老表,锤子手机日历提醒会显示‘aaa的生日’
2018-04-28 12:14
崔尐磊

崔尐磊

回复 FOFxjc :
怎么通过id去去删除啊,能修改一下吗 大佬
2018-04-11 09:27
崔尐磊

崔尐磊

回复 FOFxjc :
想问一下怎么删除指定的提醒啊,你写的是先出全部吧
2018-04-03 17:41