这是我的密码:-
public void onClick(View v) {
try {
startActivity(new Intent(
"android.intent.action.SHOW_ALARMS"));
} catch (ActivityNotFoundException ignore) {
Toast.makeText(ac, "ActivityNotFoundException",
Toast.LENGTH_LONG).show();
}
}这在运行Android12API 31的Android仿真器上有效:它展示了系统时钟应用程序和警报页面。在我的三星Galaxy S21上,也运行Android 12 API 31,我得到了以下错误:-
Process: uk.co.yahoo.p1rpp.secondsclock, PID: 27629
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.SHOW_ALARMS cmp=com.sec.android.app.clockpackage/.alarm.activity.AlarmCTSHandleActivity } from ProcessRecord{769a91e 27629:uk.co.yahoo.p1rpp.secondsclock/u0a362} (pid=27629, uid=10362) requires com.android.alarm.permission.SET_ALARM
at android.os.Parcel.createExceptionOrNull(Parcel.java:2437)
at android.os.Parcel.createException(Parcel.java:2421)
at android.os.Parcel.readException(Parcel.java:2404)
at android.os.Parcel.readException(Parcel.java:2346)
at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:2878)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1743)
at android.app.Activity.startActivityForResult(Activity.java:5465)
at android.app.Activity.startActivityForResult(Activity.java:5423)
at android.app.Activity.startActivity(Activity.java:5809)
at android.app.Activity.startActivity(Activity.java:5762)
at uk.co.yahoo.p1rpp.secondsclock.SettingsActivity$25.onClick(SettingsActivity.java:538)
...下面是我的AndroidManifest.xml的第一部分:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="uk.co.yahoo.p1rpp.secondsclock">
<uses-permission android:name="android.permission.SET_ALARM" />
...我实际上是在请求许可,尽管我不应该需要它,因为我要求查看警报,而不是设置警报。在清单中没有权限请求的情况下,它仍然在模拟器上工作,并且在电话上以相同的方式失败。
我看到同样的行为(在模拟器和手机上)都是调试和发布版本。
如果有人问我为什么要这样做,我已经写了一个主屏幕秒时钟小部件,它将在github上发布,当它完全正常工作时。我希望点击小部件转到系统的时钟应用程序,由于这个问题,它不能工作。所显示的代码是测试代码,用于检查小部件中的代码为什么失败,因为小部件代码在主屏幕启动程序的上下文中执行,并且更难调试。
我可以使用带有Intent和ComponentName的系统时钟应用程序(这在手机上没有错误),但是不同的安卓手机有不同的时钟应用程序,不同的Componentname,所以它只能在一种类型的手机上工作。我确实有代码可以在PackageManager中搜索时钟的ComponentName,但是Google在API 31中的最新安全升级不允许我再这么做了。
为什么SecurityException会发生,如果我能做些什么来阻止它呢?
发布于 2021-12-07 22:58:54
为什么SecurityException会发生
三星的<activity>显然有一个<activity>属性,要求来电者必须持有该权限才能启动该活动。
,如果我能做些什么来阻止它呢?
你不能阻止它。三星需要这样的许可,要么是故意的,要么是因为搞砸了。您要么需要持有该权限,要么需要将startActivity()调用包装在一个try/catch中,并在得到该异常时“优雅地降级”。
发布于 2022-11-02 12:01:00
它不需要您前面提到的权限,而是需要不同的权限。
替换此
<uses-permission android:name="android.permission.SET_ALARM" />与
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />https://stackoverflow.com/questions/70267698
复制相似问题