【问题标题】:Intent to launch the clock application on android打算在 android 上启动时钟应用程序
【发布时间】:2011-04-05 04:37:58
【问题描述】:

我制作的时钟小部件出现问题。我希望用户触摸时钟并在手机上启动时钟应用程序。这是代码:

//this worked on my nexus 2.1 
if(VERSION.SDK.equals("7")){
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

            Intent AlarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName("com.android.deskclock", "com.android.deskclock.DeskClock"));
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, AlarmClockIntent, 0);
            views.setOnClickPendingIntent(R.id.Widget, pendingIntent);

            AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);

        }
  //this worked on my nexus +froyo2.2           
  else if(VERSION.SDK.equals("8")){
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

            Intent AlarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName("com.google.android.deskclock", "com.android.deskclock.DeskClock"));
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, AlarmClockIntent, 0);
            views.setOnClickPendingIntent(R.id.Widget, pendingIntent);

            AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);

        }
 //this worked on my htc magic with 1.5 and 1.6
        else{
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

            Intent AlarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName("com.android.alarmclock", "com.android.alarmclock.AlarmClock"));
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, AlarmClockIntent, 0);
            views.setOnClickPendingIntent(R.id.Widget, pendingIntent);

            AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);
        }

我做了上述操作,所以当我触摸时钟时会打开闹钟设置。但不是通用的。 我发现在 2.2 的机器人上不起作用。必须有比为世界上每一种安卓手机风格创建一个 if 语句更好的解决方案。另外,我不知道所有人的包裹名称。 任何人都知道如何克服这一点,请帮助。

【问题讨论】:

标签: android android-intent widget clock


【解决方案1】:

此代码适用于我的时钟小部件。

PackageManager packageManager = context.getPackageManager();
Intent alarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER);

// Verify clock implementation
String clockImpls[][] = {
        {"HTC Alarm Clock", "com.htc.android.worldclock", "com.htc.android.worldclock.WorldClockTabControl" },
        {"Standar Alarm Clock", "com.android.deskclock", "com.android.deskclock.AlarmClock"},
        {"Froyo Nexus Alarm Clock", "com.google.android.deskclock", "com.android.deskclock.DeskClock"},
        {"Moto Blur Alarm Clock", "com.motorola.blur.alarmclock",  "com.motorola.blur.alarmclock.AlarmClock"},
        {"Samsung Galaxy Clock", "com.sec.android.app.clockpackage","com.sec.android.app.clockpackage.ClockPackage"} ,
        {"Sony Ericsson Xperia Z", "com.sonyericsson.organizer", "com.sonyericsson.organizer.Organizer_WorldClock" },
        {"ASUS Tablets", "com.asus.deskclock", "com.asus.deskclock.DeskClock"}

};

boolean foundClockImpl = false;

for(int i=0; i<clockImpls.length; i++) {
    String vendor = clockImpls[i][0];
    String packageName = clockImpls[i][1];
    String className = clockImpls[i][2];
    try {
        ComponentName cn = new ComponentName(packageName, className);
        ActivityInfo aInfo = packageManager.getActivityInfo(cn, PackageManager.GET_META_DATA);
        alarmClockIntent.setComponent(cn);
        debug("Found " + vendor + " --> " + packageName + "/" + className);
        foundClockImpl = true;
    } catch (NameNotFoundException e) {
        debug(vendor + " does not exists");
    }
}

if (foundClockImpl) {
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, alarmClockIntent, 0);
        // add pending intent to your component
        // ....
}

这样,我就可以运行一个默认的时钟管理器了。

【讨论】:

  • 在“Froyo Nexus 闹钟”行中,正确的 className 为:“com.android.deskclock.AlarmClock”。在另一种情况下,意图直接将用户带到设置警报,但在这种情况下,它会将用户带到所谓的桌面时钟,从那里需要一次额外的点击才能到达与其他情况相同的位置。我不明白为什么我的编辑被拒绝了......甚至第二个最有用的答案也提到了它(@iBog 使用了不同的供应商名称,但它仅在记录时相关)。
  • @frusso 在此我们设置了闹钟时间,但它可以自动显示具有自己功能的闹钟。有没有办法以小时和分钟为单位找到时间?请帮助...
  • 好像这段代码不支持 Sony Xperia Z1。
【解决方案2】:

为了跟进 Mayra 的回答,android.provider.AlarmClock 类为此具有正确的 Intent,但它仅在 API 级别 9 及更高级别上可用。 (至少 Google 有人会听这样的请求!)

要从您的小部件启动时钟应用,请使用以下代码:

Intent openClockIntent = new Intent(AlarmClock.ACTION_SET_ALARM);
openClockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(openClockIntent);

您还需要此权限:
&lt;uses-permission android:name="com.android.alarm.permission.SET_ALARM"/&gt;

【讨论】:

    【解决方案3】:

    从 api 级别 19 开始,您可以使用它在默认时钟应用程序上显示闹钟列表:

        Intent mClockIntent = new Intent(AlarmClock.ACTION_SHOW_ALARMS);
        mClockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(mClockIntent);
    

    【讨论】:

    • 有效但记得设置&lt;uses-permission android:name="com.android.alarm.permission.SET_ALARM"/&gt;
    【解决方案4】:

    在应用程序之外启动活动的正确方法是使用隐式意图。使用隐式意图,您无需提供特定的类来启动,而是指定其他应用程序可以选择执行的操作。

    这是为了防止当其他应用的创建者决定重命名他们的类时,您的应用会中断。此外,它还允许多个应用响应相同的操作。

    有关隐式意图的更多详细信息,请参阅intents and intent filters

    很遗憾,您需要应用开发者同意所有人实施特定操作才能使其正常工作。如果时钟应用程序没有这个,那么就没有很好的方法来完成你想要的。

    我建议不要像你一样尝试创建一个巨大的 if 语句,因为应用程序可能不仅与不同的 sdk 版本不同,而且与不同的手机不同,因为手机制造商可以选择替换应用程序。因此,如果您依赖能够打开时钟应用程序,您的应用程序将不断在新手机上运行。

    【讨论】:

    • Mayra,您能否提供启动时钟应用程序的隐含意图的代码,以便我更好地理解。谢谢
    • 可能没有隐含的意图。除非应用提供广播接收器,否则您不应该在 android 中启动外部应用
    • 如果时钟应用支持特定操作,您可以执行以下操作: Intent clockIntent = new Intent(); clockIntent.setAction(android.clock.Intent.CLOCK_ACTION);开始活动(时钟意图);然而,正如 Falmarri 指出的那样,可能没有一个时钟,所以没有什么好方法可以做你想做的事。
    • 此答案更多是对先前答案的评论。基本上,这个答案告诉你没有办法触发时钟应用程序。
    【解决方案5】:

    代码:

                Intent i = new Intent(AlarmClock.ACTION_SET_ALARM);
                i.putExtra(AlarmClock.EXTRA_MESSAGE, "Alarm Title");
                ArrayList<Integer> alarmDays = new ArrayList<>();
                alarmDays.add(Calendar.SATURDAY);
                alarmDays.add(Calendar.SUNDAY);
                alarmDays.add(Calendar.MONDAY);
                alarmDays.add(Calendar.TUESDAY);
                alarmDays.add(Calendar.WEDNESDAY);
                alarmDays.add(Calendar.THURSDAY);
                alarmDays.add(Calendar.FRIDAY);
                i.putExtra(AlarmClock.EXTRA_DAYS, alarmDays);
                i.putExtra(AlarmClock.EXTRA_VIBRATE, true);
                i.putExtra(AlarmClock.EXTRA_HOUR, 10);
                i.putExtra(AlarmClock.EXTRA_MINUTES, 21);
                startActivity(i);
    

    权限:

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

    【讨论】:

      【解决方案6】:

      @Mayra 是对的。就是这样。但是,本机时钟应用程序没有注册的意图,也没有使用意图过滤器。我认为除了系统偏好之外,没有本机应用程序可以打开它。

      此外,本机时钟应用程序在不同的手机上不可用,甚至根本不可用。这甚至超出了 SDK 版本控制。所以真的没有(好的)方法让你打开。

      您最好的出路是在 source.android.com 上提交一个补丁,为时钟应用程序提供一个意图过滤器,然后在 http://www.openintents.org/en/intentstable 上注册意图。至少你的应用可以在一部分设备上运行,而在其他设备上完全失败(也就是说找不到这样的应用来处理意图)。

      【讨论】:

        【解决方案7】:

        frusso 答案的小补充。要在 Google Galaxy Nexus 手机上启动闹钟:

        {"Standar Alarm Clock2", "com.google.android.deskclock", "com.android.deskclock.AlarmClock"},
        

        在其他情况下将启动时钟应用程序而不是闹钟

        【讨论】:

        • 为了找到这个答案,我已经在 OASP 中游弋了好几个小时。一旦我找到它,我就回到这里发布勘误表,但它已经在那里了!只是我的运气 :)。还是谢谢!
        • 这应该是评论(或版本),而不是答案。
        【解决方案8】:

        你可以添加

        { "Sony Ericsson Xperia Z", "com.sonyericsson.organizer", "com.sonyericsson.organizer.Organizer_WorldClock" }
        

        回答支持新的 Xperia 手机。

        【讨论】:

        • 这应该是评论(或版本),而不是答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        相关资源
        最近更新 更多