«SecurityException: Permission Denial» при открытии календарного намерения

Задний план

Чтобы перейти к календарю в определенное время, мы используем это (на основе эта ссылка):

@Nullable
public static Intent prepareIntentForCalendar(final Context context, final Date date) {
    Intent intent = null;
    final Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
    builder.appendPath("time");
    ContentUris.appendId(builder, date.getTime());
    intent = new Intent(Intent.ACTION_VIEW).setData(builder.build());
    final PackageManager pm = context.getPackageManager();
    final ResolveInfo resolveActivity = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY
            | PackageManager.GET_RESOLVED_FILTER);
    if (resolveActivity == null)
        return null;
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY
            | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
    return intent;
}

Только если он не равен нулю, мы разрешаем использовать намерение.

Проблема

Недавно у меня появилось странное исключение по этому поводу. Это звучит так:

Fatal Exception: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW dat=content://com.android.calendar/time/-11518765200000 flg=0x58080000 cmp=com.google.android.gm/.browse.TrampolineActivity } from ProcessRecord{fb2ca43 25597:.../u0a127} (pid=25597, uid=10127) requires com.google.android.gm.permission.READ_GMAIL
       at android.os.Parcel.readException(Parcel.java:1945)
       at android.os.Parcel.readException(Parcel.java:1891)
       at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:4373)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1631)
       at android.app.Activity.startActivityForResult(Activity.java:4762)
       at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
       at android.app.Activity.startActivityForResult(Activity.java:4702)
       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
       at android.app.Activity.startActivity(Activity.java:5123)
       at android.app.Activity.startActivity(Activity.java:5091)
       at 
       ...

Что я нашел

Документы ничего не говорят о требованиях разрешения. Фактически, он говорит об обратном, если все, что вы используете, - это намерение:

Your application doesn't need permissions to read and write calendar data. It can instead use intents supported by Android's Calendar application to hand off read and write operations to that application. The following table lists the intents supported by the Calendar Provider:

Поискав в Интернете, я не получил ни единого верного представления о том, что происходит.

Единственное, что я знаю, это то, что это происходит на разных устройствах и в разных версиях Android, как сообщает Crashlytics:

«SecurityException: Permission Denial» при открытии календарного намерения

На данный момент я также сообщил об этом здесь, потому что я считаю, что этого сбоя не должно быть.

Вопросы

  1. Почему это происходит?
  2. Поможет ли добавление разрешения в манифест?
  3. Что мне делать, чтобы с этим справиться? На данный момент я могу обернуть try-catch, но, видя, что эта ошибка возникает, означает, что на самом деле существует приложение, которое может обрабатывать намерение, но оно не позволяет мне добраться до него ...
  4. Есть ли хороший запасной вариант?

Странно, я не получаю никаких исключений, используя приведенный выше код

AskNilesh 14.05.2018 09:20

@NileshRathod Это странно. Я думал, что это должно быть безопасно, но, по всей видимости, за последние 3 месяца у 141 пользователя произошло 222 сбоя.

android developer 14.05.2018 09:24

Я тестировал приведенный выше код в api 23 и api 24, отлично работает на моем устройстве, действительно странно, что отчет о сбое

AskNilesh 14.05.2018 09:28

@NileshRathod Вы тоже пользуетесь Crashlytics? Возможно, он обнаружил сбой, который не может быть в Play Store.

android developer 14.05.2018 09:30

Я не использую Crashlytics и насчет этого Maybe it found a crash that the Play Store can't может быть но я не уверен насчет этого

AskNilesh 14.05.2018 09:32

Я видел, что указанная выше ошибка связана с ошибкой Gmail. Попробуйте это, если это может исправить: stackoverflow.com/questions/6871200/…

Tam Huynh 14.05.2018 09:51

@TamHuynh Что именно попробовать? Единственный ответ - вернуться к версиям. Версия чего здесь? Все, что я делаю, это открываю намерение ...

android developer 14.05.2018 10:10
5
7
365
0

Другие вопросы по теме