我正面临着制作时钟小部件的问题。我希望用户触摸时钟并在手机上启动时钟应用程序。这是代码:
//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上的机器人不起作用。必须有一个比为世界上每个Android手机风格创建一个if语句更好的解决方案。另外,我不知道所有人的包裹名称。 任何人都知道如何克服这个请求帮助。
答案 0 :(得分:40)
此代码适用于我的时钟小部件。
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
// ....
}
通过这种方式,我可以运行默认的时钟管理器。
答案 1 :(得分:14)
为了跟进Mayra的回答,班级android.provider.AlarmClock
具有适当的Intent
,但只有API级别9及以上才能使用。 (至少有人在谷歌听取这样的请求!)
要从您的小部件启动时钟应用程序,以下代码可以正常运行:
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"/>
答案 2 :(得分:4)
在应用程序之外启动活动的正确方法是使用Implicit intent。使用隐式意图,您不会提供要启动的特定类,而是指定其他应用可以选择操作的操作。
这是为了防止当其他应用的创建者决定重命名他们的类或某些应用时,您的应用中断。此外,它允许多个应用响应相同的操作。
有关隐式意图的详细信息,请参阅intents and intent filters。
不幸的是,您需要应用程序开发人员同意所有实现特定操作才能使其正常工作。如果时钟应用程序没有这个,那么没有好的方法来完成你想要的。
我建议不要尝试像你一样创建一个巨大的if语句,因为应用程序不仅可以与不同的sdk版本不同,而且可以与不同的手机不同,因为手机制造商可以选择替换应用程序。因此,如果您依赖能够打开时钟应用程序,您的应用程序将不断打破新手机。
答案 3 :(得分:1)
@Mayra是对的。就是这样。但是,本机时钟应用程序没有注册的意图,也没有使用意图过滤器。我认为除了系统首选项之外,还有一个本机应用程序可以打开它。
此外,本机时钟应用程序在不同的手机上不能以相同的形式提供,甚至根本不可用。这甚至超出了SDK版本。因此,没有(好的)方法可以打开。
最好的方法是在source.android.com上提交一个补丁,为时钟应用程序提供一个intent过滤器,然后在http://www.openintents.org/en/intentstable上注册intent。至少那时你的应用程序在一部分设备上运行,并且在其他设备上干净利落(说没有找到这样的应用程序来处理意图)。
答案 4 :(得分:1)
frusso 答案的少量添加。在Google Galaxy Nexus手机上启动闹钟:
{"Standar Alarm Clock2", "com.google.android.deskclock", "com.android.deskclock.AlarmClock"},
在其他情况下将启动时钟应用而不是闹钟
答案 5 :(得分:1)
从api level 19,您可以使用它来显示默认时钟应用程序上的警报列表:
Intent mClockIntent = new Intent(AlarmClock.ACTION_SHOW_ALARMS);
mClockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(mClockIntent);
答案 6 :(得分:1)
代码:
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" />
答案 7 :(得分:-2)
您可以添加
{ "Sony Ericsson Xperia Z", "com.sonyericsson.organizer", "com.sonyericsson.organizer.Organizer_WorldClock" }
对支持新Xperia手机的回答。