背景
为了在特定时间转到日历,我们使用它(基于此链接):
@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;
}
只有当它不为空时,我们才允许使用 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
...
我发现了什么
文档没有说明许可要求。实际上,如果您使用的只是一个 Intent,则相反:
您的应用程序不需要读取和写入日历数据的权限。相反,它可以使用 Android 的日历应用程序支持的意图将读写操作移交给该应用程序。下表列出了日历提供程序支持的意图:
在互联网上搜索,我什至没有得到任何关于发生了什么的好线索。
据 Crashlytics 报道,我只知道它发生在各种设备和各种 Android 版本上:
目前,我也在这里报告了这一点,因为我认为这种崩溃不应该发生。
问题
- 为什么会发生?
- 在清单中添加权限会有所帮助吗?
- 我该怎么办?我现在可以用 try-catch 包装,但是看到这个错误发生意味着实际上有一个可以处理 Intent 的应用程序,但它并没有让我到达它......
- 可能有什么好的后备方案吗?