Добавляем мультимедийные кнопки в navbar/навбар

Данная инструкция понадобится тем, кто использует планшет в автомобиле как carpc. Себе я поставил Nexus 7 2012 3G. Прошивок для него много, аж начиная с андроид 4.2 до 7.1 на момент написания данной инструкции. Но заточенных именно для carpc имеется только 2 прошивки, которые у меня через некоторое время начинали глючить.


В связи с этим решил установить стоковую прошивку на андроид 5.1. Но, т.к. привык к мультимедийным кнопкам в навбаре решил сделать их и на стоковой прошивке. Инструкции как это сделать я не нашел, но нашел готовые патчи для Nexus 7 2013 и посмотрев как автор это сделал попробовал и у себя.

На android 5.1 Lollipop

Думаю можно попробовать по инструкции для 6.0

- Декомпилируем \system\priv-app\SystemUI\SystemUI.apk
- Копируем следующие изображения в папку \res\drawable-sw600dp-hdpi-v13 (-v13 может и не быть, зависит от инструмента декомпиляции)
- В файле \res\layout\heads_up.xml заменить
  • "@integer/notification_panel_layout_gravity"
на
  • "fill_horizontal|center|top"
- В файле \res\layout\keyguard_glow_pad_view.xml заменить
  • "@integer/kg_selector_gravity"
на
  • "center|left|top|clip_horizontal"
- В файле \res\layout\status_bar_expanded.xml заменить в трех местах
  • "@integer/notification_panel_layout_gravity"
на
  • "fill_horizontal|center|top"
- В файле \res\layout\status_bar_expanded_header.xml заменить
  • "@integer/notification_panel_layout_gravity"
на
  • "fill_horizontal|center|top"
- В файле \res\layout\super_status_bar.xml заменить
  • "@integer/notification_panel_layout_gravity"
на
  • "fill_horizontal|center|top"
 - Файл \res\layout-sw600dp-v13\navigation_bar.xml приводим к следующему виду (синие строки - добавить, красные - изменить)
  • <?xml version="1.0" encoding="utf-8"?>
  • <com.android.systemui.statusbar.phone.NavigationBarView android:background="@drawable/system_bar_background" android:layout_width="fill_parent" android:layout_height="fill_parent"
  • xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res-auto">
  • <FrameLayout android:id="@id/rot0" android:layout_width="fill_parent" android:layout_height="fill_parent">
  •  <LinearLayout android:orientation="horizontal" android:id="@id/nav_buttons" android:clipChildren="false" android:clipToPadding="false" android:layout_width="fill_parent" android:layout_height="fill_parent" android:animateLayoutChanges="true">
  •  <View android:visibility="invisible" android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="fill_parent" android:layout_weight="0.0" android:layout_marginStart="2.0dip" />
  •  <Space android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/prev" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_prev" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_prev_track" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="88" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/play" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_play" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_play_track" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="85" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/next" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_next" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_next_track" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="87" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/back" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_back" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_back" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="4" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/home" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_home" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_home" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="3" systemui:keyRepeat="true" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/recent_apps" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_recent" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_recent" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/volmute" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_mute" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_volume_mute" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="164" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/voldown" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_voldown" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_volume_down" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="25" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/volup" android:layout_width="55.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_volup" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_volume_up" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="24" />
  •  <Space android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
  •  <FrameLayout android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="fill_parent" android:layout_weight="0.0" android:layout_marginEnd="2.0dip">
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/menu" android:visibility="invisible" android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_menu" android:scaleType="centerInside" android:contentDescription="@string/accessibility_menu" android:layout_marginEnd="2.0dip" systemui:keyCode="82" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/ime_switcher" android:visibility="invisible" android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="fill_parent" android:src="/@drawable/ic_ime_switcher_default" android:scaleType="centerInside" android:contentDescription="@string/accessibility_ime_switch_button" android:layout_marginEnd="2.0dip" />
  •  </FrameLayout>
  •  </LinearLayout>
  •  <LinearLayout android:orientation="horizontal" android:id="@id/lights_out" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="fill_parent">
  •  <Space android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_small" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" android:layout_marginStart="5.0dip" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="128.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_small" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" android:layout_marginEnd="5.0dip" />
  •  <Space android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
  •  </LinearLayout>
  •  <com.android.systemui.statusbar.policy.DeadZone android:layout_gravity="top" android:id="@id/deadzone" android:layout_width="fill_parent" android:layout_height="fill_parent" systemui:minSize="@dimen/navigation_bar_deadzone_size" systemui:maxSize="@dimen/navigation_bar_deadzone_size_max" systemui:holdTime="@integer/navigation_bar_deadzone_hold" systemui:decayTime="@integer/navigation_bar_deadzone_decay" systemui:orientation="horizontal" />
  •  </FrameLayout>
  •  <FrameLayout android:id="@id/rot90" android:paddingTop="0.0dip" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="fill_parent">
  •  <LinearLayout android:orientation="horizontal" android:id="@id/nav_buttons" android:clipChildren="false" android:clipToPadding="false" android:layout_width="fill_parent" android:layout_height="fill_parent" android:animateLayoutChanges="true">
  •  <View android:visibility="invisible" android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="fill_parent" android:layout_weight="0.0" android:layout_marginStart="2.0dip" />
  •  <Space android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/prev" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_prev" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_prev_track" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="88" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/play" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_play" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_play_track" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="85" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/next" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_next" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_next_track" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="87" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/back" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_back" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_back" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="4" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/home" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_home" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_home" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="3" systemui:keyRepeat="true" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/recent_apps" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_recent" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_recent" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/volmute" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_mute" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_volume_mute" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="164" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/voldown" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_voldown" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_volume_down" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="25" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/volup" android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_volup" android:scaleType="center" android:layout_weight="0.0" android:contentDescription="@string/accessibility_volume_up" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" systemui:keyCode="24" />
  •  <Space android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
  •  <FrameLayout android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="fill_parent" android:layout_weight="0.0" android:layout_marginEnd="2.0dip">
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/menu" android:visibility="invisible" android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_menu" android:scaleType="centerInside" android:contentDescription="@string/accessibility_menu" android:layout_marginEnd="2.0dip" systemui:keyCode="82" />
  •  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/ime_switcher" android:visibility="invisible" android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="fill_parent" android:src="/@drawable/ic_ime_switcher_default" android:scaleType="centerInside" android:contentDescription="@string/accessibility_ime_switch_button" android:layout_marginEnd="2.0dip" />
  •  </FrameLayout>
  •  </LinearLayout>
  •  <LinearLayout android:orientation="horizontal" android:id="@id/lights_out" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="fill_parent">
  •  <Space android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_small" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" android:layout_marginStart="5.0dip" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_large" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" />
  •  <ImageView android:layout_width="95.0dip" android:layout_height="fill_parent" android:src="/@drawable/ic_sysbar_lights_out_dot_small" android:scaleType="center" android:layout_weight="0.0" android:paddingStart="25.0dip" android:paddingEnd="25.0dip" android:layout_marginEnd="5.0dip" />
  •  <Space android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
  •  </LinearLayout>
  •  <com.android.systemui.statusbar.policy.DeadZone android:layout_gravity="top" android:id="@id/deadzone" android:layout_width="fill_parent" android:layout_height="fill_parent" systemui:minSize="@dimen/navigation_bar_deadzone_size" systemui:maxSize="@dimen/navigation_bar_deadzone_size_max" systemui:holdTime="@integer/navigation_bar_deadzone_hold" systemui:decayTime="@integer/navigation_bar_deadzone_decay" systemui:orientation="vertical" />
  •  </FrameLayout>
  • </com.android.systemui.statusbar.phone.NavigationBarView>
- В конце файла \res\values\ids.xml добавить следующие строки
  • <item type="id" name="volup">false</item>
  •  <item type="id" name="volmute">false</item>
  •  <item type="id" name="voldown">false</item>
  •  <item type="id" name="prev">false</item>
  •  <item type="id" name="play">false</item>
  •  <item type="id" name="next">false</item>
- В конце файла \res\values\strings.xml добавить следующие строки
  • <string name="accessibility_prev_track">Previous track.</string>
  •  <string name="accessibility_play_track">Play track.</string>
  •  <string name="accessibility_next_track">Next track.</string>
  •  <string name="accessibility_volume_mute">Mute volume.</string>
  •  <string name="accessibility_volume_down">Increase volume.</string>
  •  <string name="accessibility_volume_up">Decrease volume.</string>
Компилируем SystemUI.apk и заменяем в системе.
Готовый патч под TWRP для Nexus 7 2012 под android 5.1 LMY47V

На android 6.0

- декомпилируем \system\priv-app\SystemUI\SystemUI.apk
- копируем следующие изображения в папку \res\drawable-sw600dp-hdpi-v13 (-v13 может и не быть, зависит от инструмента декомпиляции)
- в файле \res\layout-sw600dp-v13\navigation_bar.xml редактируем так
- в \res\values\ids.xml добавить
  •  <item type="id" name="volup">false</item>
  •  <item type="id" name="volmute">false</item>
  •  <item type="id" name="voldown">false</item>
  •  <item type="id" name="prev">false</item>
  •  <item type="id" name="play">false</item>
  •  <item type="id" name="next">false</item>
- в \res\values\strings.xml добавить
  •  <string name="accessibility_prev_track">Previous track.</string>
  •  <string name="accessibility_play_track">Play track.</string>
  •  <string name="accessibility_next_track">Next track.</string>
  •  <string name="accessibility_volume_mute">Mute volume.</string>
  •  <string name="accessibility_volume_down">Increase volume.</string>
  •  <string name="accessibility_volume_up">Decrease volume.</string>
Компилируем SystemUI.apk и заменяем в системе.

На android 7.X

Просто устанавливаем приложение Custom Navigation Bar и через него добавляем/настраиваем кнопки

либо проделываем так
- декомпилируем \system\priv-app\SystemUI\SystemUI.apk
- в файле \res\xml\tuner_prefs.xml перед (либо в любом удобном для вас месте)
  •  <Preference android:title="@string/other" android:key="other" android:fragment="com.android.systemui.tuner.OtherPrefs" />
добавить
  •  <Preference android:title="@string/nav_bar" android:key="sysui_nav_bar" android:fragment="com.android.systemui.tuner.NavBarTuner" />
Компилируем SystemUI.apk и заменяем в системе.
Открываем шторку, жмем шестеренку (настройки) 5-7 секунд и отпускаем. Откроется настройки. В самом конце появится пункт "System UI Tuner". Заходим в панель навигации и добавляем/изменяем кнопки.

P.S. кто хочет изменить высоту навбара, сделать следующее:
- декомпилируем \system\framework\framework-res.apk
- в файле \res\values\dimens.xml значение на
  • navigation_bar_height_landscape
изменить к примеру из 48 на 36.
Компилируем framework-res.apk и заменяем в системе.

Будет выглядеть так

Комментарии

  1. Этот комментарий был удален администратором блога.

    ОтветитьУдалить

Отправить комментарий