意图在android上启动时钟应用程序

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

//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版本的机器人不起作用。 必须有一个更好的解决scheme,比创build一个if语句为每个Android手机的味道,我的世界。 另外,我不知道所有的软件包名称。 任何人都知道如何克服这一点,请帮助。

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

 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 // .... } 

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

为了跟踪Mayra的答案,类android.provider.AlarmClock具有适当的Intent ,但它只能在API级别9和以上 。 (至lessGoogle的某个人倾听这样的请求!)

要从您的小部件启动时钟应用程序,以下代码工作:

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

你也需要这个权限:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>

在应用程序之外启动一个活动的正确方法是使用一个Implicit intent。 有了一个隐含的意图,你不提供一个特定的类来启动,而是指定一个其他应用程序可以select执行的操作。

这是为了防止其他应用程序的创build者决定重命名他们的类或其他类的应用程序的破坏。 此外,它允许多个应用程序响应相同的操作。

有关隐式意图的更多详细信息,请参阅intent和intentfilter 。

不幸的是,你需要应用程序开发者同意所有的实施一个特定的行动,以便这个工作。 如果时钟应用程序没有这个,那么没有什么好方法来实现你想要的。

我会build议不要试图创build一个像你一样的巨大的声明,因为应用程序可能会不同,不同的SDK版本,但不同的手机,因为手机制造商可以select更换应用程序。 因此,如果您依靠打开时钟应用程序,您的应用程序将不断打破新手机。

@Mayra是对的。 就是这样。 然而,本地时钟应用程序没有注册的意图,并没有使用意图filter。 我不认为有一个本地应用程序,而不是系统首选项,打开它。

此外,本地时钟应用程序在相同的表格中不可用,或者根本不能在不同的电话上使用。 这甚至超出了SDK版本。 所以真的没有(好)的方法让你打开。

你最好的办法是在source.android.com上提交一个补丁,给时钟应用程序一个意图filter,然后在http://www.openintents.org/en/intentstable上注册这个意图。; 至less你的应用程序工作在一个设备子集上,并且干脆地对其他人失败(说没有这样的应用程序可以处理这个意图)。

frusso答案的小增加。 在Google Galaxy Nexus手机上启动闹钟:

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

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

从api级别19,你可以使用这个来显示默认时钟应用程序的闹钟列表:

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

码:

  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" /> 

你可以加

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

到frusso回答支持新的Xperia手机。