首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么SHOW_ALARMS在GalaxyS21上需要SET_ALARMS许可?

为什么SHOW_ALARMS在GalaxyS21上需要SET_ALARMS许可?
EN

Stack Overflow用户
提问于 2021-12-07 22:28:15
回答 2查看 217关注 0票数 1

这是我的密码:-

代码语言:javascript
复制
                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,我得到了以下错误:-

代码语言:javascript
复制
    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的第一部分:

代码语言:javascript
复制
<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上发布,当它完全正常工作时。我希望点击小部件转到系统的时钟应用程序,由于这个问题,它不能工作。所显示的代码是测试代码,用于检查小部件中的代码为什么失败,因为小部件代码在主屏幕启动程序的上下文中执行,并且更难调试。

我可以使用带有IntentComponentName的系统时钟应用程序(这在手机上没有错误),但是不同的安卓手机有不同的时钟应用程序,不同的Componentname,所以它只能在一种类型的手机上工作。我确实有代码可以在PackageManager中搜索时钟的ComponentName,但是Google在API 31中的最新安全升级不允许我再这么做了。

为什么SecurityException会发生,如果我能做些什么来阻止它呢?

EN

回答 2

Stack Overflow用户

发布于 2021-12-07 22:58:54

为什么SecurityException会发生

三星的<activity>显然有一个<activity>属性,要求来电者必须持有该权限才能启动该活动。

,如果我能做些什么来阻止它呢?

你不能阻止它。三星需要这样的许可,要么是故意的,要么是因为搞砸了。您要么需要持有该权限,要么需要将startActivity()调用包装在一个try/catch中,并在得到该异常时“优雅地降级”。

票数 0
EN

Stack Overflow用户

发布于 2022-11-02 12:01:00

它不需要您前面提到的权限,而是需要不同的权限。

替换此

代码语言:javascript
复制
<uses-permission android:name="android.permission.SET_ALARM" />

代码语言:javascript
复制
 <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70267698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档