Подтвердить что ты не робот

Намерение запустить приложение часов на Android

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Чтобы следить за ответом Майры, класс 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"/>

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

С 19-го уровня api вы можете использовать это, чтобы отображать список тревог в приложении часов по умолчанию:

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

Ответ 7

код:

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

Ответ 8

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

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

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