Ответ 1
Давайте посмотрим на строки android.os.Build. Я не уверен, что люди HTC используют комбинацию для обозначения устройства HTC.
Можно ли каким-то образом определить, работает ли мое приложение на HTC Sense?
В более общем плане проблема заключается в том, что у меня есть кнопка с настраиваемым пользователем. Это очень похоже на переключатель учетных записей в правом верхнем углу приложения Gmail. При нажатии или фокусировке кнопка имеет оранжевую подсветку. Но это плохо выглядит на HTC Sense, потому что стандартный цвет подсветки зеленый.
Давайте посмотрим на строки android.os.Build. Я не уверен, что люди HTC используют комбинацию для обозначения устройства HTC.
Код ниже (от пользователя: David):
private static final String SENSE_UI_LAUNCHER_NAME =
"com.htc.launcher.Launcher";
private static Boolean senseUI;
public static final boolean isSenseUI(Context context) {
if (senseUI == null) {
senseUI = false;
PackageManager packageManager = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> list = packageManager.queryIntentActivities(
intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo info : list) {
if (info.activityInfo != null
&& SENSE_UI_LAUNCHER_NAME
.equals(info.activityInfo.name)) {
senseUI = true;
break;
}
}
}
return senseUI;
}
Я думаю, что Android предоставил вам лучший способ решить эту проблему, чем сделать проверку на Sense, и она будет работать для каждого производителя устройства. HTC не единственный, кто изменил цвета на селекторах. Я думаю, что Sony Ericsson имеет прозрачный белый/синий, Motorola изменила его на красный в своем пользовательском интерфейсе MotoBlur, и Garmin-Asus изменил его на синий, чтобы назвать несколько.
Что вы должны сделать, это переопределить атрибут android:background
на вашей кнопке изображения и использовать собственный вариант, вместо того чтобы полагаться на фреймворк
вытяжка. Если вы еще не знакомы с ними, вы, вероятно, также захотите взглянуть на "Селекторы" при создании своего настраиваемого фона, поэтому вы все равно получаете нажатые/выбранные/не выбранные цветовые сигналы.
Если у вас есть несколько кнопок, на которые вы хотите сделать это, вы можете использовать стили и темы, чтобы помочь в этом. Двумя основными местами, которые вы хотите использовать в документации для Android, являются " Применение стилей и тем" и " Ресурсы стилей"
Надеюсь, что это поможет!
Вы можете попытаться найти приложение HTC/Sense, основанное на структуре Rosie, и его нельзя удалить, или, может быть, сама инфраструктура Rosie будет достаточно. Этот поток показывает, как получить список установленных приложений.
Я думаю, что следует придерживаться следующего подхода: мы определяем android:background
, что-то вроде
<?xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/pressed_application_background" />
<item android:state_focused="true" android:state_window_focused="true" android:drawable="@drawable/focused_application_background" />
<item android:state_focused="true" android:state_window_focused="false" android:drawable="@android:color/transparent" />
</selector>
Но здесь мы должны ссылаться на некоторые стандартные ресурсы, а не на изображения нашего приложения. Просто нужно выяснить, какие идентификаторы у них есть.
Это немного поздно, но я думаю, что это решение может работать на некоторых случаях.
Я попытался использовать Build.MANUFACTURER, чтобы проверить, является ли это устройством HTC. Это решение не работает на некоторых устройствах, и мы можем гарантировать, что эти устройства работают Sense в любом случае
Если вы заметили, вы можете увидеть, что Play Store необходимо проверить, какие функции доступны на телефоне для отображения правильных приложений, а HTC Sense - одна из функций!
Чтобы получить все доступные функции:
public FeatureInfo[] getSystemAvailableFeatures(Context context) {
FeatureInfo[] features = context.getPackageManager().getSystemAvailableFeatures();
for (FeatureInfo f : features) {
Log.d("Features", "feature " + f.name);
}
return features;
}
Это вернет что-то вроде этого:
com.example D/Features﹕ Feature android.hardware.wifi
com.example D/Features﹕ Feature android.hardware.location.network
com.example D/Features﹕ Feature com.sec.android.mdm
com.example D/Features﹕ Feature android.hardware.location
com.example D/Features﹕ Feature android.hardware.sensor.gyroscope
com.example D/Features﹕ Feature android.hardware.screen.landscape
com.example D/Features﹕ Feature com.htc.software.Sense5.0
Обратите внимание на последнюю строку! Вы можете использовать его для проверки версии HTC версии
Надеюсь, что это поможет