android 为什么SHOW_ALARMS需要GALAXY S21上的SET_ALARMS权限?

svmlkihl  于 2022-11-03  发布在  Android
关注(0)|答案(2)|浏览(124)

下面是我的代码:-

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();
                    }
                }

这适用于运行Android 12 API 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来访问系统时钟应用程序(而且这在手机上没有错误),但是不同的Android手机型号有不同的时钟应用程序,有不同的Componentname s,所以它只会在一种类型的手机上工作。我确实有代码在PackageManager中搜索时钟的ComponentName,但是Google在API 31中的最新安全升级不允许我再这样做了。
为什么会发生SecurityException,如果我能做些什么来防止它?

zmeyuzjn

zmeyuzjn1#

为什么会发生SecurityException
三星显然有一个android:permission属性,要求调用者需要持有该权限才能启动该活动。
如果我能做些什么来阻止它呢?
您无法阻止它。Samsung需要该权限,可能是有意的,也可能是由于某些失误。您要么需要保留该权限,要么需要将startActivity()调用 Package 在try/catch中,如果遇到该异常,则“优雅地降级”。

xyhw6mcr

xyhw6mcr2#

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

替换此

<uses-permission android:name="android.permission.SET_ALARM" />

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

相关问题