我对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_LOCATION和android.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"写入日历"权限。这个错误不会再出现了。