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