首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要android.permission.READ_CALENDAR或android.permission.WRITE_CALENDAR

需要android.permission.READ_CALENDAR或android.permission.WRITE_CALENDAR
EN

Stack Overflow用户
提问于 2018-10-03 14:18:18
回答 2查看 1.7K关注 0票数 0

我在我的报表中给了READ_CALENDAR和WRITE_CALENDAR的权限,在我安装的应用程序中,我给了Calendar运行时权限,并且我从app的设置中验证了同样的权限。

但是,即使在某些设备上,也需要android.permission.READ_CALENDAR或android.permission.READ_CALENDAR错误!这太疯狂了!这是我的日志:

代码语言:javascript
运行
复制
Fatal Exception: java.lang.RuntimeException: An error occurred while executing doInBackground()
       at android.os.AsyncTask$3.done(AsyncTask.java:353)
       at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
       at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
       at java.util.concurrent.FutureTask.run(FutureTask.java:271)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
       at java.lang.Thread.run(Thread.java:764)

Caused by java.lang.SecurityException: Permission Denial: opening provider com.android.providers.calendar.CalendarProvider2 from ProcessRecord{76fdbc0 21351:com.app.byday/u0a166} (pid=21351, uid=10166) requires android.permission.READ_CALENDAR or android.permission.WRITE_CALENDAR
       at android.os.Parcel.readException(Parcel.java:1943)
       at android.os.Parcel.readException(Parcel.java:1889)
       at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:4885)
       at android.app.ActivityThread.acquireProvider(ActivityThread.java:6019)
       at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2525)
       at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1791)
       at android.content.ContentResolver.query(ContentResolver.java:749)
       at android.content.ContentResolver.query(ContentResolver.java:715)
       at android.content.CursorLoader.loadInBackground(CursorLoader.java:64)
       at android.content.CursorLoader.loadInBackground(CursorLoader.java:54)
       at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:315)
       at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69)
       at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:64)
       at android.os.AsyncTask$2.call(AsyncTask.java:333)
       at java.util.concurrent.FutureTask.run(FutureTask.java:266)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
       at java.lang.Thread.run(Thread.java:764)

附加信息:我已经将Etar日历应用集成到我的应用程序中。

EN

回答 2

Stack Overflow用户

发布于 2018-10-03 14:19:18

这些都需要运行时权限,而不仅仅是任何现代版本的Android上的显式权限。

票数 0
EN

Stack Overflow用户

发布于 2019-07-26 18:46:56

首先,您需要为日历向manifest.xml添加权限,您需要添加以下内容

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />

在运行时,您需要再次请求许可。因此,您可以创建一些函数来检查它。为回调声明一个vble

代码语言:javascript
运行
复制
final int callbackId = 42;

调用您的函数来检查权限。

代码语言:javascript
运行
复制
checkPermission(callbackId, Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR);

这就是要声明的功能:

代码语言:javascript
运行
复制
private void checkPermission(int callbackId, String... permissionsId) {
boolean permissions = true;
for (String p : permissionsId) {
    permissions = permissions && ContextCompat.checkSelfPermission(this, p) == PERMISSION_GRANTED;
}

if (!permissions)
    ActivityCompat.requestPermissions(this, permissionsId, callbackId);
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52629146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档