2022.9.28更新:
通过打断点单步调试发现权限是有的,
但是在while循环这地方进不去,不知道是什么原因

====================================================================================================
日历的属性打印不出来,不知道什么原因,希望大家帮忙看看
第一张图是logcat,今天升级了一下AS,logcat窗口就变成这个样子了
红色圈出来的是我自己的打印log,后面就没有其他属于我的打印log(已经截取了完整的logcat窗口,下面没有其他内容了)

源代码截图如下:

package com.example.calendarprovider;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
@RequiresApi(api = Build.VERSION_CODES.M)
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    public static final int PERMISSION_REQUEST_CODE = 1;
    @SuppressLint("Range")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            checkCalendarPermission();
        }
        queryCalendars();
    }
    private void checkCalendarPermission() {
        int readPermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);
        int writePermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);
        if(readPermission == PackageManager.PERMISSION_GRANTED &&
                writePermission == PackageManager.PERMISSION_GRANTED) {
            //表示已经有权限,可以直接执行程序
        }else {
            //获取相关权限
            Log.d(TAG, "checkCalendarPermission: ");
            //做个提示,用户点击了确定后再去获取请求权限
            //如果点击了不再提示,就不在获取了,如果不能使用,根据产品经理的交互去写
            requestPermissions(new String[] {Manifest.permission.READ_CALENDAR,
                    Manifest.permission.WRITE_CALENDAR}, PERMISSION_REQUEST_CODE);
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length ==2 && grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                    grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                //获取到相关权限
                Log.d(TAG, "获取到相关权限");
            }else {
                //未获取到相关权限
                Log.d(TAG, "未获取到相关权限,程序直接退出");
                finish();
            }
        }
    }
    private void queryCalendars() {
        Log.d(TAG, "queryCalendars: ");
        ContentResolver contentResolver = getContentResolver();
        Uri uri = Uri.parse("content://" + "com.android.calendar" + "/calendars");
        Log.d(TAG, "URI ------> " + uri);
        Cursor query = contentResolver.query(uri, null, null, null, null);
        String[] columnNames = query.getColumnNames();
        while (query.moveToNext()) {
            Log.d(TAG, "===================");
            for (String columnName : columnNames) {
                @SuppressLint("Range") String values = query.getString(query.getColumnIndex(columnName));
                Log.d(TAG, columnName + "------" + values);
            }
            Log.d(TAG, "===================");
        }
        query.close();
    }
}
Manifest文件如下:

手机是小米的,安卓11API30
尝试过虚拟机和真机都没有办法打印输出日历的相关属性
希望大家指点一二,不甚感激
  
//遍历表 if (query != null && query.getCount() > 0) { query.moveToFirst(); do { //todo: } while (query.moveToNext()); }你先改流程吧,你的权限流程不对。
如果没有权限呢?你还不是照样执行。应该是,有权限就去查询,没有权限就去获取权限,获取成功以后再走正常流程,这个是异步的嗷。