设置一个加入日历提醒事件的按钮,但程序跑到uri的地方崩掉了,提示是一个unknown 的uri
(模拟器的系统是6.0,api23)
1.Log报错部分
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.calendar3, PID: 3752
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
at android.view.View.performClick(View.java:5198)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:5198)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalArgumentException: Unknown URL content://com.android.calendar
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
at android.content.ContentResolver.insert(ContentResolver.java:1231)
at com.example.calendar3.MainActivity.addAlertEvent(MainActivity.java:61)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:5198)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
2.代码部分
package com.example.calendar3;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Process;
import android.provider.CalendarContract;
import android.util.Log;
import android.view.View;
import java.util.Calendar;
import java.util.TimeZone;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int REQUEST_PERMISSION_CODE=1;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkCalendarPermission();
queryCalendar();
}
public void addAlertEvent(View view){
//设置日历的id
long calID = 1;
//设置开始时间
Calendar begintime = Calendar.getInstance();
begintime.set(2021,12,1,0,0,0);
long beginTimeInMillis = begintime.getTimeInMillis();
//设置结束时间
Calendar endtime = Calendar.getInstance();
endtime.set(2021,12,2,0,0);
long endTimeInMillis = endtime.getTimeInMillis();
//获取时区
String Timezone = TimeZone.getDefault().getID();
Log.d(TAG,"timezone-----"+Timezone);
ContentValues values = new ContentValues();
ContentResolver resolver = getContentResolver();
values.put(CalendarContract.Events.DTSTART,beginTimeInMillis);
values.put(CalendarContract.Events.DTEND,endTimeInMillis);
values.put(CalendarContract.Events._ID,calID);
values.put(CalendarContract.Events.TITLE,"cpp考核");
values.put(CalendarContract.Events.DESCRIPTION,"算法题安卓题");
values.put(CalendarContract.Events.EVENT_TIMEZONE,Timezone);
values.put(CalendarContract.Events.EVENT_LOCATION,"湛江");
Uri uri = CalendarContract.CONTENT_URI;
Uri resultUri = resolver.insert(uri, values);
Log.d(TAG,"resulturi-----"+resultUri);
}
private void queryCalendar() { ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://"+"com.android.calendar/"+"calendars");
Cursor query = contentResolver.query(uri, null, null, null, null);
String[] colunmNames =query.getColumnNames();
while (query.moveToNext()){
Log.d(TAG,"----------");
for (String colunmName : colunmNames) {
int columnIndex = query.getColumnIndex(colunmName);
query.getString(columnIndex);
}
Log.d(TAG,"----------");
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
private void checkCalendarPermission() {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){//判断系统版本的代码
int readpermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);
int writepermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);
// int readpermission = checkPermission(Manifest.permission.READ_CALENDAR,android.os.Process.myPid(), Process.myUid());
// int writepermission = checkPermission(Manifest.permission.READ_CALENDAR,android.os.Process.myPid(), Process.myUid());
if (readpermission!= PackageManager.PERMISSION_GRANTED||writepermission!=PackageManager.PERMISSION_GRANTED){
//表示没有权限
}else {
//去获取权限
Log.d(TAG,"request...");
requestPermissions(new String[]{Manifest.permission.READ_CALENDAR,Manifest.permission.WRITE_CALENDAR},REQUEST_PERMISSION_CODE);
// ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CALENDAR,Manifest.permission.WRITE_CALENDAR},REQUEST_PERMISSION_CODE);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode==REQUEST_PERMISSION_CODE){
if (grantResults.length==2&&grantResults[0]==PackageManager.PERMISSION_GRANTED&&grantResults[1]==PackageManager.PERMISSION_GRANTED){
//获取权限成功
Log.d(TAG,"request permission successfully");
}else {
//获取权限失败
Log.d(TAG,"request permission falied");
finish();
}
}
}
}
Unknown URL content://com.android.calendar,你最好看一下源码,是否可以匹配上。