闹钟意图说“没有应用程序可以执行此操作。”

Posted

技术标签:

【中文标题】闹钟意图说“没有应用程序可以执行此操作。”【英文标题】:AlarmClock intent says "No apps can perform this action." 【发布时间】:2020-08-29 16:54:37 【问题描述】:

我正在尝试在闹钟中设置闹钟。我正在使用 android One Phone(具有未修改的操作系统)并安装了允许设置闹钟的时钟应用程序(预安装)。过去,当我不得不在后台设置警报时,我使用了 AlarmManager 和 PendingIntent 来设置警报。这表明我的时钟应用可以响应AlarmClock 意图。但是现在当我尝试从我的应用程序的前台发送一个意图时,它会说:

没有应用可以执行此操作。

这不是来自堆栈跟踪,而是向用户显示的一个弹出窗口,供用户选择选择哪个时钟应用来设置警报(或一般用于意图的应用)

这是 Activity 的 onCreate() 代码,我将其称为:

public class MainActivity extends AppCompatActivity 
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        ...
        Utils.setAlarm(this, Utils.getLDT(epochTime).plusHours(8));
    

这是发送意图的Utils#setAlarm 函数:

public class Utils 

    public static void setAlarm(Context context, LocalDateTime alarmTimeDT) 

        Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM);
        intent.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
        intent.putExtra(AlarmClock.EXTRA_HOUR, alarmTimeDT.getHour());
        intent.putExtra(AlarmClock.EXTRA_MINUTES, alarmTimeDT.getMinute());
        intent.putExtra(AlarmClock.EXTRA_MESSAGE, "Good Morning");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    
    ...

这是过去用于同一设备和同一时钟应用程序的附加代码。这是为了取消已经设置的闹钟,但用于设置旧闹钟的代码类似,除了取消部分:

        //cancel old alarm
        AlarmManager alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        PendingIntent alarmIntent = PendingIntent.getActivity(
                this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
        if (alarmIntent != null) 
            alarmMgr.cancel(alarmIntent);
         else 
            Log.i(TAG, "intent is null");
        

我做错了什么?任何帮助表示赞赏。 下面的 cmets 只是在询问并要求对问题进行更多澄清,这些都是按要求完成的。所以你可以跳过阅读它们

【问题讨论】:

“我安装了允许设置闹钟的默认时钟应用程序”——Android 没有单一的“默认时钟应用程序”。根据设备制造商选择发布的内容,默认时钟应用程序有几十个,如果不是几百个的话。也许您的设备有时钟应用,但没有响应此Intent 操作的应用。 @CommonsWare “默认”我的意思是时钟应用程序无法卸载,至少在未修改的操作系统中是这样。我正在使用 Android One。我提到过:“它之前也起作用过”,这意味着它实际上可以响应 Intent。 “我的意思是有不能卸载的时钟应用程序,至少在未修改的操作系统中”——根据设备制造商选择的内容,有几十个,如果不是几百个的话航运。在你的情况下,AFAIK,谷歌在 Android One 设备上控制它。您的错误消息是否以堆栈跟踪的形式出现?如果是这样,您可能想要编辑您的问题并包含完整的堆栈跟踪。您可能还想展示您认为您的代码有效的场景,以便我们可以比较和对比哪些对您有效,哪些无效。 " 有几十个,如果不是几百个......" 当我提到它在过去有效时,这对这个问题有什么帮助?当然,我说的是我的案例——我拥有的 Android One Phone。堆栈跟踪中没有错误消息,这是来自应用程序在启动时显示的小弹出窗口(通常显示以选择使用哪个应用程序来完成操作),在帖子中进行了澄清。它工作的代码都是一样的,它只是使用了一个带有 PendingIntent 的 AlarmManager。仍然,补充说。 “当我提到它在过去有效时,这对这个问题有什么帮助?” -- 除非您的应用程序只能在您自己的设备上运行,否则您必须考虑到其他用户将拥有具有不同特征的不同设备。 “这是来自小弹出窗口(通常显示选择使用哪个应用程序来完成操作)” - 这很奇怪。如果真的没有应用程序来处理Intent,你会因为ActivityNotFoundException 而崩溃。既然你不是,那么正在处理Intent 【参考方案1】:

没有应用可以执行此操作。

当您没有设置闹钟所需的权限时会发生这种情况。

来自AlarmClock reference:

希望接收 ACTION_SET_ALARM 和 ACTION_SET_TIMER Intent 的应用程序应该创建一个 Activity 来处理 需要 com.android.alarm.permission.SET_ALARM 权限的 Intent。

请求SET_ALARM 权限:

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

</manifest>

【讨论】:

谢谢!这就是问题所在!

以上是关于闹钟意图说“没有应用程序可以执行此操作。”的主要内容,如果未能解决你的问题,请参考以下文章

没有应用程序可以执行此操作来打开 Instagram URL

使用意图设置闹钟(如闹钟)

android中的原始闹钟是不是会在闹钟时广播意图?

除了第一个意图外,所有意图都收到了不正确的额外内容

如何使用 AlarmClock 在 android 中设置闹钟的日期

Android:未调用的未决意图具有多个警报的打盹