Domanda

Sono di fronte a un problema con un orologio widget di che ho fatto. Voglio all'utente di toccare l'orologio e lanciare l'applicazione orologio al telefono. questo è il codice:

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

Ho fatto quanto sopra in modo che il quando tocco l'orologio apre le impostazioni di allarme. Ma non è universale. Ho scoperto che il droidi con 2.2 non funziona. Ci deve essere una soluzione migliore rispetto alla creazione di un'istruzione if per ogni telefono Android i sapori del mondo. Inoltre non DON conosco i nomi dei pacchetti per tutti. Qualcuno sa come superare questo aiuto per favore.

È stato utile?

Soluzione

Questo codice funziona per il mio widget orologio.

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

In questo modo, posso eseguire un gestore di clock di default.

Altri suggerimenti

Per seguire fino alla risposta di Mayra, il android.provider.AlarmClock classe ha la Intent adeguata per questo, ma è disponibile solo a livello di API 9 e sopra . (Almeno qualcuno in Google ascolta domande come questa!)

Per lanciare l'applicazione orologio dai il tuo widget le seguenti opere di codice:

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

È inoltre necessario questa autorizzazione:
     <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>

Il modo corretto per iniziare un esterno di attività della vostra applicazione è quello di utilizzare un intento implicito. Con un implicito intento non si fornisce una classe specifica per iniziare, invece si specifica un'azione che altre applicazioni possono scegliere di agire.

Questo è quello di prevenire la rottura nella vostra app quando il creatore del altra applicazione decide di rinominare la loro classe, o qualcosa del genere. Inoltre, consente a più applicazioni di rispondere alla stessa azione.

intenti e filtri intento per più dettagli su intenti implicite.

Purtroppo, è necessario sviluppatori di app ad accettare di tutto implementare una particolare azione in modo che questo lavoro. Se le applicazioni di clock non hanno questo, allora non c'è buon modo per ottenere ciò che si desidera.

vorrei suggerire contro il tentativo di creare una grande istruzione if come si dispone, dal momento che l'applicazione potrebbe essere diverso, non solo con le diverse versioni di SDK, ma con telefoni diversi dal momento che i produttori di telefoni possono scegliere di sostituire le applicazioni. Così, la vostra applicazione sta per essere costantemente rottura su nuovi telefoni, se ci si basa sul fatto di poter aprire l'applicazione Orologio.

A partire dal livello 19 api è possibile utilizzare questo per mostrare la lista di allarme sul app clock di default:

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

@Mayra è giusto. Questo è il modo. Tuttavia l'applicazione nativa orologio non ha registrato intento e non utilizza un filtro intento. Non credo che ci sia un'applicazione nativa, oltre alle preferenze di sistema, che si apre esso.

Anche l'applicazione nativa di clock non è disponibile nella stessa forma, o addirittura non disponibili a tutti, su telefoni diversi. Questo è ancora al di là del controllo delle versioni SDK. Quindi non c'è davvero (buono) modo per voi di passare su entrambi.

Il tuo miglior via d'uscita è quello di inviare una patch su source.android.com che dà l'applicazione orologio un filtro intento e quindi registrare l'intento su http://www.openintents.org/en/intentstable . Almeno allora la vostra applicazione funziona su un sottoinsieme di dispositivi e non riesce in modo pulito sugli altri (dire di no tale domanda può essere trovato per gestire l'intento).

piccola aggiunta per frusso risposta. Per lanciare Sveglia sui telefoni Google Galaxy Nexus:

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

in altri casi sarà lanciato applicazione Orologio, invece di sveglia

Codice:

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

Il permesso:

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

È possibile aggiungere

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

alla risposta frusso per supportare nuovi telefoni Xperia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top