L'intention de lancer l'application horloge sur android

je suis confronté à un problème avec un widget d'horloge que j'ai fait. Je veux que l'utilisateur de toucher l'horloge et le lancement de l'application horloge sur le téléphone. c'est le code:

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

j'ai fait le ci-dessus pour que quand je touche l'horloge ouvre les réglages de l'alarme. Mais n'est pas universelle. J'ai trouvé que sur les droïdes avec 2.2 ne fonctionne pas. Il doit y avoir une meilleure solution que de créer une déclaration if pour chaque saveur de téléphone android i le monde. En plus, je ne connais pas les noms de paquets pour tous. Quelqu'un sait comment surmonter cette s'il vous plaît aider.

16
demandé sur John 2010-08-28 17:45:27

8 réponses

Ce code fonctionne pour mon widget d'horloge.

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

de cette façon, je peux lancer un gestionnaire d'horloge par défaut.

40
répondu frusso 2015-08-12 00:31:11

pour donner suite à la réponse de Mayra, la classe android.provider.AlarmClock a le bon Intent pour cela, mais il est disponible à seulement à l'API de niveau 9 et au-dessus de. (Au moins Quelqu'un de Google écoute ce genre de demande!)

Pour lancer l'application horloge de votre widget le code suivant fonctionne:

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

Vous avez aussi besoin de cette autorisation:

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

12
répondu resnbl 2014-02-27 19:39:50

La bonne façon de commencer une activité en dehors de votre application est d'utiliser une intention Implicite. Avec une intention implicite vous ne fournissez pas une classe spécifique pour commencer, au lieu de spécifier une action que d'autres applications peuvent choisir d'agir.

ceci est pour empêcher la rupture dans votre application lorsque le créateur de l'autre application décide de renommer leur classe, ou quelque chose comme ça. De plus, il permet à plusieurs applications de répondre à la même action.

Voir intention et intention filtres pour plus de détails sur les intentions implicites.

malheureusement, vous avez besoin de développeurs d'applications pour accepter de tous mettre en œuvre une action particulière afin que cela fonctionne. Si les applications d'horloge n'ont pas cela, alors il n'y a pas de bonne façon d'accomplir ce que vous voulez.

je suggérerais de ne pas essayer de créer une déclaration si énorme comme vous avez, puisque l'application pourrait être différente non seulement avec différentes versions sdk, mais avec différents téléphones depuis les fabricants de téléphones peut choisir de remplacer des applications. Ainsi, votre application va être constamment briser sur les nouveaux téléphones, si vous comptez sur pour ouvrir l'application horloge.

4
répondu Cheryl Simon 2010-08-28 17:02:03

@Mayra a raison. C'est de cette façon. Cependant, l'application native clock n'a pas d'intention enregistrée et n'utilise pas de filtre d'intention. Je ne pense pas qu'il y ait une application native, autre que les préférences du système, qui l'ouvre.

aussi l'application d'horloge native n'est pas disponible dans la même forme, ou même pas disponible du tout, sur différents téléphones. C'est même au-delà de la version SDK. Donc il n'y a vraiment aucun (bon) moyen pour vous d'allumer soit.

votre meilleure solution est de soumettre un patch sur source.android.com cela donne à l'application de l'horloge un filtre d'intention et ensuite enregistrer l'intention surhttp://www.openintents.org/en/intentstable