Andriod studio manifast中添加权限却还无效&&日历api设置定时闹钟却不生效

初接触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都给删除了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值