La intención de iniciar la aplicación de reloj en Android

Estoy enfrentando un problema con un widget de reloj que hice. Quiero que el usuario toque el reloj y ejecute la aplicación de reloj en el teléfono. este es el código:

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

Hice lo anterior, así que cuando toco el reloj, se abre la configuración de la alarma. Pero no es universal. Descubrí que en droides con 2.2 no funciona. Debe haber una solución mejor que crear una statement if para cada sabor de teléfono Android en el mundo. Además, no sé los nombres de los paquetes para todos. Alguien sabe cómo superar esto, por favor ayuda.

Este código funciona para mi widget de reloj.

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

De esta manera, puedo ejecutar un administrador de reloj predeterminado.

Para dar seguimiento a la respuesta de Mayra, la clase android.provider.AlarmClock tiene la Intent adecuada para esto, pero está disponible solo en API nivel 9 y superior . (¡Al menos alguien en Google escucha solicitudes como esta!)

Para iniciar la aplicación de reloj desde su widget, el siguiente código funciona:

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

También necesitas este permiso:

La forma correcta de comenzar una actividad fuera de su aplicación es usar un propósito implícito. Con una intención implícita, no debe proporcionar una clase específica para comenzar, sino que especifica una acción sobre la que otras aplicaciones pueden optar.

Esto es para evitar roturas en su aplicación cuando el creador de la otra aplicación decide cambiar el nombre de su clase, o algo así. Además, permite que múltiples aplicaciones respondan a la misma acción.

Ver intents y filtros de intención para más detalles sobre intenciones implícitas.

Lamentablemente, necesita que los desarrolladores de aplicaciones acuerden implementar una acción en particular para que esto funcione. Si las aplicaciones de reloj no tienen esto, entonces no hay una buena manera de lograr lo que quieres.

Sugeriría que no se intente crear una statement de if enorme como la que tiene, ya que la aplicación podría ser diferente no solo con diferentes versiones de sdk, sino también con diferentes teléfonos, ya que los fabricantes de teléfonos pueden elegir reemplazar las aplicaciones. Por lo tanto, su aplicación se romperá constantemente en los teléfonos nuevos, si confía en poder abrir la aplicación de reloj.

@Mayra tiene razón. Ese es el camino. Sin embargo, la aplicación de reloj nativo no tiene un bash registrado y no está utilizando un filtro de intención. No creo que haya una aplicación nativa, aparte de las preferencias del sistema, que la abre.

Además, la aplicación de reloj nativo no está disponible en la misma forma, o incluso no está disponible, en diferentes teléfonos. Esto es incluso más allá de las versiones de SDK. Entonces realmente no hay una (buena) manera de que enciendas ninguno.

Su mejor salida es enviar un parche en source.android.com que proporcione a la aplicación de reloj un filtro de intención y luego registrar el bash en http://www.openintents.org/en/intentstable . Al menos entonces su aplicación funciona en un subconjunto de dispositivos y falla limpiamente en otros (diciendo que no se puede encontrar esa aplicación para manejar el bash).

Pequeña adición para frusso respuesta. Para iniciar Alarm Clock en teléfonos con Google Galaxy Nexus:

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

en otros casos se lanzará la aplicación Clock en lugar de Alarm Clock

Desde el nivel 19 de api, puede usar esto para mostrar la lista de alarmas en la aplicación de reloj predeterminada:

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

Código:

  Intent i = new Intent(AlarmClock.ACTION_SET_ALARM); i.putExtra(AlarmClock.EXTRA_MESSAGE, "Alarm Title"); ArrayList 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); 

Permiso:

  

Puedes añadir

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

para responder frusso para admitir nuevos teléfonos Xperia.