调用需要对日历中的内容URI拥有权限



我对android很陌生。我正在开发一个应用程序,我想在其中自动设置事件。这是我的代码,我指的是http://developer.android.com/guide/topics/providers/calendar-provider.html

public boolean setReminder(int SelectedHour,int SelectedMinute,int NewHour,int NewMinute)
{
    try{
        long calID = 3;
        long startMillis = 0;
        long endMillis = 0;
        Calendar StartTime = Calendar.getInstance();
        StartTime.set(StartTime.YEAR,StartTime.MONTH,StartTime.DAY_OF_MONTH,SelectedHour,SelectedMinute);
        startMillis = StartTime.getTimeInMillis();
        Calendar EndTime = Calendar.getInstance();
        int NewMonth = StartTime.MONTH+1;int NewDay = StartTime.DAY_OF_MONTH;
        EndTime.set(StartTime.YEAR,NewMonth,NewDay,NewHour,NewMinute);
        endMillis = EndTime.getTimeInMillis();
        TimeZone tz = TimeZone.getDefault();
        ContentResolver cr = getContentResolver();
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Events.DTSTART, startMillis);
        values.put(CalendarContract.Events.DTEND, endMillis);
        values.put(CalendarContract.Events.TITLE, "Jazzercise");
        values.put(CalendarContract.Events.DESCRIPTION, "Group workout");
        values.put(CalendarContract.Events.CALENDAR_ID, calID);
        values.put(CalendarContract.Events.EVENT_TIMEZONE,  tz.getID());
        //Getting Problem in Line Below 
        Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI,values);
        // get the event ID that is the last element in the Uri
        long eventID = Long.parseLong(uri.getLastPathSegment());

        Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
        builder.appendPath("time");
        ContentUris.appendId(builder, startMillis);
        Intent intent = new Intent(Intent.ACTION_VIEW).setData(builder.build());
        startActivity(intent);
   return true;
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
        return false;
    }

我得到红线标记低于线

Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI,values);

错误在说呼叫需要权限,但可能会被用户拒绝。代码应明确检查权限是否可用

我已经在我的清单文件中添加了权限,如android.permission.ACCESS_FINE_LOCATIONandroid.permine.ACCESS_COARSE_LOCATION

虽然我的应用程序正在运行,但当我调用日历意向时,它会给我网页不可用

我也尝试过在安卓日历中添加事件日期和时间

但仍然不起作用。

提前谢谢。。

这意味着你正在请求android>=6中可能要求运行时权限的功能,即用户在运行时必须允许对你的应用程序的权限。请点击链接了解如何实现正确的流程。

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CALENDAR)
        != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_CALENDAR)) {
    // Show an expanation to the user *asynchronously* -- don't block
    // this thread waiting for the user's response! After the user
    // sees the explanation, try again to request the permission.
} else {
    // No explanation needed, we can request the permission.
    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_CALENDAR},
            MY_PERMISSIONS_REQUEST_READ_CALENDAR;
    // MY_PERMISSIONS_REQUEST_READ_CALENDAR is an
    // app-defined int constant. The callback method gets the
    // result of the request.
}
}else{
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI,values);
}

可能是因为缺少日历权限而出现此错误。将日历权限添加到清单文件中。

阅读日历:

android.permission.READ_CALENDAR

写入日历:

android.permission.WRITE_CALENDAR

由于这对许多程序员来说似乎仍然是一个问题。。。以下是我的解决方案:我有一个按钮来启动与日历的交互。这将首先打开一个带有2个按钮的消息框,用户必须在其中允许进一步操作。如果他允许出现另一个Messagebox,并请求用户允许读取日历

private void addMessageBox() {
    AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(getContext());
    dlgAlert.setMessage("Events mit lokalem Kalender synchronisieren?");
    dlgAlert.setTitle("Zugriff auf Kalender");
    dlgAlert.setCancelable(true);

    dlgAlert.setPositiveButton("Erlauben",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    permissions = new Permissions(getActivity());
                    if (!permissions.checkPermissionReadCalendar()) {
                        permissions.requestPermissionReadCalendar(Permissions.CALENDAR_PERMISSION_REQUEST_READ);
                    } else {
                        try {
                            addToLocalCalendar();
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
    dlgAlert.setNegativeButton("Verbieten",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    //return true;
                }
            });
    dlgAlert.create().show();
}

我用我在这个论坛的某个地方找到的一个自定义类来控制权限:

Permissions permissions;

与类别:

public class Permissions {

public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_WRITE = 0;
public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_READ = 1;
public static final int CALENDAR_PERMISSION_REQUEST_READ = 2;
Activity activity;
Context mContext;
public Permissions(Activity activity) {
    this.activity = activity;
    this.mContext = activity;
}

public boolean checkPermissionReadCalendar(){
    int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_CALENDAR);
    if (result == PackageManager.PERMISSION_GRANTED){
        return true;
    } else {
        return false;
    }
}
public void requestPermissionReadCalendar(int requestCode){
    if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.READ_CALENDAR)){
        Toast.makeText(mContext.getApplicationContext(), "Kalenderzugriff nicht möglich. Bitte erlaube Kalenderzugriff in den App Einstellungen.", Toast.LENGTH_LONG).show();
    } else {
        ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.READ_CALENDAR},requestCode);
    }
}

不知何故,你不需要申请写作许可。。。在应用程序设置中,日历只有一个权限,如果您调用读取或写入权限,则会被允许。在清单中添加以下内容:

<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />

如果用户拒绝该权限,他将始终收到祝酒词消息,表示他没有足够的权限执行此操作。他必须手动允许应用程序设置中的权限。红色下划线部分。。它说,应用程序必须检查用户是否允许以下操作。如果你点击这一行并点击Alt+Enter,将插入此代码:

   if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return true;
    }

这将检查应用程序是否具有权限,如果没有则返回。

我们需要检查并请求这两种权限。

  if (ActivityCompat.checkSelfPermission(activity!!, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.READ_CALENDAR), 30);
    }
   if (ActivityCompat.checkSelfPermission(activity!!, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.WRITE_CALENDAR), 35);
    }

如果我们同时请求了"读取"one_answers"写入日历"权限。这个错误不会再出现了。

最新更新