«SecurityException: разрешение на отказ» при открытии календаря - PullRequest
0 голосов
/ 14 мая 2018

Фон

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

@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 
       ...

Что я нашел

В документах ничего не говорится о требованиях к разрешению. На самом деле, это говорит об обратном, если все, что вы используете, это Намерение:

Вашему приложению не нужны разрешения на чтение и запись календаря. данные. Вместо этого он может использовать намерения, поддерживаемые календарем Android приложение для передачи операций чтения и записи в это приложение. В следующей таблице перечислены намерения, поддерживаемые календарем Поставщик:

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

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

enter image description here

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

Вопросы

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