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
尝试过虚拟机和真机都没有办法打印输出日历的相关属性
希望大家指点一二,不甚感激
你先改流程吧,你的权限流程不对。
如果没有权限呢?你还不是照样执行。应该是,有权限就去查询,没有权限就去获取权限,获取成功以后再走正常流程,这个是异步的嗷。