【问题标题】:Requires android.permission.READ_CALENDAR or android.permission.WRITE_CALENDAR需要 android.permission.READ_CALENDAR 或 android.permission.WRITE_CALENDAR
【发布时间】:2018-10-03 14:18:18
【问题描述】:

我已经在我的 Manifest 和我安装的应用程序中授予了 READ_CALENDAR 和 WRITE_CALENDAR 权限,我已经授予了日历运行时权限,并且我从应用程序的设置中验证了相同的权限。

但即便如此,在某些设备上我还是会出现 Requires android.permission.READ_CALENDAR 或 android.permission.WRITE_CALENDAR 错误!疯了吧!这是我的日志:

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-AOSP 日历应用。

【问题讨论】:

标签: android android-source android-calendar runtime-permissions


【解决方案1】:

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

【讨论】:

  • 我已经给予了这些许可。正如我也从我的应用设置中验证的那样。
【解决方案2】:

首先,你需要在你的 manifest.xml 中添加权限,对于日历,你需要添加这个

<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />

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

final int callbackId = 42;

并调用你的函数来检查权限

checkPermission(callbackId, Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR);

这是要声明的函数:

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);
} 

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 2019-01-06
    • 1970-01-01
    • 2023-01-02
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多