MTK SmartPhone Record-(2)

来源:互联网 发布:云服务器限制端口 编辑:程序博客网 时间:2024/05/17 22:10
21. Android来电过程函数调用
1) InCallScreen.java
1.1) 执行handlerMessage()方法,可能是由后台程序触发的。
1.2) 执行onPhoneStateChanged()方法,由1.1)的handlerMessage()方法调用。
1.3) 执行1.1)--1.2)

2) CallNotifier.java
2.1) 执行handlerMessage()方法,可能是由后台程序触发的。
2.2) 执行onNewRingingConnection()方法,由2.1)的handlerMessage()方法调用。
2.3) 再执行startIncomingCallQuery()方法,由2.2)的onNewRingingConnection()方法调用。
2.4) 再执行onQueryComplete()方法。该方法在startIncomingCallQuery()方法中有调用语句,但是根据LogCat呈现的前后顺序,这里的onQueryComplete()并不是由startIncomingCallQuery()方法触发的,可是除此函数为找不到其他触发点。
2.5) 再执行onCustomRingQueryComplete()方法,由2.4)的onQueryComplete()方法调用。

3) InCallScreen.java
3.1) 执行onNewIntent()方法,应该是由后台程序触发。
3.2) 执行onResume()方法,应该是由后台程序触发。
3.3) 再执行isBuletoothAudioConnected()方法,由3.2)的onResume()方法调用。
3.4) 再执行setInCallScreenMode()方法,由3.2)的onResume()方法调用。
3.5) 再执行updateMenuButtonHint()方法,由3.4)的setInCallScreenMode()方法调用。

4) PhoneApp.java
4.1) 执行updateWakeState()方法,由3.2)的onResume()方法调用。

5) InCallScreen.java
5.1) 执行onPhoneStateChanged()方法,应该是由后台程序触发。
5.2) 再执行updateScreen()方法,由5.1)的onPhoneStateChanged()方法调用。

6) CallCard.java
6.1) 执行updateState()方法,由5.2)的updateScreen()方法调用。
6.2) 执行updateRingingCall()方法方法,由6.1)的updateState()方法调用。
6.3) 再执行displayMainCallStatus()方法,由6.2)的updateRingingCall()方法调用。
6.4) 再执行updateCardTitleWidgets()方法,由6.3)的displayMainCallStatus()方法调用。
6.5) 再执行getTitleForCallCard()方法,由6.4)的updateCardTitleWidgets()方法调用。
6.6) 再执行updateDisplayForPerson()方法,由6.3)的displayMainCallStatus()方法调用。
6.7) 再执行updatePhoneForCallState()方法,由6.3)的displayMainCallStatus()方法调用。
6.8) 再执行displayOnHoldCallStatus()方法,由6.2)的updateRingingCall()方法调用。
6.9) 再执行updateOngoingCallStatus()方法,由6.2)的updateRingingCall()方法调用。

7) InCallCard.java
7.1) 执行updateMenuButtonHint()方法,由5.2)的updateScreen()方法调用。

8) PhoneApp.java
8.1) 执行updateWakeState()方法,该方法可能是由以下操作引发的:onResume(),onPause(),onPhoneStateChanged(),onDisconnect(),handleMessage()。

9) InCallCard.java
9.1) 执行handleMessage()方法,我觉得应该是后台触发的。目前还没有找到合理的解释。
9.2) 再执行internalResolveIntent()方法,由9.1)的handleMessage()方法调用。
9.3) 执行onWindowFocusChanged()方法,不知道从哪里调用的。
9.4) 执行isBluetoothAudioConnected()方法,该方法可能是由onClick()调用。
9.5) 执行enableSensor()方法,该方法可能是由onClick()调用。
9.6) 执行updateScreen()方法,该方法可能是由以下操作引发的: handleMessage(),onPhoneStateChanged(),onDisconnect(),syncWithPhoneState(),placeCall()。

10) 执行6)--7)

11) InCallScreen.java
11.1) 执行handleMessage()方法,我觉得应该是后台触发的。
11.2) 再执行internalResolveIntent()方法,由11.1)的handleMessage()方法调用。
11.3) 再执行enableSensor()方法,由11.1)的handleMessage()方法调用。

12) PhoneApp.java
12.1) 执行disableKeyguard()方法,由11.1)的handleMessage()方法调用。

13) InCallScreen.java
13.1) 执行onClick()方法。

14) PhoneUtils.java
14.1) 执行hangup()方法,不知道怎么调用的。
14.2) 执行dismissMenu()方法,由13.1)的onClick()方法调用。

15) CallNotifier.java
15.1) 执行handleMessage()方法。
15.2) 再执行onDisconnect()方法,由15.1)的handleMessage()方法调用。
15.3) 再执行run()方法,肯定是在onDisconnect()方法中调用,我没有找到的调用代码,不过存在SignalInfoTonePlayer(ToneGenerator.TONE_CDMA_SIGNAL_OFF).start();(Starts the new Thread of execution. The run() method of the receiver will be called by the receiver Thread itself (and not the Thread calling start()).),所以我推测应该是由这句代码来调用run的。

16) Ringer.java
16.1) 执行stopRing()方法,由15.2)的onDisconnect()方法调用。
16.2) 再执行makeLooper()方法,由16.1)的stopRing()方法调用。

17) CallNotifier.java
17.1) 执行resetAudioStateAfterDisconnect()方法,由15.2)的onDisconnect()方法调用。

18) PhoneApp.java
18.1) 执行updateWakeState()方法,不知道怎么调用。

19) CallNotifier.java
19.1) 执行showMissedNotification()方法,肯定由15.2)的onDisconnect()方法调用,但是其中怎么通过其他函数调用此函数不是很清楚。

20) InCallScreen.java
20.1) 执行onDisconnect()方法,不知道怎么调用。
20.2) 再执行delayedCleanupAfterDisconnect()方法,由20.1)的onDisconnect()方法调用。
20.3) 执行finish()方法,不知道怎么调用。
20.4) 执行enableSensor()方法,不知道怎么调用。
20.5) 执行onPhoneStateChanged()方法,不知道怎么调用。
20.6) 再执行updateScreen()方法,由20.5)的onPhoneStateChanged()方法调用。
20.7) 再执行dismissMunu()方法,由20.6)的updateScreen()方法调用。

21) CallCard.java
21.1) 执行updateState()方法,由20.6)的updateScreen()方法调用。
21.2) 再执行updateNoCall()方法,由21.1)的updateState()方法调用。
21.3) 再执行displayMainCallStatus()方法,由21.2)的updateNoCall()方法调用。
21.4) 再执行displayOnHoldCallStatus()方法,由21.2)的updateNoCall()方法调用。
21.5) 再执行displayOngoingCallStatus()方法,由21.2)的updateNoCall()方法调用。

22) InCallScreen.java
22.1) 执行updateMenuButtonHint()方法,由20.6)的updateScreen()方法调用。

23) PhoneApp.java
23.1) 执行updateWakeState()方法,由20.5)的onPhoneStateChanged()方法调用。

24) InCallScreen.java
24.1) 执行onSaveInstanceState()方法,不知道怎么调用的。
24.2) 执行onPause()方法,不知道怎么调用的。
24.3) 再执行dismissMenu()方法,由24.2)的onPause()方法调用。
24.4) 再执行dismissAllDialogs()方法,由24.2)的onPause()方法调用。
24.5) 再执行enableSensor()方法,肯定由24.2)的onPause()方法调用其他函数,再调用到此函数。

25) PhoneApp.java
25.1) 执行reenableKeyguard()方法,由24.2)的onPause()方法调用。
25.2) 执行updateWakeState()方法,由24.2)的onPause()方法调用。

26) InCallScreen.java
26.1) 执行onWindowFocusChanged()方法,不知道怎么调用执行该函数。
26.2) 执行handleMessage()方法,不知道怎么调用执行该函数。
26.3) 执行resetScreen()方法,不知道怎么调用执行该函数。
26.4) 执行26.2)和26.3)

27) Ringer.java
27.1) 执行stopRing()方法,不知道怎么调用执行该函数。
27.2) 再执行makeLooper()方法,由27.1)的stopRing()方法调用。

28) 注:自己挂断电话的时候,执行上面所有步骤;
       对方挂断电话的时候,不执行13)和14);
       不接听的时候,不执行14)。


22. 按Home键点亮屏
(1)将:mediatek/config/<project>/mt6573-kpd.kl文件中: key 102   HOME              WAKE //唤醒背光
(2)将:mediatek/platform/mt6573/kernel/core/mt6573_ost.c 或 mt65xx_sc.c
的sc_wake_src里添加一个WAKE_SRC_KP,如果已存在的话,让包含它的宏 PLATFORM_EVB 打开即可.


   
23. 修改Camera设置
比如关闭、打开闪光灯,搜索 Flash Light 需要同修改如下文件。
CUSTOM_HAL_FLASHLIGHT = constant_flashlight####dummy_flashlight (Projectconfig.mk)
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight####dummy_flashlight (Projectconfig.mk)
YUV: cfg_ftbl_gc0329_yuv.h, 两个目录下的(工程目录和common目录):cfg_ftbl_custom_yuv_main.h
RAW: cfg_ftbl_raw_sceneindep.h, 两个目录下的(工程目录和common目录):cfg_ftbl_custom_raw_main.h
   
24. 调音频参数
(1)在 CFG_Audio_Default.h audio_custom.h 文件
AUDIO_CUSTOM_PARAM_STRUCT speech_custom_default = {GAIN_NOR_TON_VOL,...GAIN_HED_TON_VOL.....};
(2)在 audio_volume_custom_default.h 文件
#define AUD_VOLUME_RING \
     0,32,64,96,128,160,192, \
     0, 124, 152, 176, 200, 228, 255,\
     0, 124, 152, 176, 200, 228, 255    
     
    修改音频参数
\mediatek\custom\handing15_x069\cgen\inc\audio_volume_custom_default.h//audio_volume_custom_default.h //在 X069目录下
\mediatek\custom\handing15_x069\cgen\inc\audio_custom.h

25. 何制作user版本的T卡升级包
(1)./makeMtk -o=TARGET_BUILD_VARIANT=user project_name new       ==>整个工程
  (2)./makeMtk -o=TARGET_BUILD_VARIANT=user project_name otapackage          ==>编译升级包
  (3)拷贝out/target/product/${PROJECT}/${PROJECT}-ota-user.${LOGNAME}.zip ${path}/org.zip       ==>即升级包。     
 
26. 两种定时器的使用:
    (1)   static struct hrtimer vibe_timer;
     INIT_WORK(&vibrator_work, update_vibrator);
     static enum hrtimer_restart vibrator_timer_func(struct hrtimer *timer)
     {
         schedule_work(&vibrator_work);
     }
       hrtimer_init(&vibe_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
     vibe_timer.function = vibrator_timer_func;
     这样在你想要启动定时器的函数中调用如下语句:
     hrtimer_start(&vibe_timer,
             ktime_set(value / 1000, (value % 1000) * 1000000), //ktime_set的第一个参数单位时秒,第二个单位是纳秒
             HRTIMER_MODE_REL);
     schedule_work(&vibrator_work);    //hrtimer_start后调用一次schedule_work,时间到后,再调用一次schedule_work,这样在两次schedule_work中可以做如控制按键灯
     亮灭等动作,具体例子可参考drivers/misc/sun4i-vibrator.c
     这个定时器还提供了一些查询功能,如可以查询定时器当前是否激活的,定时器当前的剩余时间等,如下面的函数:
     static int vibrator_get_time(struct timed_output_dev *dev)
     {
         struct timespec time_tmp;
         if (hrtimer_active(&vibe_timer)) {//判断是否激活
             ktime_t r = hrtimer_get_remaining(&vibe_timer);//取得定时器剩余时间
             time_tmp = ktime_to_timespec(r);//时间单位转换,他和上面的ktime_set相当于相反过程的转换
             //return r.tv.sec * 1000 + r.tv.nsec/1000000;
             return time_tmp.tv_sec* 1000 + time_tmp.tv_nsec/1000000;//返回的单位是毫秒
         } else
             return 0;
     }
    (2)   struct timer_list timer;
     static void earphone_hook_handle(unsigned long data)
     {
         mod_timer(&switch_data->timer, jiffies + msecs_to_jiffies(200));
     }
     init_timer(&timer);
     timer.function = &earphone_hook_handle;
     timer.data = (unsigned long)switch_data;
     add_timer(&switch_data->timer);//这一句之后已经启动定时器了
   
27. camera拍照的各种声音播放在frameworks/base/core/java/android/hardware/CameraSound.java中实现


28. 多语言定制的方法 
(1)多语言定制的实现步骤 

1)进入build/target/product目录,在languages_full.mk或languages_small.mk文件中, 修改PRODUCT_LOCALES的值,来定制语言,比如PRODUCT_LOCALES := en_US zh_CN zh_TW en_GB fr_FR it_IT de_DE es_ES; 

2)相同目录下,修改full.mk文件的 
$(call inherit-product, build/target/product/languages_small|full.mk)语句来切换所使用的文件; 

3)重新编译即可。 

(2)设置默认语言的实现步骤 
1)进入build/target/product目录,修改文件core.mk的PRODUCT_PROPERTY_OVERRIDES 值,例如,欲修改为默认中文,则增加 
“/ persist.sys.language=zh / persist.sys.country=CN”,增加后的语句如PRODUCT_PROPERTY_OVERRIDES := / 

ro.config.notification_sound=OnTheHunt.ogg / 

ro.config.alarm_alert=Alarm_Classic.ogg / persist.sys.language=zh / persist.sys.country=CN 
2)重新编译即可。 

(3)与多语言定制相关的字段及其所在的文件 

PREVIOUS_BUILD_CONFIG out/target/product/dream/previous_build_config.mk 

NO_FALLBACK_FONT的定义 device/htc/dream-sapphire/BoardConfigCommon.mk 

NO_FALLBACK_FONT的调用 frameworks/base/data/fonts/Android.mk 

extra_locales CUSTOM_LOCALES nodpi mdpi hdpi build/core/product_config.mk 

PRODUCT_PROPERTY_OVERRIDES build/target/product 
build.prop out/target/product/generic/system     


29. 判断SIM卡状态
private TelephonyManager manager;
manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
int simState = mTelephonyManager.getSimState(); 
switch (simState) {
case TelephonyManager.SIM_STATE_ABSENT: 
mString = "无卡"; 
break; 
case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
mString = "需要NetworkPIN解锁"; 
break;
case TelephonyManager.SIM_STATE_PIN_REQUIRED:
mString = "需要PIN解锁"; 
break;
case TelephonyManager.SIM_STATE_PUK_REQUIRED:
mString = "需要PUN解锁"; 
break;
case TelephonyManager.SIM_STATE_READY:
mString = "良好";
break;
case TelephonyManager.SIM_STATE_UNKNOWN: 
mString = "未知状态";
break;
}
 
30. SIM卡槽切换
如果贵司的代码包,能够看到Modem的相关代码,请做如下修改,即可交换SIM1,SIM2
mcu\hal\storage\sim\src\icc_switchControl_al.c
about line 213:
kal_bool sim_physicalSlotChanged = KAL_TRUE;
如果只有modem.img 建议贵司改硬件。

31. 进入recovery mod 立即显示menu菜单
将\alps\bootable\recovery\ui.c文件中的static int show_text = 0;
修改为 static int show_text = 1;

32. 插入双卡
if((isSimInserted(Phone.GEMINI_SIM_1) && isSimInserted(Phone.GEMINI_SIM_2))){
//插入两张卡,显示两个信号图标
mMobileVisible = ture;//卡1
mMobileVisibleGemini = ture;//卡2
}else if(isSimInserted(Phone.GEMINI_SIM_1){
//只插卡1
mMobileVisible = ture;
mMobileVisibleGemini = false;
}
参考文件: SignalClusterViewGemini.java

33. MTK android flash 配置 
http://blog.csdn.net/pkigavin/article/details/7623549
关于6573集成MCP nandflash的方法,driver_allinone 和Memory Customer Document pdf的说明里面漏了很多细节.在此补上.
 
(1)首先确认flash型号.如sumsung的KA100O015E_BJTT.
(2)查看MTK_MVG_Release的MemoryDeviceList_MT7673.xls,看一看这颗flash是否经过mtk验证.如果有,则把这一行数据copy出来.如果没有,则要提交给mtk来调试.
(3)在mediatek\build\tools\emigen\MT6573\MemoryDeviceList_MT6573.xls中添加一行第2步中copy出来的数据.
(4)修改\mediatek\custom\ckt73_gb\preloader\inc\custom_MemoryDevice.h
 
//#define BOARD_ID                 ZTEMT73V2
1.define BOARD_ID                MT6573_EVB  //修改为MemoryDeviceList_MT7673.xls中的BOARD_ID要与此处一致.
 
//NAND_ID for MT29C4G96MAZAPCJA_5IT is 0x2CBC
【1】define CS0_PART_NUMBER[0]       MT29C4G96MAZAPCJA_5IT
【2】define CS1_PART_NUMBER[0]       MT29C4G96MAZAPCJA_5IT
 
//NAND_ID for KA100O015E_BJTT is 0xECBC
【1】define CS0_PART_NUMBER[1]       KA100O015E_BJTT  //问基带工程师我们的MCP的bank分配.一般分为bank0 bank1,对应CS0,CS1.
【2】define CS1_PART_NUMBER[1]       KA100O015E_BJTT  //
 
(5)这时你可以执行./mk ./mk -t projectname emigen 去生成对应的emi参数文件:
mediatek\custom\ckt73_gb\preloader\inc\custom_emi.h
mediatek\custom\ckt73_gb\preloader\custom_emi.c
 
(6)修改\mediatek\build\tools\emigen\MT6573\nandgen.pl
6573平台与6516平台修改nand参数的方式不同. 6573用nandgen.pl生成nand参数文件\mediatek\custom\ckt73_gb\common\nand_device_list.h
修改nandgen.pl:
       $advance_option = 0;
      # if ($PROJECT_FIELD[$iter] eq $PROJECT)
      {
          print "$PAGE_SIZE $PAGESIZE_FIELD[$iter]\n" ;
          #if (($PAGE_SIZE eq "4K" && $PAGESIZE_FIELD[$iter] eq 4096) || ($PAGE_SIZE eq "2K" && $PAGESIZE_FIELD[$iter] eq 2048))
          if(1)
          {
          ...
          }
 
把上面if条件改为1. 不去判断pagesize.
 
(7)修改ProjectConfig.mk .
有两项CUSTOM_DRAM_SIZE和MTK_NAND_PAGE_SIZE
查看MemoryDeviceList_MT7673.xls中此flash对应TotalSize大小,如512M,则CUSTOM_DRAM_SIZE 为 512M*8 =4G
查看MemoryDeviceList_MT7673.xls中此flash对应的PageSize大小.如4096,则MTK_NAND_PAGE_SIZE 为 4K.
 
(8)修改partition_table.xls
查看MemoryDeviceList_MT7673.xls中此flash对应的BlockSize大小.partition_table中连续partiton的大小都要为BlockSize的整数倍.
修改Size (KB)这一项,其它start addr和end addr都会自动修改.
注意要修改对应的pagesize的页面,如pagesize是4K,则修改mt6573 no 4k这一页.
修改完成后使用./mk ptgen可以产生新的scatfile和parttion table参数文件.

其它:
1.上述中使用emigen和nandgen命令,在new时都会自动执行.
2.关于nandgen这个命令,可以在makeMtk中加入nandgen到actions说明内,就可以用./mk 得到nandgen的说明: @actions =  qw(
  new n bm_new remake r bm_remake clean c listproject listp
 drvgen codegen nandgen emigen custgen javaoptgen ptgen
 check-modem update-modem sign-image sign-modem check-dep
 dump-memusage dump-comp-bld-info gen-relkey
);
    3.如果要换的nandflash不是MCP,则第3,4步有不同之处,具体看driver_allinone pdf或者Memory Customer Document pdf.

34. 修改Launcher几行几列
(1)packages\apps\Launcher2\res\layout-land\workspace_screen.xml 
改: 
launcher:shortAxisCells="5"
launcher:longAxisCells="6"
 
 
 
(2)packages\apps\Launcher2\res\layout-port\workspace_screen.xml 
改: 
launcher:shortAxisCells="5"
launcher:longAxisCells="6"

注:以上两个文件是workspace的设置,分别对应横屏竖屏。

(3)packages\apps\Launcher2\src\com\android\launcher2\CellLayout.java
改: 
public CellLayout(Context context, AttributeSet attrs, int defStyle) { 
其中一段改为:(要初始化一下mPortrait)
if (mOccupied == null) {
        mPortrait = this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
           if (mPortrait) {
               mOccupied = new boolean[mShortAxisCells][mLongAxisCells];
           } else {
               mOccupied = new boolean[mLongAxisCells][mShortAxisCells];
           }
       }
(4)packages\apps\Launcher2\src\com\android\launcher2\Launcher.java 
改:
static final int NUMBER_CELLS_X = 6;
static final int NUMBER_CELLS_Y = 6;


35. Linux下删除*.svn文件命令
在对应目录下输入命令: find . -name .svn | xargs rm -rf        


36. 如何从Nand_Flash partition_table.xls计算User Partition空间大小
(1) 将partition_table.xls中的Preloader,Uboot,Nvram,BootImage......等从Nand Flash大小中中减掉
(2) 将BMT POOL部分减掉
partition_table.xls最后的PART_SIZE_BMTPOOL 的0x50的意义是有0x50个Nand Flash Block大小,另外还有2个block拿出存放partition table,所以一共是0x52个Block.
举个例子:
如果您目前使用的Nand Flash的Block Size是2K*64=0x20000,
BMT Size = 0x52*0x20000=0xA40000=10.25M Bytes,需要把这10.25 M减掉。
Ps.
PART_SIZE_BMTPOOL 是拿来做管理使用的(Nand Flash Bad Block Management等)
此计算方法只适用于Nand flash,.
 
37. 在android4.0源码中,mm编译apk时出现下面的错误:
make: *** No rule to make target  `out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/javalib.jar',  needed by  `out/target/common/obj/APPS/NativeTimer_intermediates/classes-full-debug.jar'.   Stop.
解决方法:
在源码根目录执行:
make clobber
make -j8

这个错误的好像是由于在make一个任务时,并没有结束,这时在进行make就会报
make clobber的功能是把上一次make命令生成的文件或目录清除掉,效果比make clean更严格。
这样编译完成后,再编译apk就可以了。


38. 状态栏背景修改为透明


[说明]
状态栏默认背景为黑色。要求修改为:Launcher界面状态栏为透明,其他界面为黑
色。
[SOLUTION]
1. 请添加半透明的图片资源,例如:statusbar_background.9.png,到路径alps
\frameworks\base\packages\SystemUI\res\drawable-hdpi 下
2. 如果是gemini工程请修改gemini_status_bar.xml,反之修改status_bar.xml,
把其中的android:background="@drawable/status_bar_background 修改成
android:background="@drawable/statusbar_background
3. 修改PhoneWindowManager.java的beginLayoutLw方法,如下(修改代码用//mtk
added标记):
public void beginLayoutLw(int displayWidth, int displayHeight, int
displayRotation) {
......
       mUnrestrictedScreenLeft = mUnrestrictedScreenTop = 0;
if (mStatusBar.isVisibleLw() && !mStatusBar.isAnimatingLw()) {
               // If the status bar is currently requested to be
visible,
               // and not in the process of animating on or off, then
               // we can tell the app that it is covered by it.
             
  // mSystemTop = mUnrestrictedScreenTop + mStatusBarHeight;//mtk added
把这行注释掉

           }
       }
   }
4.  请在PhoneStatusBar.java的makeStatusBarView(Context context)方法中注
册一个BroadcastReceiver接收自定义的intent,监控是否在Launcher界面。
5.  请在Launcher.java添加onWindowFocusChanged (boolean hasWindowFocus)方
法,如果此方法已有,请跳过此步骤。
6.  请修改Launcher.java的onWindowFocusChanged (boolean hasWindowFocus)方
法:如果hasWindowFocus为true且!isAllAppsVisible()为true,发送设置状态栏
背景为透明的intent,PhoneStatusBar的BroadcastReceiver接收到这个intent,
调用mStatusBarView.setBackgroundResource(R.drawable.xxxx)将背景设置为半
透明背景;否则,发送设置状态栏背景为黑色的intent,PhoneStatusBar的
BroadcastReceiver接收到这个intent,调用
mStatusBarView.setBackgroundResource(R.drawable.xxxx)将背景设置为黑色背
景。
7. 请在Launcher.java的showAllApps(boolean animated) 方法中发送设置状态栏
背景为黑色的intent,PhoneStatusBar的BroadcastReceiver接收到这个intent,
调用mStatusBarView.setBackgroundResource(R.drawable.xxxx)将背景设置为黑
色背景。
8. 请在Launcher.java的showWorkspace(boolean animated)方法中发送设置状态
栏背景为透明的intent,PhoneStatusBar的BroadcastReceiver接收到这个
intent,调用mStatusBarView.setBackgroundResource(R.drawable.xxxx)将背景
设置为半透明背景。

存在问题:锁屏界面透明不了


//==========================================================================================================================================


\frameworks\base\packages\SystemUI\res\layout\gemini_status_bar.xml
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
    android:id="@+id/status_bar"
    android:background="@drawable/statusbar_background" //设定半透明图片

frameworks\base\core\java\android\content\Intent.java
    public static final String ACTION_CHANGE_STATUSBAR_BG = "android.intent.action.STATUSBAR_BG";


frameworks\base\packages\systemui\src\com\android\systemui\statusbar\phone\PhoneStatusBar.java
  public void beginLayoutLw(boolean isDefaultDisplay, int displayWidth, int displayHeight,
                              int displayRotation) {

                  if (mStatusBar.isVisibleLw() && !mStatusBar.isAnimatingLw()) {
                    // If the status bar is currently requested to be visible,
                    // and not in the process of animating on or off, then
                    // we can tell the app that it is covered by it.
                   // mSystemTop = mUnrestrictedScreenTop + mStatusBarHeight;
                }
}


    protected PhoneStatusBarView makeStatusBarView() {

            IntentFilter StatusBarBgFilter = new IntentFilter();
            StatusBarBgFilter.addAction(Intent.ACTION_CHANGE_STATUSBAR_BG);
            // StatusBarBgFilter.addDataScheme("file");
            context.registerReceiver(mStatusBarBgChange, StatusBarBgFilter);

    }


    private BroadcastReceiver mStatusBarBgChange = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();           
        if (action.equals(Intent.ACTION_CHANGE_STATUSBAR_BG)) {
            //update status bar
            boolean StatusBarBg_Flag = intent.getBooleanExtra("statusbarbg_set", false);
            //StatusBarBg_Flag=true;
             if(StatusBarBg_Flag ){
                 Log.d("set_bg","mStatusBarBgChange- onReceive-- transparent--->");
                 mStatusBarView.setBackgroundResource(R.drawable.statusbar_background); //transparent
                mStatusBarView.invalidate();
             }
             else{
                 Log.d("set_bg","mStatusBarBgChange- onReceive-- blank--->");
                 mStatusBarView.setBackgroundResource(R.drawable.status_bar_background);//blank   status_bar_background  status_bar_bg_tile
                 mStatusBarView.invalidate();
             }
            }   
            //锁屏界面状态栏实现透明
KeyguardManager mKeyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
if (mKeyguardManager.inKeyguardRestrictedInputMode()){
            Log.d("set_bg","mkeyguardManager mStatusBarBgChange- onReceive-- transparent--->");
               mStatusBarView.setBackgroundResource(R.drawable.statusbar_background); //transparent
               mStatusBarView.invalidate();
}
                
        }
        };



\packages\apps\launcher2\src\com\android\launcher2\Launcher.java
    private static void setStatusBarBg(Context context, boolean enabled) {
        Intent statusbarbgChanged = new Intent(Intent.ACTION_CHANGE_STATUSBAR_BG);
        statusbarbgChanged.putExtra("statusbarbg_set", enabled);
        context.sendBroadcast(statusbarbgChanged);
    }




    public void onWindowFocusChanged(boolean hasFocus) {
    .....

    if(hasFocus ){     //&& (!isAllAppsVisible())     //AllApps的背景是透明的用的墙纸
        setStatusBarBg(this,true); // transparent
       
    }
    else {
        setStatusBarBg(this,false); // blank getContext()       
    }
   
    }


    void showWorkspace(boolean animated) {
        /// M: Call the appropriate callback for the IMTKWidget on the current page when leave all apps list back to
        /// workspace.
        mWorkspace.stopCovered(mWorkspace.getCurrentPage());
        showWorkspace(animated, null);

    if(animated) setStatusBarBg(this,true); // transparent
   
    }

      void showAllApps(boolean animated) {
      .....
      if(animated) setStatusBarBg(this,true); // blank   ...false
      }


//============================================================================================================================


另种方法用handle来处理

 frameworks\base\packages\systemui\src\com\android\systemui\statusbar\phone\PhoneStatusBar.java

import android.util.Log; //
import android.app.KeyguardManager;//
//

import android.os.SystemProperties;
import android.graphics.drawable.Drawable;
import android.provider.Settings.System;

// 
Handler checkIsHome = new Handler();
public static final int alpha = 0;
Drawable navigationBarBg = null;
Drawable localDrawable  =null;
public static final int BG_BLACK_COLOR = 0xFF000000;

protected PhoneStatusBarView makeStatusBarView() {
.................

       //if (SystemProperties.getBoolean("ro.bird.statusbar.iphone", false))
              makeIphoneStatusBar();
}


 private String getCurrentPackageName(Context paramContext)
  {
        ActivityManager localActivityManager = (ActivityManager)paramContext.getSystemService("activity");
        try
        {
          String str = ((ActivityManager.RunningTaskInfo)localActivityManager.getRunningTasks(1).get(0)).topActivity.getPackageName();
          Log.d("set_bg","getCurrentPackageName-- --->" + str);
          return str;
        }
        catch (IndexOutOfBoundsException localIndexOutOfBoundsException)
    {
    }
        return "";
  }

  private List getHomes(Context paramContext)
  {
        ArrayList localArrayList = new ArrayList();
        localArrayList.add("com.android.launcher"); // add
        return localArrayList;
  }


  public boolean isScreenLock(Context paramContext)
  {
        return ((KeyguardManager)paramContext.getSystemService("keyguard")).inKeyguardRestrictedInputMode();
  }   


public boolean isHome(Context paramContext)
{
      return getHomes(paramContext).contains(getCurrentPackageName(paramContext));
}


public void makeIphoneStatusBar(){
    mStatusBarView.setBackgroundColor(BG_BLACK_COLOR);
    localDrawable = mStatusBarView.getBackground();
    localDrawable.setAlpha(alpha);


    if(mNavigationBarView !=null){
        //navigationBarBg = mNavigationBarView.findViewById(R.id.trans_bg).getBackground();
        //navigationBarBg.setAlpha(alpha);
        mNavigationBarView.setBackgroundColor(BG_BLACK_COLOR);
        navigationBarBg = mNavigationBarView.getBackground();
        navigationBarBg.setAlpha(alpha);
    }
   
     checkIsHome.postDelayed(new Runnable()
      {
        public void run()
        {


          //if (PhoneStatusBar.this.mExpandedVisible);
       
          int i = 255;
          int j = 255;           
       
           
            if (PhoneStatusBar.this.isScreenLock(PhoneStatusBar.this.mContext) )
            {
                  i = 112;
                  j = 112;
            }           
           
            else if(PhoneStatusBar.this.isHome(PhoneStatusBar.this.mContext))
                {
                     i = 24;
                     j = 80;             
                }
            else{
                     i = 255;
                     j = 255;                   
                }


             localDrawable.setAlpha(i); 
             
             if ((PhoneStatusBar.this.mNavigationBarView != null) && (PhoneStatusBar.this.navigationBarBg != null)) {
                 PhoneStatusBar.this.navigationBarBg.setAlpha(j);
                //  Log.d("set_bg","j-->" + j);
                 }
             checkIsHome.postDelayed(this, 200L);
            // Log.d("set_bg","i-- --->" +i);
              //Log.d("set_bg","makeIphoneStatusBar-------------->dd" + mKeyguardHostView.getBackground().getOpacity());
         
        }
      }
      , 200L);
    }


//===================================================================================================================================

39. Android 判断当前是否为锁屏界面

KeyguardManager mKeyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 
if (mKeyguardManager.inKeyguardRestrictedInputMode()) { 
// keyguard on 
}  



40. 修改权限命令 mount -o remount,rw /system


41. Android 获得当前系统时间
int64_t now = curr_time_ms();

42. Android 默认字体修改
在 Configuration.java 文件, setToDefaults() 函数。

43. 手机相关信息修改
echo "ro.product.model=$PRODUCT_MODEL"//手机名称
echo "ro.product.brand=$PRODUCT_BRAND"
echo "ro.product.name=$PRODUCT_NAME"
echo "ro.product.device=$TARGET_DEVICE"
echo "ro.product.board=$PRODUCT_NAME"
echo "ro.product.manufacturer=$PRODUCT_MANUFACTURER"
echo "# ro.build.product is obsolete; use ro.product.device"
echo "ro.build.product=$TARGET_DEVICE"


44. 修改手机型号、品牌、内部版本号
首先你需要有一台root过的机器以及re管理器
打开re管理器,进入system文件夹。然后挂载为读写状态
 
然后长按build.prop,选择以文本编辑方式打开,修改为自己想要显示的文字后重启你的手机

# begin build properties (开始设置系统性能)
# autogenerated by buildinfo.sh (通过设置形成系统信息)
ro.build.id=GRI40 (版本ID)
ro.build.display.id=机锋基友定制ROM(版本号)
ro.build.version.incremental=eng.buildbot.20110619.060228 (版本增量)
ro.build.version.sdk=10 (sdk版本)
ro.build.version.codename=REL (版本代号)
ro.build.version.release=110(Android 2.3.4系統无需修改,也可改为3.0装装B)
ro.build.date=Sun Jun 19 06:02:58 UTC 2011 (制作者制作的时间,可修改2011年X月X日 某某某制作)
ro.build.date.utc=0
ro.build.type=user
ro.build.user=buildbot
ro.build.host=bb1
ro.build.tags=test-keys
ro.product.model=机锋搞基 基友9100 (HTC内部手机代号也就是手机名,改为大文明用语)
ro.product.brand=华尔社 (手机品牌,改为中国山寨机)
ro.product.name=htc_buzz (手机正式名称,改为小文明用语)
ro.product.device=buzz (采用的设备,改为China G8)
ro.product.board=酷睿I7 (采用的处理器,改为China 800.8Ghz)
ro.product.cpu.abi=armeabi-v6j (cpu的版本)
ro.product.cpu.abi2=armeabi (cpu的品牌)
 
在上层软件上要修改如上值,一般在如下几个文件修改:
buildinfo.sh
version_defaults.mk
\build\core\Makefile
\mediatek\config\xxx\system.prop
\build\envsetup.sh
\mediatek\build\tools\mtk_buildinfo.pl


45. 解决空间超了的问题
修改\mediatek\build\tools\ptgen\partition_table.xls
改了 mk n ptgen下 
再mk r 就可以了

46. 查看内存空间使用
adb shell cat /proc/meminfo

adb shell procrank (仅ENG版本可用)
adb shell ps system_server
adb shell showmap 268
adb shell cat /proc/mtd


47. Android4.0 修改系统屏幕分辨率方法 
1 修改板子分区读写权限
mount -o remount rw /tvservice
mount -o remount rw /system 
2 修改/system/build.proc文件中的ro.sf.lcd_density属性
ro.sf.lcd_density=160
3 修改/config/panel/FullHD_CMO216_H1L01.ini文件中的osd属性
osdWidth = 1280;
osdHeight = 720;
4 设置3Dhome为720,否则3Dhome在720P分辨率下显示不全
修改/data/data/com.android.mlauncher/files/MStarAnHome.cfg文件的winsize属性
winsize = 1280 720
 
48. Android.mk 拷贝文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
ifeq (ZH_CN,$(strip $(MMI_S4_LANG_VER_SUPPORT)))
LOCAL_POST_PROCESS_COMMAND := $(shell cp -r $(LOCAL_PATH)/s4_zh_cn_version/*.apk $(TARGET_OUT)/app/) 
LOCAL_POST_PROCESS_COMMAND := $(shell cp -r $(LOCAL_PATH)/s4_zh_cn_version/*.xml $(TARGET_OUT)/etc/) 
LOCAL_POST_PROCESS_COMMAND := $(shell cp -r $(LOCAL_PATH)/*.so  $(TARGET_OUT)/lib/)


#PRODUCT_COPY_FILES += $(LOCAL_PATH)/s4_zh_cn_version/Launcher2.apk:system/app/Launcher2.apk
#PRODUCT_COPY_FILES += $(LOCAL_PATH)/s4_zh_cn_version/S4_drag.apk:system/app/S4_drag.apk
endif


49. 添加APK的脚本写法
(一)User版本写法:
(1)
include $(CLEAR_VARS)
LOCAL_MODULE := kuContacts
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := SystemApp/Contacts.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := shared
include $(BUILD_PREBUILT)


(2)
ifeq ($(strip $(MMI_THIRDAPPS_SUPPORT)), yes)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

#Module name should match apk name to be installed
LOCAL_MODULE := OupengBrowser
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) #添加此条语句后,APK就可卸载;不添加,APK就不能卸载。
include $(BUILD_PREBUILT)
endif  

(二)Eng版本写法:(注:如下写法,编出来的User版本的系统APK会提示“进程停止”。针对系统APK,要按User版本写法)
SystemApp := $(shell ls $(LOCAL_PATH)/SystemApp )
PRODUCT_COPY_FILES += $(foreach file, $(SystemApp), \
        $(LOCAL_PATH)/SystemApp/$(file):system/app/$(file))
#######Others
SystemLib := $(shell ls $(LOCAL_PATH)/SystemLib )
PRODUCT_COPY_FILES += $(foreach file, $(SystemLib), \
        $(LOCAL_PATH)/SystemLib/$(file):system/lib/$(file))



50. 2SDCARD相互切换
针对emmc flash,把内置sdcard1和sdcard2交换。sdcard1是手机内存,sdcard2是T卡。
Projectconfig.mk  MTK_2SDCARD_SWAP = yes
0 0
原创粉丝点击