Намерение запустить приложение часов на Android - PullRequest
16 голосов
/ 28 августа 2010

У меня проблема с виджетом часов, который я сделал.Я хочу, чтобы пользователь коснулся часов и запустил приложение часов на телефоне.это код:

//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 не работает.Должно быть лучшее решение, чем создание оператора if для каждого аромата телефона в мире.Плюс я не знаю названия пакетов для всех.Кто-нибудь знает, как преодолеть это, пожалуйста, помогите.

Ответы [ 8 ]

40 голосов
/ 26 ноября 2010

Этот код работает для моего виджета часов.

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

Таким образом, я могу запустить менеджер часов по умолчанию.

14 голосов
/ 04 марта 2011

Чтобы ответить на вопрос Майры, класс android.provider.AlarmClock имеет для этого Intent, но он доступен только на уровне API 9 и выше .(По крайней мере, кто-то в Google слушает подобные запросы!)

Чтобы запустить приложение часов из вашего виджета, работает следующий код:

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

4 голосов
/ 28 августа 2010

Правильный способ начать действие вне вашего приложения - это использовать неявное намерение. С неявным намерением вы не предоставляете конкретный класс для запуска, вместо этого вы указываете действие, которое другие приложения могут выбрать для действий.

Это необходимо для предотвращения поломки вашего приложения, когда создатель другого приложения решает переименовать свой класс или что-то подобное. Кроме того, он позволяет нескольким приложениям реагировать на одно и то же действие.

См. намерения и фильтры намерений для более подробной информации о неявных намерениях.

К сожалению, вам нужно, чтобы разработчики приложений согласились выполнить все конкретные действия для того, чтобы это работало. Если в приложениях с часами этого нет, то нет хорошего способа выполнить то, что вы хотите.

Я бы посоветовал не пытаться создавать огромное выражение if, как у вас, поскольку приложение может отличаться не только для разных версий SDK, но и для разных телефонов, поскольку производители телефонов могут заменить приложения. Таким образом, ваше приложение будет постоянно ломаться на новых телефонах, если вы полагаетесь на возможность открывать приложение часов.

1 голос
/ 11 июля 2017

Код:

            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" />
1 голос
/ 13 марта 2015

На уровне API 19 вы можете использовать это для отображения списка будильников в приложении часов по умолчанию:

    Intent mClockIntent = new Intent(AlarmClock.ACTION_SHOW_ALARMS);
    mClockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(mClockIntent);
1 голос
/ 26 августа 2012

Небольшое дополнение для frusso ответа. Чтобы запустить Будильник на телефонах Google Galaxy Nexus:

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

в остальных случаях будет запущено приложение Часы вместо Будильника

1 голос
/ 26 сентября 2010

@ Майра права. Это путь. Однако собственное приложение часов не имеет зарегистрированного намерения и не использует фильтр намерений. Я не думаю, что есть собственное приложение, кроме системных настроек, которое открывает его.

Кроме того, приложение родных часов недоступно в одной и той же форме или вообще недоступно на разных телефонах. Это даже за пределами версий SDK. Так что на самом деле нет (хорошего) способа включить вас.

Ваш лучший выход - отправить патч на source.android.com, который дает приложению часов фильтр намерений, а затем зарегистрировать намерение на http://www.openintents.org/en/intentstable. По крайней мере, тогда ваше приложение работает на подмножестве устройств и на других не работает (говоря, что не может быть найдено такое приложение для обработки намерений).

0 голосов
/ 24 ноября 2013

Вы можете добавить

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

ответить на вопрос о поддержке новых телефонов Xperia.

...