Чтобы перейти к календарю в определенное время, мы используем это (на основе эта ссылка):
@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:
На данный момент я также сообщил об этом здесь, потому что я считаю, что этого сбоя не должно быть.
@NileshRathod Это странно. Я думал, что это должно быть безопасно, но, по всей видимости, за последние 3 месяца у 141 пользователя произошло 222 сбоя.
Я тестировал приведенный выше код в api 23 и api 24, отлично работает на моем устройстве, действительно странно, что отчет о сбое
@NileshRathod Вы тоже пользуетесь Crashlytics? Возможно, он обнаружил сбой, который не может быть в Play Store.
Я не использую Crashlytics и насчет этого Maybe it found a crash that the Play Store can't может быть но я не уверен насчет этого
Я видел, что указанная выше ошибка связана с ошибкой Gmail. Попробуйте это, если это может исправить: stackoverflow.com/questions/6871200/…
@TamHuynh Что именно попробовать? Единственный ответ - вернуться к версиям. Версия чего здесь? Все, что я делаю, это открываю намерение ...
Странно, я не получаю никаких исключений, используя приведенный выше код