目录
2:Framework(SysteimUI) Android在状态栏增加耳机拔插图标
6:【audio】【底噪】【功放延迟关闭问题】如何解决在关闭喇叭后喇叭还是有几秒底噪问题?
7:【audio】【usb】【UAC】如何在高通平台关闭usb audio驱动功能?
11:【Android】在SElinux下 如何获得对一个内核节点的访问权限
17:Android framework 修改系统声音最大值默认值以及系统亮度默认值最大值位置
21:Android 系统增加默认属性 Settings.System.putInt
21:Android 系统USER版本去掉 USB插入调试确认框
28:高通SPI屏视频播放RGB红蓝颜色反了,在电脑播放正常
31: android5.1-7.1- 8.1 电话接通成功并广播
1:修改开机logo
修改开机logo有两种方法,一种直接去改c语言代码,第二种替换图片用python生成splash。第一种方法我没试过,感觉挺麻烦的,还有分辨率限制,超过多少分辨率就不能用第一种方法。
- 修改的文件路径LINUX/android/bootable/bootloader/lk/splash
- 准备好logo图片(png、bmp格式)
- 查看中原图片的分辨率,修改logo图片 保证 分辨率 一致
- 生成splash.img镜像文件
注:图片分辨率很重要!很重要!很重要!
生成splash.img 步骤
The steps to generate a splash.img:
1 sudo apt-get install python-imaging
2 python ./logo_gen.py boot_001.png (*.bmp)
为了减少编译时间可以直接将生成好的splash.img将刷机包中的文件替换掉。
2:Framework(SysteimUI) Android在状态栏增加耳机拔插图标
Android 4.1在拔插耳机时,状态栏没有提示图标。最近做了这个新的需求,步骤如下:
1、在\frameworks\base\packages\SystemUI\res\drawable-Xdpi下增加一个耳机图片stat_sys_headset.png。drawable-Xdpi中的X根据手机的分辨率来确定,我的手机用的是drawable-hdpi;
2、在\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarPolicy.java中增加下面的代码:
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
updateAlarm(intent);
}
else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
updateSyncState(intent);
}
else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
updateBluetooth(intent);
}
/*add code for adding headset icon in statusbar.*/
else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
updateHeadsetState(intent);
}
//end
else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {
updateVolume();
}
else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
updateSimState(intent);
}
else if (action.equals(TtyIntent.TTY_ENABLED_CHANGE_ACTION)) {
updateTTY(intent);
} else if (action.equals(Intent.ACTION_LOCALE_CHANGED)) {
// when acceptting the locale change event,reload USB connection notification.
boolean isUsbConnected = mStorageManager.isUsbMassStorageConnected();
mStorageNotification.onUsbMassStorageConnectionChanged(isUsbConnected);
}
}
};
public PhoneStatusBarPolicy(Context context) {
mContext = context;
// init StorageNotification object
mStorageNotification = new StorageNotification(mContext);
mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
// listen for broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_ALARM_CHANGED);
filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
/*add code for adding headset icon in statusbar.*/
filter.addAction(Intent.ACTION_HEADSET_PLUG);
//end
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
filter.addAction(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
// add locale change event filter
filter.addAction(Intent.ACTION_LOCALE_CHANGED);
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
int numPhones = MSimTelephonyManager.getDefault().getPhoneCount();
mSimState = new IccCard.State[numPhones];
for (int i=0; i < numPhones; i++) {
mSimState[i] = IccCard.State.READY;
}
// storage
mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
mStorageManager.registerListener(mStorageNotification);
// TTY status
mService.setIcon("tty", R.drawable.stat_sys_tty_mode, 0, null);
mService.setIconVisibility("tty", false);
// Cdma Roaming Indicator, ERI
mService.setIcon("cdma_eri", R.drawable.stat_sys_roaming_cdma_0, 0, null);
mService.setIconVisibility("cdma_eri", false);
// bluetooth status
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
int bluetoothIcon = R.drawable.stat_sys_data_bluetooth;
if (adapter != null) {
mBluetoothEnabled = (adapter.getState() == BluetoothAdapter.STATE_ON);
if (adapter.getConnectionState() == BluetoothAdapter.STATE_CONNECTED) {
bluetoothIcon = R.drawable.stat_sys_data_bluetooth_connected;
}
}
mService.setIcon("bluetooth", bluetoothIcon, 0, null);
mService.setIconVisibility("bluetooth", mBluetoothEnabled);
/*add code for adding headset icon in statusbar.*/
mService.setIcon("headset", R.drawable.stat_sys_headset, 0, null);
mService.setIconVisibility("headset", false);
//end
// Alarm clock
mService.setIcon("alarm_clock", R.drawable.stat_sys_alarm, 0, null);
mService.setIconVisibility("alarm_clock", false);
// Sync state
mService.setIcon("sync_active", R.drawable.stat_sys_sync, 0, null);
mService.setIcon("sync_failing", R.drawable.stat_sys_sync_error, 0, null);
mService.setIconVisibility("sync_active", false);
mService.setIconVisibility("sync_failing", false);
// volume
mService.setIcon("volume", R.drawable.stat_sys_ringer_silent, 0, null);
mService.setIconVisibility("volume", false);
updateVolume();
}
/*add code for adding headset icon in statusbar.*/
private final void updateHeadsetState(Intent intent) {
boolean mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1);
Slog.v(TAG, "updateHeadsetState: HeadsetState: " + mIsHeadsetOn);
mService.setIconVisibility("headset", mIsHeadsetOn);
}
在\frameworks\base\core\res\res\values\config.xml中加入耳机图标控制字段(headset):
<string-array name="config_statusBarIcons">
<item><xliff:g id="id">ime</xliff:g></item>
<item><xliff:g id="id">sync_failing</xliff:g></item>
<item><xliff:g id="id">sync_active</xliff:g></item>
<item><xliff:g id="id">gps</xliff:g></item>
<item><xliff:g id="id">bluetooth</xliff:g></item>
<item><xliff:g id="id">nfc</xliff:g></item>
<item><xliff:g id="id">tty</xliff:g></item>
<item><xliff:g id="id">speakerphone</xliff:g></item>
<item><xliff:g id="id">mute</xliff:g></item>
<item><xliff:g id="id">volume</xliff:g></item>
<item><xliff:g id="id">wifi</xliff:g></item>
<item><xliff:g id="id">cdma_eri</xliff:g></item>
<item><xliff:g id="id">phone_signal_second_sub</xliff:g></item>
<item><xliff:g id="id">data_connection</xliff:g></item>
<item><xliff:g id="id">phone_evdo_signal</xliff:g></item>
<item><xliff:g id="id">phone_signal</xliff:g></item>
<item><xliff:g id="id">battery</xliff:g></item>
<item><xliff:g id="id">alarm_clock</xliff:g></item>
<item><xliff:g id="id">secure</xliff:g></item>
<item><xliff:g id="id">clock</xliff:g></item>
<item><xliff:g id="id">headset</xliff:g></item>
</string-array>
因为所加代码中的 mService.setIcon和mService.setIconVisibility最终会调用到StatusBarManagerService,它的构造函数有mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons));语句,找到config_statusBarIcons所在的配置文件为config.xml。如果没加,会再seticon(StatusBarManagerService类里)函数里
3:Android--隐藏状态栏图标
目前状态栏图标有通知图标和系统图标
通知图标主要是指各应用发过来的通知,比如未接电话,截图,后台播放音乐等,系统图标主要有蓝牙,耳机,wifi,数据流量,时间和电池...
1,不显示通知图标,
在/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java中
public void updateNotificationIcons {
for (int i = 0; i < N; i++) {
NotificationData.Entry ent = activeNotifications.get(i);
+ final String pkg = ent.notification.getPackageName();
+ android.util.Log.d("StatusBarIconController","pkg========"+pkg);
//比如如果包名不是收音机的,就不显示图标
+ if (!pkg.contains("com.android.fmradio")) {
+ continue;
}
if (notificationData.isAmbient(ent.key)
&& !NotificationData.showNotificationEvenIfUnprovisioned(ent.notification)) {
continue;
}
}
2.不显示系统图标,系统图标的显示是在以下文件,比如蓝牙,wifi,耳机等
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/
PhoneStatusBarPolicy.java
将不要显示图标,将setIconVisibility()改为false即可,比如,如果不要闹钟图标
private void updateAlarm() {
....
- - - mService.setIconVisibility(SLOT_ALARM_CLOCK, mCurrentUserSetup && hasAlarm);
+++ mService.setIconVisibility(SLOT_ALARM_CLOCK, false);
}
3,系统图标中比较特殊的时间和电池在
/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:singleLine="true"
android:paddingStart="7dp"
android:gravity="center_vertical|start"
+++ android:visibility="gone" //时间
/>
/frameworks/base/packages/SystemUI/res/layout/system_icons.xml
<com.android.systemui.BatteryMeterView android:id="@+id/battery"
android:layout_height="14.5dp"
android:layout_width="9.5dp"
+++ android:visibility="gone" 电池
android:layout_marginBottom="@dimen/battery_margin_bottom"/>
4:android 5.1 usb调试默认关闭设置方法
packages/apps/Provision/src/com/android/provision/DefaultActivity.java
在该文件中加入下面的代码:
if (!android.os.SystemProperties.getBoolean("ro.inet.adb_enabled",true)) {
Settings.Secure.putInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0);
}
同时在system.prop中添加:
ro.inet.adb_enabled=false
5:【Audio】【音量曲线】【响度】如何修改音量曲线?
对应场景可能是: 当把媒体音量调到最小一级时,喇叭/耳机音量仍然很大,如何解决? |
如图1所示:
1. 音量曲线是通过四个点绘制而成,点(x,y)坐标中,x取值范围是0->100以内的整数,y是-100->0以内的有一位小数的任意数值,并且随着x数值的增大,y也增大,也就是说该曲线是递增曲线。
2. y数值与具体增益值线性相关。但其实真正增益amplification与y数值具体对应关系如下代码所描述:
安卓7/8/9配置修改位置为:
frameworks/av/services/audiopolicy/config/ default_volume_tables.xml
如喇叭音量曲线可以修改以下代码段:
<!-- Default is Speaker Media Volume Curve -->
<point>1,-3000</point>
<point>33,-2200</point>
<point>66,-1200</point>
<point>100,0</point>
</reference>
如图1所示:
1. 音量曲线是通过四个点绘制而成,点(x,y)坐标中,x取值范围是0->100以内的整数,y是-100->0以内的有一位小数的任意数值,并且随着x数值的增大,y也增大,也就是说该曲线是递增曲线。
2. y数值与具体增益值线性相关。但其实真正增益amplification与y数值具体对应关系如下代码所描述:
安卓7/8/9配置修改位置为:
frameworks/av/services/audiopolicy/config/ default_volume_tables.xml
如喇叭音量曲线可以修改以下代码段:
<!-- Default is Speaker Media Volume Curve -->
<point>1,-3000</point>
<point>33,-2200</point>
<point>66