2016年工作笔记汇总

来源:互联网 发布:程序员证书怎么考 编辑:程序博客网 时间:2024/06/05 09:36
一、程序↓↓↓↓↓
1、Launcher:
    1.1:程序列表按钮开关:(R7)
autochips/packages/apps/Launcher/res/layout/ui2_main3.xml
android:id="@+id/ui2_app_btn"

1.2.1:程序图标隐藏于显示:(通过工厂设置控制USBipoder为例)
    1.2.1.1、/home/jbd_lingf/mtk8317/hd9030_v0509/autochips/packages/apps/Factory_1024/src/com/jbd/factorysetting/FunSetup.java  写数据给MCU
249:添加标准  界面其他的不贴代码
public static final int Enable_USB_Ipod= 0x80;
1.2.1.2、Launcher读数据:
/home/jbd_lingf/mtk8317/hd9030_v0509/autochips/packages/apps/Launcher2/src/com/jbd/launcher/LauncherModel.java
1956行读是否隐藏:
if((systemflag2 & Enable_USB_Ipod )== Enable_USB_Ipod)//开启USB_IPOD
{
removeAppsFromName(apps,"com.jbd.ipodplayer");
}
else{//开启串口IPOD
removeAppsFromName(apps,"com.autochips.ipodplayer");
}

1.2.2 :  程序图标隐藏于显示:(通过协议选项控制为例)
car_index = (car_index&0xff00)>>8; //取出当前协议选项值
removeAppSwitch(car_index);  
 private void removeAppSwitch(int position){ //此处
List<String> apps = new ArrayList<String>();
if(position<=10){
apps.add("");
leaveCarApp(apps);
return;
}
switch (position) {
case 0:
apps.add("com.md.info");//要留下来的APP图标
break;
default:
break;
}
leaveCarApp(apps);
      }
  private List<ResolveInfo> apps = null;
    private String[] carPackage = {"com.md.info","com.md.info2"};   //所有可控程序都放这里,此处为程序<action android:name="android.intent.action.MAIN" />的类路径!



private void leaveCarApp(List<String> packageNames){
    for (int i = 0; i < carPackage.length; i++) {
int count = 0;
for(int j = 0;j<packageNames.size();j++){
String packageName = packageNames.get(j);
if(packageName.equals("")){
removeAppsFromName(apps,carPackage[i]);
}else{
if (!carPackage[i].equals(packageName)) {
count +=1;
if(count == packageNames.size()){
removeAppsFromName(apps,carPackage[i]);
Log.i("md", "=====leaveCarAppg==remove=="+carPackage[i]);
}
}else{
Log.i("md", "=====leaveCarAppg==leave===="+carPackage[i]);
j = packageNames.size();
}
}
}
  }
    }


    private void removeAppsFromName(List<ResolveInfo> apps,String itemStr){
        for(int k=0;k<apps.size();k++){
        if(apps.get(k).toString().indexOf(itemStr) != -1){
        apps.remove(k);
        break;
        }
        }        
    }

1.3 : Launcher  app列表背景
Launcher2\res\layout\apps_customize_pane.xml  
<FrameLayout
                android:id="@+id/animation_buffer"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#FF000000"
                android:visibility="gone" />
                
       1.4 :判断制定目录下是否有音频文件再决定是否打开音乐视频文件
       case McuComSysState.CAR_MPEG_SYS_SD:
    //Even add
if(FileType_Music("/mnt/sdcard/Music")){//制定目录是否有可播放的音乐文件
//flash have musics
g_sys_devflag |= 0x02;
send_command(McuComAddr.CAR_MCU_DEV_FLAG_ADR, TwoData(g_sys_devflag));//告诉MCU机器有一个外接设备接入,音乐程序要允许打开!
//打开程序需要判断程序是否已经
if (g_sys_state != sysstate) {
byte[] data = McuComKey.getKeyData(
McuComKey.CAR_KEY_ATTR_TOUCH,
McuComKey.SHORTKEY, McuComKey.CAR_KEY_SD_SEL);
send_command(McuComAddr.CAR_MPEG_KEY_ADR, data);
} else {
gMCM.directinSystemState(sysstate);
}
}else{
if ((g_sys_devflag & 0x02) == 0) {//是否有USB插入
// Toast.makeText(this,
// R.string.no_usbsd,Toast.LENGTH_SHORT).show();
MainShowMessage("no_usbsd");//弹出提示
} else {
if (g_sys_state != sysstate) {
byte[] data = McuComKey.getKeyData(
McuComKey.CAR_KEY_ATTR_TOUCH,
McuComKey.SHORTKEY, McuComKey.CAR_KEY_SD_SEL);
send_command(McuComAddr.CAR_MPEG_KEY_ADR, data);
} else {
gMCM.directinSystemState(sysstate);
}
}
}
break;

//判断是否有 Music Type
public static boolean FileType_Music(String fpath)
{
File fl=new File(fpath);
File[] fls=fl.listFiles();
if(fls!=null){
for (int i = 0; i < fls.length; i++) 
{
if(fls[i].isDirectory())
{  
if(FileType_Music(fls[i].getAbsolutePath()))//2
return true;
}else
{
String fname=fls[i].getAbsolutePath();
if(fname.indexOf(".") != -1)
{
String ext=fname.substring(fname.lastIndexOf("."),fname.length());
if(ext.equalsIgnoreCase(".mp3")||ext.equalsIgnoreCase(".wma")||ext.equalsIgnoreCase(".wav")
||ext.equalsIgnoreCase(".mid")||ext.equalsIgnoreCase(".ac3")||ext.equalsIgnoreCase(".aac")
              ||ext.equalsIgnoreCase(".ape")||ext.equalsIgnoreCase(".flac")||ext.equalsIgnoreCase(".APE")
||ext.equalsIgnoreCase(".amr")||ext.equalsIgnoreCase(".ra")||ext.equalsIgnoreCase(".MP3")){
return true;
}
}
}
}
}
return false;
}

//判断是否有视频文件:
private static final String videoSuffix[] = { ".avi", ".divx", ".mp4",
            ".m4a", ".m4v", ".mp4v", ".mpg", ".mpeg", ".vob", ".dat", ".m2v",
            ".rm", ".rmvb", ".mkv", ".flv", ".f4v", ".f4p", ".f4a", "f4b",
            ".ogm", ".ogv", ".ogg", ".oga", ".asf", ".wmv", ".3gp", ".mov", ".ts",
            ".webm", ".ram", ".3g2", ".m1v", ".hlv", ".tp", ".trp", ".m2ts"};


public static boolean FileType_video(String fpath)
{
File fl=new File(fpath);
File[] fls=fl.listFiles();
if(fls!=null)
{
for (int i = 0; i < fls.length; i++) 
{
if(fls[i].isDirectory())
{
if(FileType_video(fls[i].getAbsolutePath()))//2
return true;
}else
{
String fname=fls[i].getAbsolutePath();
if(fname.indexOf(".") != -1)
{
String ext=fname.substring(fname.lastIndexOf("."),fname.length());
       for (String s : videoSuffix) 
       {
           if (ext.equalsIgnoreCase(s)) 
           {
            return true;
           }
       }
}
}
}
}
return false;
}

1.5:打开所有APP列表:
public void showAllApps(boolean animated) {
if (mState != State.WORKSPACE)
return;


showAppsCustomizeHelper(animated, false);
mAppsCustomizeTabHost.requestFocus();


// Change the state *after* we've called all the transition code
mState = State.APPS_CUSTOMIZE;


// Pause the auto-advance of widgets until we are out of AllApps
mUserPresent = false;
updateRunning();
closeFolder();


// Send an accessibility event to announce the context change
getWindow().getDecorView().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}

1.6:UI调整:
控制桌面图标显示(Launcher)
LauncherModel.java (loadAllAppsByBatch()方法中)
/home/jbd_lingf/mtk8317/hd7010qijun_Thailand/autochips/packages/apps/Launcher2/res/xml/default_workspace.xml
例:


设置整合


主界面半圆


切换UI黑屏


addShortcut


removeShortcut


addViewToCellLayout //添加图标到宫格
mShortcutsAndWidgets


Bitmap createIconBitmap(Drawable icon, Context context) //创建图标函数


loadAllAppsByBatch //加载所有图标,过滤


//加载预设图标
loadDefaultFavoritesIfNecessary
private int loadFavorites(SQLiteDatabase db, int workspaceResourceId)


loadWorkspace()


//从菜单回主页
private void hideAppsCustomizeHelper(
mSearchDropTargetBar


mSearchDropTargetBar.setVisibility(View.INVISIBLE);


MotionEvent.ACTION_UP


    if(Launcher.pThis.mSearchDropTargetBar != null)
    {
    Launcher.pThis.mSearchDropTargetBar.setVisibility(View.VISIBLE);
    }


loadLabel(mPackageManager)


autochips/device/atc/ac8317/.overlay/packages/apps


//文字底色


public void draw(Canvas canvas) {


We enhance the shadow by drawing the shadow twice


//图标大小
主页
value-land/dimens.xml
<dimen name="app_icon_size">134px</dimen>  //APP图标大小   配合格子高度  <dimen name="apps_customize_cell_height">140dp</dimen> 可完成图标调节
<dimen name="workspace_cell_width_land">90dp</dimen>
<dimen name="workspace_cell_height_land">82dp</dimen>  


//AppsCustomize(分Land和port)
<style name="WorkspaceIcon.Landscape.AppsCustomize">
        <item name="android:background">@null</item>//app背景
        <item name="android:paddingTop">0dp</item>  
        <item name="android:paddingBottom">3dp</item>
        <item name="android:drawablePadding">-5dp</item>
    </style>

//APPS 图标大小
public class AppsCustomizePagedView{
mAppIconSize = resources.getDimensionPixelSize(R.dimen.app_icon_size) * 3/4;
}
//APPS  格子大小(高宽) 
<dimen name="apps_customize_cell_width">86dp</dimen>
<dimen name="apps_customize_cell_height">80dp</dimen>

//图标间隔(apps)  //找不到
<dimen name="apps_customize_pageLayoutHeightGap">-10dp</dimen>
<dimen name="apps_customize_pageLayoutWidthGap">-1dp</dimen>

//文字大小  //app名字大小
 <dimen name="workspace_icon_text_size">14sp</dimen>


//文字坐标
 styles.xml 
//主页
    <style name="WorkspaceIcon.Landscape">
        <item name="android:drawablePadding">@dimen/app_icon_drawable_padding_land</item> //调这句可以调节文字和图片的相对距离
        <item name="android:paddingLeft">4dp</item>
        <item name="android:paddingRight">4dp</item>
        <item name="android:paddingTop">@dimen/app_icon_padding_top</item>
        <item name="android:paddingBottom">4dp</item>
    </style>
//apps
    <style name="WorkspaceIcon.Landscape.AppsCustomize">  //这个可调整APP名字与图表的距离
           <item name="android:drawablePadding">-22dp</item>
//加载图标到某一页
addViewToCellLayout


文件夹大小
values-land/dimens.xml
<dimen name="folder_preview_size">110dp</dimen>




values/dimens.xml


//打开文件夹后大小
    <dimen name="folder_cell_width">100dp</dimen>
    <dimen name="folder_cell_height">100dp</dimen>


//打开文件夹后的位置 
private void centerAboutIcon() {
 ..................................
lp.width = width;
lp.height = height;
lp.x = left;
lp.y = top - 100;
}


//单独改变 APPS 图标大小


    public PagedViewCellLayout(Context context, AttributeSet attrs, int defStyle) {


......................................................        


        mChildren.setScaleX(0.8f);
        mChildren.setScaleY(0.8f);
        addView(mChildren);
    }

}


//改变所有app上tap字体颜色大小(launcher.AccessibleTabView.java)
  显示隐藏Tap(AppsCustomizeTabHost.xml)


//控制工作空间中是否接受快捷方式(拖动app是否能够添加在该页面,通过screen控制) Workplace.java  中的onDrop();


//systemUI 快捷开关
//PhoneStatusBar


    // ensure quick settings is disabled until the current user makes it through the setup wizard
    private boolean mUserSetup = true;


    mUserSetup = userSetup  = true;


增加,减少 tile
//QuickSettings.java
private void addUserTiles(ViewGroup parent, LayoutInflater inflater)




//显示3G信号
    <!-- Show phone (voice) signal strength instead of data in mobile RSSI. -->
    <bool name="config_showPhoneRSSIForData">true</bool>
//policy/NetworkController.java
public NetworkController(Context context)
{
mShowPhoneRSSIForData = true;
mShowAtLeastThreeGees = true;
mAlwaysShowCdmaRssi = true;
}


//设置某个cellLaoyut不可用(添加shortcut)
installShortcutReceiver.java     processInstallShortcut(Context context)   final int screen = Launcher.DEFAULT_SCREEN;






调整statusbar的高度,frameworks/base/core/res/res/values/dimens.xml 中,修改 <dimen name="status_bar_height">25dip</dimen> 的值


/home/jbd_fangym/mtk8317/mtk_origin_8317/autochips/device/atc/ac8317/.overlay/frameworks/base/core/res/res/values




class.jar  autochips
/home/jbd_lingf/mtk8317/r020_v0126/out/target/common/obj/JAVA_LIBRARIES/autochips_intermediates


class.jar  self_server
/home/jbd_lingf/mtk8317/hd9020_v1231/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates


service
/home/jbd_lingf/mtk8317/hd9020_v1231/out/target/product/ac8317/system/framework


/home/jbd_lingf/mtk8317/ha6756_v0229/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates  


1.7:设备提示:
private void MainShowMessage(String msg)
{
Intent message = new Intent("com.android.jbd.showmessage");
message.putExtra("message", "icon");
message.putExtra("iconmode", msg);
    this.sendBroadcast(message);
}
该广播是发给蓝牙;
               
2、SytemUI:
/autochips/frameworks/base/packages/SystemUI
      /autochips/device/atc/ac8317/.overlay/frameworks/base/packages/SystemUI
     2.1、显示的位置:
     frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
        if (shortSizeDp < 600) {  //位置在顶端
            // 0-599dp: "phone" UI with a separate status & navigation bar
            mHasSystemNavBar = false;
            //mNavigationBarCanMove = true;
        } else if (shortSizeDp < 720) {//位置在低端
            // 600+dp: "phone" UI with modifications for larger screens
            mHasSystemNavBar = true;
            mNavigationBarCanMove = false;
        }
        
       2.2:文字大小修改修改目录(例如拔插U盘的提示文字):
  2.2.1、 /autochips/frameworks/base/packages/SystemUI/res/values/styles.xml调节字体大小
  2.2.2、/autochips/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
  139行  可对照9030修改
 
  2.3:禁止下拉菜单:
autochips/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java中的
public boolean panelsEnabled() {
       // return ((mBar.mDisabled & StatusBarManager.DISABLE_EXPAND) == 0);
    return false;
    }
    
    2.4 ststusBar被设置黑色的问题:(打开音乐、视频、aux1、aux2、Browser等程序后,systemui底色会被设置成黑色)
    private void resetStatusBarBackground(int color) {
       if (mStatusbarService != null) {
            try {
                if (mStatusBarManager == null) {
                    mStatusBarManager = Class
                            .forName("android.app.StatusBarManager");
                    mMethod = mStatusBarManager.getMethod("resetBackground",
                            int.class);
                }
                if (mMethod != null) {
                    mMethod.invoke(mStatusbarService, color);//反射机制
                }
            } catch (Exception e) {
                mStatusBarManager = null;
                mMethod = null;
                e.printStackTrace();
            }
        }
    }


3、Radio:
4、Phone:
4.1 : 修改蓝牙初始配对码:/home/jbd_lingf/mtk8317/hd7010qijun_v0229/autochips/packages/apps/BlueTooth/src/com/autochips/bluetooth/BluetoothReceiver
  private void readDevicePin():方法里,这里是当系统为初始状态时,会给他这个方法给系统一个默认的配对码!
  384行为开机启动蓝牙!


5、USBipod:
1、读取设备启动程序:/home/jbd_lingf/mtk8317/hd9030_v0509/autochips/frameworks/base/core/java/android/mcucom/IMcuComService.aidl
//usbipod
void setUsbIpodPlugOut(boolean flag);
/home/jbd_lingf/mtk8317/hd9030_v0509/autochips/frameworks/base/core/java/android/mcucom/McuComManager.java
//////////////////////////////////MCUUPGRADE////////////////////////////////////////////
public void setMcuUpgradeClient()
    {
    Log.i(TAG, "========setMcuUpgradeClient enter==========");
try {
          mMcuComService.setMcuUpgradeClient(this);
      } catch (RemoteException e) {
          Log.e(TAG, "Dead object in setMcuUpgradeClient", e);
       }
    }


6、Music:
7、Video:
8、Setting:
9、Factory:
10、FileBrowser:
10.1 :判断apk文件类型,进行安装:
    if (selected_type == MultiMediaConstant.APK) {
        if (tolist.size() > 0) {
           String fileName = tolist.get(0).toString();
           Intent intent = new Intent(Intent.ACTION_VIEW);
           intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
           try {
               startActivity(intent);
           } catch (ActivityNotFoundException e) {
               e.printStackTrace();
               dialog.cancel();
               return;
           }
        }
            dialog.cancel();
        }
        
11、Browser:
11.1、默认打开页面:
autochips\device\atc\ac8317\.overlay\packages\apps\Browser\res目录下添加values\strings.xml
<string name="homepage_base" translatable="false">
https://www.baidu.com</string>  //默认打开百度
https://www.google.com/webhp?client={CID}&amp;source=android-home</string>//默认打开google 
编译:./selfbuild cpoverlay
mmm ./packages/apps/Browser
 
12、BlueFloatWindow:
13、DVR:
14、PictureBrowser:
15、Google框架程序:
15.1、去除或增加:
新建项目,将原来带有google相关的autochip打包拷贝到新建目录下并解压,然后按下面的步骤更改。改完后全编译新项目即可。


  15.1.1,将autochips/build/build.makeimage中的下面这段去掉:
mkdir -p $OUTPUT_SYS/preInstall
//   cp -vf $ANDROID_SRC/autochips/device/atc/google/app/DN6V6A_545A/*.apk $OUTPUT_SYS/app   
//   cp -vf $ANDROID_SRC/autochips/device/atc/google/app/DN6V6A_545A/*.so $OUTPUT_SYS/lib
//   cp -vf $ANDROID_SRC/autochips/device/atc/google/app/DN6V6A_545A/installapk/preinstall.sh $OUTPUT_SYS/bin
//   cp -vf $ANDROID_SRC/autochips/device/atc/google/app/DN6V6A_545A/installapk/*.apk $OUTPUT_SYS/preInstall


  15.1.2,将autochips/device/atc/ac8317/.overlay/build/core/makefile中的如下这段打开(去掉前面的#号):
#disable by whs for google playstore
#define check-product-copy-files
#$(if $(filter %.apk, $(1)),$(error \
#    Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))
#endef


修改为:


define check-product-copy-files
$(if $(filter %.apk, $(1)),$(error \
        Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))
endef


  15.1.3,将/autochips/device/atc/ac8317/.overlay/frameworks/base/data/etc/platform.xml中的如下这段去掉:
<feature name="android.hardware.location.network" /> 
    <feature name="android.hardware.camera.front" /> 
    <feature name="android.hardware.touchscreen" /> 
    <feature name="com.google.android.feature.GOOGLE_BUILD" /> 
    <feature name="android.hardware.bluetooth" /> 
    <feature name="android.hardware.camera" /> 
    <feature name="android.hardware.telephony" /> 
    <feature name="android.hardware.telephony.gsm" /> 
    <feature name="android.hardware.microphone" /> 
    <feature name="android.hardware.screen.landscape" /> 
    <feature name="android.hardware.touchscreen.multitouch" /> 


  15.1.4,将autochips/device/atc/ac8317/configs/init_for_mmc.rc修改如下段:


mount ext4 /dev/block/system  /system rw wait noatime nodiratime
修改为:mount ext4 /dev/block/system  /system ro wait noatime nodiratime

去掉:    chmod 0777 /system/bin/preinstall.sh
去掉:    chmod 4755 /system/xbin/su
去掉: service preinstall /system/bin/sh /system/bin/preinstall.sh
user root
group root
oneshot

on property:sys.boot_completed=1
start preinstall


  15.1.5,将/autochips/device/atc/ac8317/generic_ac8317.mk中的这段去掉:
  $(AUTOCHIPS_DIR)/device/atc/google/etc/permissions/com.google.android.maps.xml:system/etc/permissions/com.google.android.maps.xml \
  $(AUTOCHIPS_DIR)/device/atc/google/etc/permissions/features.xml:system/etc/permissions/features.xml \
  $(AUTOCHIPS_DIR)/device/atc/google/etc/permissions/com.google.android.media.effects.xml:system/etc/permissions/com.google.android.media.effects.xml \
  $(AUTOCHIPS_DIR)/device/atc/google/etc/permissions/com.google.widevine.software.drm.xml:system/etc/permissions/com.google.widevine.software.drm.xml \
  $(AUTOCHIPS_DIR)/device/atc/google/framework/com.google.android.maps.jar:system/framework/com.google.android.maps.jar \
  $(AUTOCHIPS_DIR)/device/atc/google/framework/com.google.android.media.effects.jar:system/framework/com.google.android.media.effects.jar \
  $(AUTOCHIPS_DIR)/device/atc/google/framework/com.google.widevine.software.drm.jar:system/framework/com.google.widevine.software.drm.jar \
  $(AUTOCHIPS_DIR)/device/atc/google/app/ChromeBookmarksSyncAdapter.apk:system/app/ChromeBookmarksSyncAdapter.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/ConfigUpdater.apk:system/app/ConfigUpdater.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/Gmail.apk:system/app/Gmail.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GmsCore.apk:system/app/GmsCore.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GoogleBackupTransport.apk:system/app/GoogleBackupTransport.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GoogleContactsSyncAdapter.apk:system/app/GoogleContactsSyncAdapter.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GoogleCalendarSyncAdapter.apk:system/app/GoogleCalendarSyncAdapter.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GoogleEars.apk:system/app/GoogleEars.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GoogleFeedback.apk:system/app/GoogleFeedback.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GoogleLoginService.apk:system/app/GoogleLoginService.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GooglePartnerSetup.apk:system/app/GooglePartnerSetup.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GooglePlus.apk:system/app/GooglePlus.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GoogleTTS.apk:system/app/GoogleTTS.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/GoogleServicesFramework.apk:system/app/GoogleServicesFramework.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/LatinImeDictionaryPack.apk:system/app/LatinImeDictionaryPack.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/MediaUploader.apk:system/app/MediaUploader.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/NetworkLocation.apk:system/app/NetworkLocation.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/OneTimeInitializer.apk:system/app/OneTimeInitializer.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/Phonesky.apk:system/app/Phonesky.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/app/VoiceSearchStub.apk:system/app/VoiceSearchStub.apk \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libAppDataSearch.so:system/lib/libAppDataSearch.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libfilterpack_facedetect.so:system/lib/libfilterpack_facedetect.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libfrsdk.so:system/lib/libfrsdk.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libgames_rtmp_jni.so:system/lib/libgames_rtmp_jni.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libgcomm_jni.so:system/lib/libgcomm_jni.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libgoogle_recognizer_jni.so:system/lib/libgoogle_recognizer_jni.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libgoogle_recognizer_jni_l.so:system/lib/libgoogle_recognizer_jni_l.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libgtalk_jni.so:system/lib/libgtalk_jni.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libgtalk_stabilize.so:system/lib/libgtalk_stabilize.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libjni_latinime.so:system/lib/libjni_latinime.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libpatts_engine_jni_api.so:system/lib/libpatts_engine_jni_api.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libplus_jni_v8.so:system/lib/libplus_jni_v8.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.antblur.so:system/lib/librs.antblur.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.antblur_constant.so:system/lib/librs.antblur_constant.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.antblur_drama.so:system/lib/librs.antblur_drama.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.drama.so:system/lib/librs.drama.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.film_base.so:system/lib/librs.film_base.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.fixedframe.so:system/lib/librs.fixedframe.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.grey.so:system/lib/librs.grey.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.image_wrapper.so:system/lib/librs.image_wrapper.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librs.retrolux.so:system/lib/librs.retrolux.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/librsjni.so:system/lib/librsjni.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libRSSupport.so:system/lib/libRSSupport.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libspeexwrapper.so:system/lib/libspeexwrapper.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libvcdecoder_jni.so:system/lib/libvcdecoder_jni.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libvorbisencoder.so:system/lib/libvorbisencoder.so \
  $(AUTOCHIPS_DIR)/device/atc/google/lib/libwebp_android.so:system/lib/libwebp_android.so \


  15.1.6,将autochips/device/atc/google目录删除
 
16、手机互联:
16.1权限:
    out/target/product/ac8317/system/xbin/usb_modeswitch-ec和adb-ec 右键权限改为6755


17、AUX:
17.1、暂停状态下Aux外接视频播放输出:
    AVInputActivity.java:
    protected void onPause() { //当AUX处于pause状态下
    setBackVideo(false); //决定是否输出视频!


二、小组件↓↓↓↓↓
1、版本号:
1.1: /home/jbd_fangym/mtk8317/hd1085_v0126/mtk_origin_8317/out/target/product/ac8317/system/build.prop    (瑞驰)
          ro.build.display.id=generic_ac8317-eng 4.4.4 JDQ39E eng.jbd_fangym.20161123.205100 test-keys
1.2:    /home/jbd_lingf/mtk8317/hd8016_yz07_v0509/autochips/packages/apps/ATCSetting/src/com/ATCSetting/mainui/VersionsFragment.java    (9030等)
version.setText("Myronmuller-M83_HD9020_V1.01_20161020");
1.3:   /home/jbd_lingf/mtk8317/r020_v0509/autochips/packages/apps/JBDSetting/src/com/yecon/carsetting/Dialog/Dialog_version.java
textView[6].setText(mContext.getResources().getString(R.string.general_about_Version,"V1.13_CABGBBAC"));   (r020等)
2、动态壁纸:
2.1、spectrum动画:
/home/jbd_lingf/mtk8317/hd7010qijun_v0509/out/target/product/ac8317/system/app/VisualizationWallpapers.apk
2.2、

3、截屏:
/home/jbd_lingf/mtk8317/hd7010qijun_Thailand/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java   
private void takeScreenshot() ;

/home/jbd_lingf/mtk8317/hd7010qijun_Thailand/autochips/frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
public class TakeScreenshotService extends Service 

/home/jbd_lingf/mtk8317/hd7010qijun_Thailand/autochips/frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
class SaveImageInBackgroundData {
    Context context;
    Bitmap image;
    Uri imageUri;
    Runnable finisher;
    int iconSize;
    int result;
}
 image用来保存截屏;
 imageUri保存截屏存放路径;
 finisher处理截屏的一个线程;
 iconSize截屏占用空间,
 result截屏结果,0表示截屏成功,1表示截屏失败。
 
 首先通过构造函数
 class GlobalScreenshot (...
 GlobalScreenshot(Context context)创建一个对象
 mWindowLayoutParams为窗口布局设置参数;
 mNotificationManager启动通知栏服务;
 mNotificationIconSize通知栏图标大小设置;
 mBgPadding截屏边框背景样式;
 mBgPaddingScale边框宽度;
 mCameraSound截屏声音设置。
 
 void takeScreenshot(...
 数组dims表示屏幕显示长宽像素数;
 degree表示屏幕自动旋转度数;
 如果屏幕自动旋转,则需要进行调整,通过Surface.screenshot((int) dims[0], (int) dims[1])将屏幕截屏,并暂时保存在变量mScreenBitmap中,
 紧接着调用 startAnimation,startAnimation函数主要实现两个功能:
 第一,实现截屏的动画效果;
 第二,将所获取截屏保存在指定的路径下。
 
 private void startAnimation(...
 函数createScreenshotDropInAnimation和createScreenshotDropOutAnimation分别表示截屏动画进入和退出。
 具体实现就不再分析,
 随后创建了AnimatorSet对象mScreenshotAnimation,
 该对象增加一个接口进行监听,主要实现截屏保存等操作。
 由mScreenshotLayout发送消息启动该操作,进入函数saveScreenshotInWorkerThread中。
 
 函数createScreenshotDropInAnimation和createScreenshotDropOutAnimation分别表示截屏动画进入和退出。具体实现就不再分析,随后创建了AnimatorSet对象mScreenshotAnimation,该对象增加一个接口进行监听,主要实现截屏保存等操作。由mScreenshotLayout发送消息启动该操作,进入函数saveScreenshotInWorkerThread中。
 
4、默认背景:默认壁纸
/autochips/device/atc/ac8317/.overlay/frameworks/base/core/res/res/values/config.xml
搜索:wallpaper  
<string name="default_wallpaper_component" translatable="false">fishnoodle.koipond_free/.WallpaperService</string> //默认设置为鱼
 <string name="default_wallpaper_component" >@null</string> //默认设置为 autochips/device/atc/ac8317/.overlay/frameworks/base/core/res/res/drawable-nodpi内的  default_wallpaper.jpg 文件为壁纸

5、音量条:
autochips/device/atc/ac8317/.overlay/frameworks/base/core/java/android/view/VolumePanel.java
autochips/device/atc/ac8317/.overlay/frameworks/base/core/res/res/values/dimens.xml
autochips/device/atc/ac8317/.overlay/frameworks/base/core/res/res/drawable-hdpi  //更改样式
frameworks/base/core/res/res/drawable-hdpi//更改样式


source ./selfenv
./selfenv cpoverlay
mmm ./frameworks/base/core/res //编译资源
mmm ./frameworks/base  //编译代码

6、WiFi:
6.1:WiFi开机启动代码/home/jbd_lingf/mtk8317/hd7011out_v0701/autochips/packages/apps/Settings/src/com/android/settings/wifi/WifiQuickBootReceiver.java
if("android.intent.action.BOOT_COMPLETED".equals(action))
{
Log.e(LOG_TAG,"Wifi android.intent.action.BOOT_COMPLETED: Wlan Enabled");
if (mWifiManager.getWifiState() == mWifiManager.WIFI_STATE_ENABLING
|| mWifiManager.getWifiState() == mWifiManager.WIFI_STATE_DISABLING) 
return;
if(mWifiManager.getWifiState() == mWifiManager.WIFI_STATE_DISABLED||mWifiManager.getWifiState() == mWifiManager.WIFI_STATE_UNKNOWN){
                Boolean enabled = mSharedPreference.getBoolean("OnOff",false);//zhou add
mWifiManager.setWifiEnabled(enabled );//zhou add
                 }
}


三、底层↓↓↓↓↓
1、默认字体:
Android系统中在Settings->Display->Font Size设置系统字体大小,默认的系统字体大小为普通(Normal),如果修改默认值,可以在下面这个文件中进行修改:
frameworks/base/core/java/android/content/res/Configuration.java文件中如下
public void setToDefaults() 这个方法中进行修改,
如:把默认字体要改为超大,把fontScale值改为1.15f,然后重新build framework.jar这个模块即可;
public void setToDefaults() {
fontScale = 1.15f; //normal value is 1
mcc = mnc = 0;


注意:Settings中系统的字体大小,在/packages/apps/Settings/res/values/arrays.xml文件中的”entryvalues_font_size”这个tag中定义
Small:0.9
Normal:1.0
Large:1.1
Extra Large:1.15
fontScale值必须是上述中的一个。


2、记忆模式:
autochips/frameworks/base/services/java/com/android/server/McuComService.java 
ProcessSystemStateOld(g_sys_stateoldold);  //注销此处可去除记忆模式


3、蓝牙增益调节:
/home/jbd_lingf/mtk8317/hd8016_yz07_v0509/autochips/frameworks/base/services/java/com/android/server/McuComService.java
  int[] pcmconfig = new int[2];
pcmconfig[0] = 1080;
if(g_sys_configdata[18]==0)//内置MIC
pcmconfig[1] = 15;
else if(g_sys_configdata[18]==1)//外置MIC
pcmconfig[1] = 25;
else if(g_sys_configdata[18]==2)//原车MIC
pcmconfig[1] = 20;


获取MIC状态:
private static byte[] g_sys_configdata = new byte[20];
AtcMetazone.readreserved(g_sys_configdata, 20);
如果g_sys_configdata【18】 ==0 内置
g_sys_configdata【18】 ==1  外置 
g_sys_configdata【18】 ==2 原车

设置MIC:
g_sys_configdata【18】 ==0 内置
g_sys_configdata【18】 ==1  外置 
g_sys_configdata【18】 ==2 原车
AtcMetazone. writereserved(g_sys_configdata, 20);
AtcMetazone. Flush(true);



4、前后喇叭调节:
/home/jbd_lingf/mtk8317/hd8016_yz07_v0509/autochips/frameworks/base/services/java/com/android/server/McuComService.java
    AtcSettings.Audio.SelectDAC(0,1,2);  //外置DAC时需要加 否则去掉
   
5、设置报警音量为0:
autochips/frameworks/base/services/java/com/android/server/McuComService.java  
am.setStreamVolume(AudioManager.STREAM_ALARM,0,0);//Even add by 20161020

autochips/frameworks/base/media/java/android/media/AudioManager.java
0,  // STREAM_ALARM  Even 20161020 set 0  249行

autochips/frameworks/base/media/java/android/media/AudioService.java
0,  // STREAM_ALARM Even 20161020 set 0   238行

 6、services里设置不扫描音乐与视频:
McuComService.java、
搜kaicer add 20160818
if((!initCheckSD())&&(!initCheckUSB()))//8498行   
{
Log.i(TAG, "=======SD_REMOVED======"+g_sys_devflag+"==g_sys_state=="+g_sys_stateoldold);
if((g_sys_devflag&0x02)==0x02)
{
//g_sys_devflag &= (~0x02);//kaicer mask 20160818
//SendMcuMultiData(McuComAddr.CAR_MCU_DEV_FLAG_ADR, TwoData(g_sys_devflag));//kaicer mask 20160818
//if(mSysAccOn)
{
if((g_sys_state == McuComSysState.CAR_MPEG_SYS_SD)||(g_sys_state == McuComSysState.CAR_MPEG_SYS_USB))
{
if(CheckAppRunningTop(MUSIC_PAKAGE)||CheckAppRunningTop(VIDEO_PAKAGE))
ProcessSystemStateOld(g_sys_stateoldold);
}
}
}
}


if(initCheckSD()||initCheckUSB())  //7667行
{
g_sys_devflag |= 0x02;
Log.i(TAG, "=======system have sd/usb======");
}
else
{
g_sys_devflag &= (~0x02);
Log.i(TAG, "=======system haven't sd/usb======nook");
}
g_sys_devflag |= 0x02;//kaicer add 20160818

7、扫描文件目录:
autochips/package/providers
扫描指定文件夹媒体文件:
private File filePath2 = null;  
private String fileType = null; 
private MusicSannerClient client=null;
private MediaScannerConnection mediaScanConn=null;
-----------------------------------------------------------
client = new MusicSannerClient();  
mediaScanConn = new MediaScannerConnection(mContext, client);  
scanfile(new File("/mnt/sdcard/Pictures"));//指定目录
-----------------------------------------------------------
class MusicSannerClient implements  MediaScannerConnection.MediaScannerConnectionClient {


@Override
public void onScanCompleted(String path, Uri uri) {
mediaScanConn.disconnect();  
}


@Override
public void onMediaScannerConnected() {
// TODO Auto-generated method stub
if (filePath2 != null) {  
                if (filePath2.isDirectory()) {  
                    File[] files = filePath2.listFiles();  
                    if (files != null) {  
                        for (int i = 0; i < files.length; i++) {  
                            if (files[i].isDirectory())  
                                scanfile(files[i]);  
                            else {  
                                mediaScanConn.scanFile(  
                                        files[i].getAbsolutePath(), fileType);  
                            }  
                        }  
                    }  
                }  
            }  
            filePath2 = null;  
            fileType = null;  
}
}
    private void scanfile(File f){
this.filePath2 = f;
mediaScanConn.connect();
}


8、屏参:
8.1、调屏幕驱动:
目前触摸屏有很多种,程序可根据配置文件进行区分,使所有机型共用同一个程序,方便管理。
触摸驱动添加说明如下:
8.1.1,一般先升级程序看一下触摸是否正常,如果不正常就需要修改驱动,添加此款触摸屏。
8.1.2,先从触摸屏厂家拿到配置文件和触摸按键坐标说明。
8.1.3,将touchscreen文件夹拷贝到hd7010_v0229/autochips/platform/kernel/drivers目录下。并打开此目录下的Makefile文件,将有touchscreen名字的地方前面#去掉,目的是让系统驱动编译时编译touchscreen目录。
8.1.4,打开touchscreen目录下的gt9xx.h,根据配置添加一个新屏,如下(添加航泰HC231121A1):
typedef enum
{
TOUCH_PANEL_NORMAL = 0,
TOUCH_PANEL_ZCC3367,//right up(zhongchu)
TOUCH_PANEL_ZCC3933,//right up
TOUCH_PANEL_ZCC3633,//left up
TOUCH_PANEL_ZCC3439,//left down
TOUCH_PANEL_ZCC2953,
TOUCH_PANEL_ZCC4210,//left up
TOUCH_PANEL_ZCC2974,
TOUCH_PANEL_ZCC4062,//left down
TOUCH_PANEL_YH917,//right up(yaorun)
TOUCH_PANEL_YH917B,//right up
TOUCH_PANEL_YH917B2,//right up
TOUCH_PANEL_ZHG0267A,//right up(zhonghai)
TOUCH_PANEL_ZHG0131A,//right up
TOUCH_PANEL_ZHG0131A_2,//right up
TOUCH_PANEL_ZHG0239A,//right up
TOUCH_PANEL_ZHG0274A,//right up
TOUCH_PANEL_ZHG0125C,//right up
TOUCH_PANEL_ZHG0331A,//left up
TOUCH_PANEL_ZHG0332A,//right up
TOUCH_PANEL_ZHC0590A,//left up
TOUCH_PANEL_RY318F,//right up
TOUCH_PANEL_ZP5023,//right up(zhongpei)
TOUCH_PANEL_ZP5023_2,//right up
TOUCH_PANEL_ZP5022,//right up
TOUCH_PANEL_ZP5022_2,//right up
TOUCH_PANEL_FGG102004A1,//right up(dingwei)
TOUCH_PANEL_HC231121A1,//right up(hangtai)
TOUCH_PANEL_MAX
}TOUCH_PANEL_ID;


unsigned char cfg_GT928_HC231121A1[] = {
0x41,0x4C,0x04,0x58,0x02,0x0A,0x3C,0x00,0x01,0x0F,
0x28,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x17,0x19,0x1C,0x14,0x8C,0x2E,0x0E,
0x2A,0x2C,0x31,0x0D,0x00,0x00,0x00,0x9B,0x02,0x11,
0x00,0x00,0x00,0x00,0x00,0x03,0x64,0x32,0x00,0x00,
0x00,0x26,0x50,0x94,0xC5,0x02,0x00,0x00,0x00,0x04,
0x82,0x29,0x00,0x76,0x2F,0x00,0x6B,0x37,0x00,0x62,
0x40,0x00,0x5C,0x4A,0x00,0x5C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,
0x12,0x14,0x16,0x18,0x1A,0x1C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x2A,0x29,0x28,0x26,0x24,0x22,0x21,0x20,
0x1F,0x1E,0x1D,0x1C,0x18,0x16,0x14,0x13,0x12,0x10,
0x0F,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x70,0x01
};


unsigned char *touchpanel_cfg[TOUCH_PANEL_MAX] = 
{
&cfg_GT911_3367,
&cfg_GT911_3933,
&cfg_GT928_3633,
&cfg_GT928_3439,
&cfg_GT928_2953,
&cfg_GT928_4210,
&cfg_GT928_2974,
&cfg_GT928_4062,
&cfg_GT928_YH917,
&cfg_GT928_YH917B,
&cfg_GT928_YH917B2,
&cfg_GT928_ZHG0267A,
&cfg_GT928_ZHG0131A,
&cfg_GT928_ZHG0131A_2,
&cfg_GT928_ZHG0239A,
&cfg_GT928_ZHG0274A,
&cfg_GT928_ZHG0125C,
&cfg_GT928_ZHG0331A,
&cfg_GT928_ZHG0332A,
&cfg_GT928_ZHC0590A,
&cfg_GT928_RY318F,
&cfg_GT928_ZP5023,
&cfg_GT928_ZP5023_2,
&cfg_GT928_ZP5022,
&cfg_GT928_ZP5022_2,
&cfg_GT928_FGG102004A1,
&cfg_GT928_HC231121A1,
};
8.1.5,打开gt9xx.c,找到gtp_touch_down和gtp_touch_up函数,根据坐标原点类型找一个相似的屏复制拷贝进行修改。
8.1.5.如果有语音键的话需要在/home/jbd_lingf/mtk8317/hd8016_yz07_v0509/autochips/frameworks/base/policy/src/com/android/internal/policy/impl 目录下的PhoneWindowManager.java文件里找到keyCode == KeyEvent.KEYCODE_INSERT代码,在里面加上编号(gMCM.getTouchPanelID()==36)。
8.1.6,修改完后用./selfbuild driver编译,然后./selfbuild makeimage。
8.1.7,编译后将out/target/product/ac8317/system/drivers/ac83xxts.ko拷贝出来备份,同时将touchscreen拷贝出来备份,然后将touchscreen目录删除,将/autochips/platfrom/kernel/drivers/output/ac83xxts.ko删除,将/autochips/platfrom/kernel/drivers/Makefile文件中touchscreen部分用#屏蔽。
8.1.8,将拷贝出来的ac83xxts.ko文件同步到所有机型的/autochips/device/atc/ac8317/mylib目录和out/target/product/ac8317/system/drivers目录下。然后./selfbuild makeimage即可

8.2、屏触按键:
 GPIO_MultiFun_Set(PIN_120_SP0_CS, PINMUX_LEVEL_GPIO_END_FLAG);//电源
gpio_direction_output(PIN_120_SP0_CS, 0);
return;

input_report_key(ts->input_dev, KEY_INSERT, 1);//语音
return;

input_report_key(ts->input_dev, KEY_HOMEPAGE, 1);//主页
return;

input_report_key(ts->input_dev, KEY_F12, 1);//音量-
return;

input_report_key(ts->input_dev, KEY_F11, 1);//音量+
return;

input_report_key(ts->input_dev, KEY_BACK, 1);//返回
return;

input_report_key(ts->input_dev, KEY_MUTE, 1);//静音
return;

9、默认语言:
autochips/device/atc/ac8317/configs/init_for_mmc.rc  
setprop ro.product.locale.language   en//英文      zh//中文
setprop ro.product.locale.region   US//美国地区 cn//中国地区


10、开机语音:
/home/jbd_fangym/mtk8317/hd1085_v0126/mtk_origin_8317/autochips/device/atc/ac8317/.overlay/frameworks/base/cmds/bootanimation/BootAnimation.CPP
音量调节:/home/jbd_fangym/mtk8317/hd1085_v0126/mtk_origin_8317/autochips/frameworks/base/media/java/android/media/AudioManager.java 252


11、开机动画:
/home/jbd_fangym/mtk8317/hd1085_v0126/mtk_origin_8317/out/target/product/ac8317/system/media
/home/jbd_fangym/mtk8317/hd1085_v0126/mtk_origin_8317/autochips/device/atc/ac8317/mylib


12、开机Logo:
autochips/packages/apps/Factory_1024/assets
autochips/platform/uboot/tools/logo.mrf  


13、屏幕移动:
/home/jbd_lingf/mtk8317/hd8025_v0509/autochips/platform/arm2/display/display.c    
    // vTconTimingInput(TRUE, u4LCDHStart, u4LCDHStart + _u4LCDWidth, u4LCDVStart, u4LCDVStart + _u4LCDHeight);   //正常情况
vTconTimingInput(TRUE, 94, 94 + _u4LCDWidth, u4LCDVStart, u4LCDVStart + _u4LCDHeight);   //移动  
./selfbuild arm2

14、默认键盘:
autochips/device/atc/ac8317/.overlay/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadSecureSettings方法:
先copy over
mmm frameworks/base/packages/SettingsProvider

15、倒车状态下音量:
McuComService.java
private static int g_sys_backvol = 0;

16、拔插U盘:
16.1:检测
/autochips/frameworks/base/services/java/com/android/server/McuComService.java
  private final BroadcastReceiver detectListener = new BroadcastReceiver() {
  public void onReceive(Context context, Intent intent) {
String USB_CONNECTED = Intent.ACTION_UMS_CONNECTED;//插USB
String USB_REMOVED = Intent.ACTION_MEDIA_REMOVED;//拔USB
String SD_MOUNTED = Intent.ACTION_MEDIA_MOUNTED;//装SD
String SD_EJECT = Intent.ACTION_MEDIA_EJECT;//卸SD
。。。


17、历史记录中筛除某程序!
   /home/jbd_lingf/mtk8317/hd8016_yz07_v0509/autochips/frameworks/base/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
        TaskDescription td;
        for (int i = 0; i < mRecentTaskDescriptions.size(); i++) {
           td = mRecentTaskDescriptions.get(i);
if(td.packageName.equals("com.autochips.ipodplayer"))//添加要去掉的程序包名
mRecentTaskDescriptions.remove(i);
}


18、关闭屏幕:
byte[] data_dn = McuComKey.getKeyData(
McuComKey.CAR_KEY_ATTR_TOUCH,
McuComKey.SHORTKEY,
McuComKey.CAR_KEY_TFT_SCR_POWER);
send_command(McuComAddr.CAR_MPEG_KEY_ADR, data_dn);

private void send_command(int carMpegKeyAdr, byte[] data_dn) {
// TODO Auto-generated method stub
if (null == gMCM)
gMCM = new McuComManager();


if (null != gMCM)
gMCM.sendMcuComMultiData(carMpegKeyAdr, data_dn);
}
}


19、开机动画配置文件目录:
autochips/platform/uboot/tools/metazone.bin


20、修改长按主页呼出最近打开程序
   修改autochips\frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java
   见注释部分(//kaicer mask for home longpress 20160509)
   编译目录:mmm ./frameworks/base/policy
   
 21、修改划分data/app目录的容量大小:
  /home/jbd_lingf/mtk8317/hd9030_v0509/autochips/build/build.makeimage
  $MKFS_BIN -s -l 500M system.img.ext4 ./system
             $MKFS_BIN -s -l 2000M data.img.ext4 ./data 
        $MKFS_BIN -s -l 100M databk.img.ext4 ./data 
    另还需同步scatter.mmcboot.ext4.xml与scatter.mmcboot.ext4.xml
    
 22、      


四、协议↓↓↓↓↓ 1、丰田协议功放不能调节音量:
关键在于:getSystemFirstOn();
autochips/frameworks/base/media/java/android/media/AudioService.java   
setStreamVolume方法 975行  
getStreamVolume方法  1317行  
getStreamMaxVolume方法  1388方法  

autochips/frameworks/base/media/java/android/media/AudioManager.java    
autochips/frameworks/base/services/java/com/android/server/McuComService.java    9402行  重写getSystemFirstOn()方法
autochips/packages/apps/ATCSetting/src/com/ATCSetting/mainui/AudioFragment.java  onProgressChanged方法  301行
autochips/device/atc/ac8317/.overlay/frameworks/base/core/java/android/view/VolumePanel.java
autochips/frameworks/base/core/java/android/mcucom/IMcuComService.aidl   抽象getSystemFirstOn()方法  11行
autochips/frameworks/base/core/java/android/mcucom/McuComManager.java   实例public boolean getSystemFirstOn() 方法  389行


2、丰田协议里的全景与倒车问题冲突:
autochips/frameworks/base/services/java/com/android/server/McuComService.java
private static boolean panoramaMode = false;
Log.i("md", "==========panoramaFlag2 =="+panoramaFlag2);
if((getBackcarState()==0)&&(!panoramaMode)){//默认状况下 可以开启全景
Log.i("dmd","=====ing======0=0x08=="+(g_can_sysinfo[0]&0x08));
if((g_can_sysinfo[0]&0x08)==0x08){//进来后接收到切换命令给panoramaMode为ture
Log.i("dmd","===========0=0x08=="+(g_can_sysinfo[0]&0x08));
panoramaMode = true;//全景倒车状态
if(!CheckAppRunning(BACK_PAKAGE)){//切全景
Log.i("dmd","=====in======0=0x08=="+(g_can_sysinfo[0]&0x08));
backByKey();
}
}
}
if(panoramaMode)//判断当是倒车还是全景倒车状态
{
 if((g_can_sysinfo[0]&0x08)==0){//接收到切出全景命令


Log.i("dmd","=====out======0=="+(g_can_sysinfo[0]&0x08));
panoramaMode = false;//给panoramaMode一个false值 说明当前不是切得全景界面
if(CheckAppRunning(BACK_PAKAGE)){//当当前是倒车界面切出来
backByKey();
panoramaFlag2 = false;
}
   }
}
//当进入倒车界面接收到退出全景命令时, 是不会进任何切换代码的!

3、面板、中控按键值整理:
  if(mGoogleSearchAppExist)   ChangeToApp(GOOGLESPEECH_PAKAGE,"none");   //谷歌语音
CAR_KEY_BT_SEL  进蓝牙程序
CAR_KEY_RADIO_SEL  进收音程序
CAR_KEY_AUDIO_MUTE  静音
CAR_KEY_ANSWER  接电话  CAR_KEY_HUNGUP  挂电话
CAR_KEY_SEEK_UP  收音频率加扫描  CAR_KEY_SEEK_DN   收音频率减扫描
CAR_KEY_SEEK_UP_Encoder收音上一个频率  CAR_KEY_SEEK_DN_Encoder  收音下一个频率
CAR_KEY_MODE  模式
CAR_KEY_VOL_UP  音量+   CAR_KEY_VOL_DN 音量-
CAR_KEY_MAIN_MENU  主页
CAR_KEY_PLAYPAUSE  播放暂停
CAR_KEY_CH_UP 上一曲   CAR_KEY_CH_DN 下一曲
CAR_KEY_BAND  收音里的BAND   

g_sys_timesel = false;  //进设置  true的话是时间
if(CheckAppRunningTop(SETUP_PAKAGE)){
KillRunningApp(SETUP_PAKAGE);
}
ChangeToApp(SETUP_PAKAGE,SETUP_MAINACTIVITY);

CAR_KEY_MENU_BACK  返回  
 
 4、 开/关acc发送请求:
 
  case McuComAddr.CAR_GPS_MEMORY_MAP_ADR://开关ACC   
  if(datal==1)
  {//关}
  else
  {//开}
 
 
 5、丰田低于10KM/H时弹出360全景:
  back.apk
  if(panoramaFlag){//  panorama   fengtian
if(getBackcarState()){//back
if(x<250&&y>450){//bottom left corner 
Log.i("dmd","=======0x04====");
// backState = true;
sendCmdPpanorama((byte)0x21,(byte)0x04);//100
}else if(x>530&&y>510&&x<680){//bottom right corner 
Log.i("dmd","=======0x07====");
sendCmdPpanorama((byte)0x21,(byte)0x07);//111
}else if(x>830&&y>510){//bottom right corner 
// if(backState){
Log.i("dmd","=======0x07=all===");
sendCmdPpanorama((byte)0x21,(byte)0x03);//011
// }
}
}else {//view
if(x<250&&y>450){//bottom left corner 
sendCmdPpanorama((byte)0x21,(byte)0x02);//010
}
if(x>530&&y>510&&x<680){//bottom right corner 
sendCmdPpanorama((byte)0x21,(byte)0x01);//001
}
}
}

6、关于处理CANBUS盒发送的ASCII码的方法:
byte[] bs = WindowService.g_can_onstarwlan;//拿到数据集合
String s = "";
for (int i = 0; i < bs.length; i++) {
Log.i("md", bs[i]+"=========");
if(bs[i]==0){
s = new String(bs,0,i);//从0开始将ASCII码转成String类型数据
break;
}
}

六、android笔记↓↓↓↓↓ 1、EditText:
 1.1 : 让EditText不能自动获取焦点:(获取焦点会自动弹出键盘)
  解决之道:在EditText的父级控件中找一个,设置成
   android:focusable="true"  
   android:focusableInTouchMode="true"
  这样,就把EditText默认的行为截断了!


1.2 : text_call_info.setInputType(InputType.TYPE_NULL); //不弹出软键盘: 
text_call_info.setText("");  3

1.3 : EditText.getSelectionStart();获取光标的位置
    Editable etext = inputField.getText(); 
      int position = etext.length(); 
        Selection.setSelection(etext, position);
        //可以将光标移动到EditText文本的右边。  
*editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(100)});  //其中100最大输入字数
*android:maxLength="100"

2、Toast:
     2.1、 例:autochips/packages/apps/ATCSetting/src/com/ATC/audio/EqulizerFragment.java   弹出EQ调节值显示
      showToast(string+"");
      private Toast mToast;
      private void showToast(String ss) {
       if (mToast == null) {
           mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
       }
       mToast.setText(ss); 
       mToast.setGravity(Gravity.TOP,-175, 35);//移动窗口显示位置
       mToast.show();
   }
   
 2.2、


3、Handler:
   主要作用是介绍子线程的数据,并用此数据来配合主线程更新UI;handler可以分发Message对象和Runnable对象到主线程中;
   1.安排Message或Runnable在某个主线程中某个地方执行;
   2.安排一个动作在不同的线程中执行;
   Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long) 


Handler.removeCallbacksAndMessages(null):线程回收,避免内存泄漏

4、消除gridview、listview、scroollview消除拖动阴影的方法:
     view.setOverScrollMode(View.OVER_SCROLL_NEVER):


5、ListView:
5.1、监听滑动到顶部和底部的方法:
    ListView().setOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }


            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if(firstVisibleItem==0){
                    Log.e("log", "滑到顶部");
                }
                if(visibleItemCount+firstVisibleItem==totalItemCount){
                    Log.e("log", "滑到底部");
                }
            }
        });
  
  5.2、动态实现listview选中的item固定与顶端的距离;
   listView.setSelectionFromTop(int position, int Y):
   Y:为当前item距离顶部的距离;
   position:当前选择item;
   *实现点击任何按钮界面,listview都会显示当前播放歌曲item为列表固定位置;
    listView.setAdapter(mAdapter);//重新加载列表
//固定离顶端距离
if (songfile.size() > 6) {
try {
mTrackList.setSelectionFromTop(mService.getQueuePosition(), 115);
} catch (RemoteException e) {
e.printStackTrace();
}
}
     
Android:cacheColorHint="#00000000":滑动不变背景
    listview.setCacheColorHint(Color.TRANSPARENT):滑动不变背景
    ListView.setSelector(R.drawable.adapter_background);设置点击变换背景
    加载item动画:
    动画效果: <alpha                         
                  android:duration="300"
                  android:fromAlpha="0"//初始透明度
                  android:toAlpha="1.0"  />//结束透明度
               </set>
    动画文件:<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
              android:delay="2"
              android:animationOrder="normal"
              android:animation="@anim/list_anim"/>
    然后在ListView中添加动画文件:
              android:layoutAnimation="@anim/list_anim_layout"
    接着在Adapter里将动画加载进去:
              Animation animation = (Animation) AnimationUtils.loadAnimation(mContext, R.anim.list_anim);
              LayoutAnimationController lac = new LayoutAnimationController(animation);
              lac.setDelay(0.4f);  //设置动画间隔时间
              lac.setOrder(LayoutAnimationController.ORDER_NORMAL); //设置列表的显示顺序
              mListView.setLayoutAnimation(lac);  //为ListView 添加动画
5.3、内存优化:
   public View getView(int position,Viewconvert View,ViewGroup parent)  { 
        ViewHolderholder; 
   if(convertView==null){ 
   convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
   holder=newViewHolder(); 
   holder.tv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 
   holder.tv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
   convertView.setTag(holder); 
   } else {
   holder=(ViewHolder)convertView.getTag(); 
   } 
   ContactInfo1confo=contacts.get(position); 
   Log.i("my","confo"+confo.getContactName()); 
   if(confo!=null){//toseteveryitem'stext 
   holder.tv_name.setText(confo.getContactName()); 
   holder.tv_phone.setText(confo.getContact_Phone()); 
   } 
   returnconvertView; 
   } 
   classViewHolder 
  { 
  TextViewtv_name,tv_phone; 
  } 
  
6、onClick:
6.1、点击事件模板: 
    button=(Button) findViewById(R.id.button1);              
 button.setOnClickListener(ClickListener);
 private View.OnClickListener ClickListener = new View.OnClickListener() {
          
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
Toast.makeText(MainActivity.this, "button", 0).show();
break;

7、GridView:
7.1:通过GridView的滑动监听,来控制翻页按钮的状态:
private class GridViewScrollListener implements OnScrollListener{


@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}


@Override
public void onScroll(AbsListView view, //报告滚动状态的视图
int firstVisibleItem,//第一个可见item的索引
int visibleItemCount,//可见item的数量
int totalItemCount)//项目列表中的适配器的数量
 {
if (firstVisibleItem==0) {
View view2 = gridView.getChildAt(firstVisibleItem);
if (view2!=null) {
Log.i("TAG","view2.getY()"+view2.getY());
if (view2.getY() == 8) {//在顶部
button_up.setBackgroundResource(R.drawable.upb);//向上的键为灰色
button_up.setClickable(false);//且不能按
} else {
button_up.setBackgroundResource(R.drawable.upg);//向上的键为白色
button_up.setClickable(true);//能按
}
}
}else{
button_up.setBackgroundResource(R.drawable.upg);//向上的键为白色
button_up.setClickable(true);//能按
}if ((firstVisibleItem+visibleItemCount)==totalItemCount) {
View view3 = gridView.getChildAt(totalItemCount-1-firstVisibleItem);//scrollview所占的高度
if (view3!=null) {
Log.i("TAG","view3.getY()"+view3.getY());
if (view3.getY() == 246) {//在底部
button_down.setBackgroundResource(R.drawable.downb);//向下的键为灰色
button_down.setClickable(false);//且不能按
} else {
button_down.setBackgroundResource(R.drawable.downg);//向下的键为白色
button_down.setClickable(true);//能按
}
}
}else{//在中部
button_down.setBackgroundResource(R.drawable.downg);//向下的键为白色
button_down.setClickable(true);//能按
}
}
}

8、代码实现一个帧动画:
   if(image != null) {
image.setBackgroundResource(image_addr[number]);
number++;
if(number > 10) number = 0;
}


9、TextView:
只显示一行,超过自动隔断:
  1.文字长度长于可显示范围:android:singleLine="true"
  2.设置可滚到,或显示样式:android:ellipsize="marquee"
   
10、ToaggleButton:开关按钮
   效果较炫酷的开关按钮,就是还没发现怎么去控制图片的大小,所以还是不要去常用!
   toaggleButton.setOnCheckedChanfeListener(new OnCheckedChangeListener(){
    @Override
public void onCheckedChanged(CompoundButton arg0, boolean isChecked) {
if(isChecked){
//打开状态
}else{
  //关闭状态
}
}
});

11、监听状态栏的状态:
11.1:@Override
public void onWindowAttributesChanged(LayoutParams params) {
super.onWindowAttributesChanged(params);
Log.i("TAG","全屏状态"+getWindow().getAttributes().flags);
if(getWindow().getAttributes().flags==8455424){//根据具体情况
Log.i("TAG","全屏状态");
}else if(getWindow().getAttributes().flags==8454400){
Log.i("TAG","非全屏状态");
}
}

11.2:@Override
public void onSystemUiVisibilityChange(int visibility) {
if (visibility==View.SYSTEM_UI_FLAG_FULLSCREEN||visibility==View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) {
Log.i("TAG","全屏状态======");
}else{
Log.i("TAG","非全屏状态======");
}
}
注意要加:setOnSystemUiVisibilityChangeListener(this);

11.3:
动态状态栏的显示与隐藏:
    View类提供了setSystemUiVisibility和getSystemUiVisibility方法,这两个方法实现对状态栏的动态显示或隐藏的操作,以及获取状态栏当前可见性。
    setSystemUiVisibility(int visibility)方法可传入的实参为:
    1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态的正常情况)。
    2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。
    3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。
    4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
    5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
    8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
    
   
12、判断系统状态的显示12/24时间制
boolean flag = DateFormat.is24HourFormat(this);
SimpleDateFormat dateFormat = null;
if (flag) {
dateFormat = new SimpleDateFormat(getResources().getString(R.string.macher1));//24小时
}else{
dateFormat = new SimpleDateFormat(getResources().getString(R.string.macher2));//12小时
}


13、延时操作:
        13.1:
          if(!isExit) {
             isExit = true;           
             new Timer().schedule(new TimerTask() {
                 
                 @Override
                 public void run() {
                     isExit = false;
                }
             }, 2000);
          } else {
             finish();
           }
   
14、Context  :
Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的
资源和类型,是一个统领一些资源(应用程序环境变量等)的上下文。 


15、打开APP
private void openApp(String packageName) {//传入包名
    Intent mintent =getPackageManager().getLaunchIntentForPackage(packageName);
    startActivity(mintent);
    }
    
16、一个apk启动另一个apk
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
     ComponentName comp = new ComponentName("com.md.carinfo", "com.md.info.MainActivity");    
     mIntent.setComponent(comp);     
     mIntent.setAction("android.intent.action.VIEW");     
     startActivity(mIntent);  
     
17、SharedPreferences:
轻量级的储存 保存用户的某些settings值等  
http://www.cnblogs.com/zhaoxiaowei/p/3733272.html
    SharedPreferences preferences = context.getSharedPreferences("index", Context.MODE_PRIVATE);    
 
18、访问另一个activitry的view控件的方法:
   首先在MainActivity.class:
   public static View tThis;
   ...
   tThis = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main, null);
setContentView(tThis);

OntherActivity.class:
toggleButton_radio_key=(ToggleButton)MainActivity.tThis.findViewById(R.id.toggleButton_radio_key);        
   
19、ViewPager加载步骤以及滑动监听Demo:
    一、<android.support.v4.view.ViewPager    这个组件,注意这个组件是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的。
        android:id="@+id/viewpager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" > 
    二、LayoutInflater lf = getLayoutInflater().from(this);
  view1 = lf.inflate(R.layout.layout1, null);
  view2 = lf.inflate(R.layout.layout2, null);
  view3 = lf.inflate(R.layout.layout3, null);
  viewList = new ArrayList<View>();// 将要分页显示的View装入数组中 private ArrayList<View> viewList;//把需要滑动的页卡添加到这个list中  
  viewList.add(view1);
  viewList.add(view2);
  viewList.add(view3);
 三、PagerAdapter pagerAdapter = new PagerAdapter() {
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getCount() {
return viewList.size();//返回页卡的数量
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {//删除页卡
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {//这个方法用来实例化页卡
container.addView(viewList.get(position));//添加页卡
return viewList.get(position);
}
@Override2016/6/27 星期一 上午 9:18:45
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
};
   四、viewPager.setOnPageChangeListener(new MyOnPageChangeListener());//获取viewpager的滑动监听
      public class MyOnPageChangeListener implements OnPageChangeListener{
    @Override
  public void onPageScrollStateChanged(int arg0) {
  }
    @Override
  public void onPageScrolled(int arg0, float arg1, int arg2) {
  }
    @Override
  public void onPageSelected(int arg0) {
  Log.i("TAG", "arg0="+arg0);
  }
  }


20、WakeLock机制:阻止APP进入休眠状态:
  为确保应用程序中的关键代码执行,使用应用程序有权通过代码阻止APP进入休眠状态,阻止屏幕变暗;  
  PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
  WakeLock sCpuWakeLock = pm.newWakeLock( 
                PowerManager.FULL_WAKE_LOCK | 
                PowerManager.ACQUIRE_CAUSES_WAKEUP,"okTag"); 
  if (sCpuWakeLock!= null) {          
  sCpuWakeLock.release(); 
  sCpuWakeLock = null; 
  }
  PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。 
  SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯 
  SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,允许关闭键盘灯 
  FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度 
  ACQUIRE_CAUSES_WAKEUP:不会唤醒设备,强制屏幕马上高亮显示,键盘灯开启。有一个例外,如果有notification弹出的话,会唤醒设备。 
  ON_AFTER_RELEASE:WakeLock 被释放后,维持屏幕亮度一小段时间,减少WakeLock 循环时的闪烁情况
  如果申请了partial wakelock,那么即使按Power键,系统也不会进Sleep,如Music播放时 如果申请了其它的wakelocks,按Power键,
  系统还是会进Sleep
  
21、滚动条设置
    gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));去除点击GridView后系统设定的背景色
    android:scrollbars设置滚动条显示:none(隐藏),horizontal(水平),vertical(垂直)
    android:scrollbarTrackVertical:设置垂直滚动条背景(轨迹)的drawable注意直接设置颜色值
    android:scrollbarTrackHorizontal:设置水平滚动条背景(轨迹)的色drawable(如颜色)
    android:scrollbarThumbVertical:设置垂直滚动条的drawable(如颜色).
    例如:android:scrollbarThumbVertical="@drawable/scroll_bar" 
    android:scrollbarThumbHorizontal设置水平滚动条的drawable(如颜色)。
    android:scrollbarStyle:可以定义滚动条的样式和位置,可选值有insideOverlay、insideInset、outsideOverlay、outsideInset四种。
    其中inside和outside分别表示是否在view的padding区域内,overlay和inset表示覆盖在view上或是插在view后面,所以四种值分别表示:
    insideOverlay:默认值,表示在padding区域内并且覆盖在view上
    insideInset:表示在padding区域内并且插入在view后面
    outsideOverlay:表示在padding区域外并且覆盖在view上,推荐这个
    outsideInset:表示在padding区域外并且插入在view后面
    android:scrollbarSize:设置滚动条的宽度。
    android:scrollbarFadeDuration:设置滚动条淡出效果(从有到慢慢的变淡直至消失)时间,以毫秒为单位
    android:scrollbarDefaultDelayBeforeFade:设置N毫秒后开始淡化,以毫秒为单位。
    android:scrollbarAlwaysDrawVerticalTrack:设置是否始终显示垂直滚动条。这里用ScrollView、ListView测试均没有效果。
    android:scrollbarAlwaysDrawHorizontalTrack:设置是否始终显示垂直滚动条。这里用ScrollView、ListView测试均没有效果。
    android:fadeScrollbars:是否隐藏滚动条/ScrollView没有效果   
    android:scrollbars="none":ScrollView测试结果为是否隐藏滚动条
    
    
 22、Folat.parseFloat(String)
  表示把String字符串转换成float原始类型的单精度数值;Float.ValueOf(String)是把String字符串转换成float的封装类Float;floatalue()
  的作用是把封装类的Foloat转换成原始类型float;ps:float是数值,而Float是一个类;
  
  23、子线程间隔发送:
  -----------------------这个是可以开启子线程时--------------------
  /*private void aaa() {
// TODO Auto-generated method stub
sendld2((byte)0x01);//开
Handler handler1 = new Handler();
handler1.postDelayed(new Runnable(){
public void run(){
ys4();
sendld((byte)0x36);
}
},150);


}






protected void ys4() {
// TODO Auto-generated method stub
Handler handler2 = new Handler();
handler2.postDelayed(new Runnable(){
public void run(){
ys3();
sendld((byte)0x21);
}
},150);


}






protected void ys3() {
// TODO Auto-generated method stub
Handler handler3 = new Handler();
handler3.postDelayed(new Runnable(){
public void run(){
ys1();
sendld((byte)0x40);
}
},150);


}






protected void ys1() {
// TODO Auto-generated method stub
Handler handler4 = new Handler();
handler4.postDelayed(new Runnable(){
public void run(){
sendld((byte)0x7f);
}
},150);


}*/  

-----------------------这个是当不能开启子线程时---------------------
g_can_requestdata_count=90;
Runnable SysTimeThread = new Thread() {


public void run() {
do
{
try {
if(g_can_requestdata_count>0)
g_can_requestdata_count--;
if(g_can_requestdata_count==75)
sendld((byte)0x36);
if(g_can_requestdata_count==60)
sendld((byte)0x21);
if(g_can_requestdata_count==45)
sendld((byte)0x40);
if(g_can_requestdata_count==30)
sendld((byte)0x7f);
Thread.sleep(10);//10ms
} catch (Exception e) {
// TODO Auto-generated catch block
}
}while(true);
}
};      
七、其他↓↓↓↓↓ 1、8位(bit)= 1字节(byte)
      1024*字节 = 1KB
      1024*1KB  = 1MB(兆)
      1024*1MB  = 1GB
      
2、服务器新建项目:
tar -xvf + mtk_origin_ac8317_20150708.tar.gz   //解压
tar cvf +生成的包名 + 需要压缩的包       //生成压缩包


3、adb
   adb remount:获取权限
   adb shell:进入adb内部
   adb rm .apk删除应用程序
   adb push .apk system/app:安装系统应用
   adb reboot:重启
   am dispaly-size 1024x600 //更改屏幕分辨率

4、Clasclasscastexception:
   类型转换错误,当前者域小于后者的时候出现,例如:前者A是子类的对象,而后者B是父类的对象,若使用A=B,就会抛出这个错误;
   
5、“1” 转成“01”“001”
利用DecimalFormat数字格式化,相应的可以利用SimpleDateFormat对时间格式化
import java.text.DecimalFormat;
import java.text.Format;
public class $ {
    public static void main(String[] args) {
        int num = 1;
        Format f1 = new DecimalFormat("000");
        System.out.println(f1.format(num));
        Format f2 = new DecimalFormat("00");
        System.out.println(f2.format(num));
    }
}


6、notfindclassexception错误:
   之前一直是出现此类问题只能cmd删除包、app的方法就可以1/3的几率解决问题,
   新建项目,再cope代码报的是非法操作的错误,问群里,回答是没有回调
   public void notifyDataSetChanged() {super.notifyDataSetChanged();},我在adapter里添加了该方法依然没解决,
   基平把项目里的v7v4包全删了,然后在v4的源代码放到项目里,接着把initView()末端的viewPager.setAdapter(vpAdapter);
   放到了initData()类末端;程序就能正常运行,因为是adapter起冲突了;
   
 7、增加adb系统变量:
   名:ADB_HOME;值:F:\java\android-sdk-windows\platform-tools;之后,打开cmd,可以直接adb.shell,控制模拟器!
   
 8、adb死循环反复挂起:
  试过了任务管理器结束adb进程,重启eclipse,reset adb方法依然没有解决问题,基平先把数据线拔了,然后任务管理器里
   删除adb.EXE,然后在用户环境变量里增加了一个变量名为:ANDROID_ADB_SERVER_PORT;变量值:51234;意图是让eclipse独有一个adb线程;
   之后,就再没出现问题;
   
9、Math.round的取值:
   小数点后第一位=5
   正数:Math.round(11.5)=12
   负数:Math.round(-11.5)=-11
   小数点后第一位<5
   正数:Math.round(11.46)=11
   负数:Math.round(-11.46)=-11
   小数点后第一位>5
   正数:Math.round(11.68)=12
   负数:Math.round(-11.68)=-12
   
10、网站:
   安卓源码查看网站:http://www.grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android-apps/   
   
11. #添加点击后的系统点击声音:
   View.playSoundEffect(android.view.SoundEffectConstants.CLICK);   
   
12、判断两个字符是否一样:
    textView1.getText().toString().equals(textView2.getText().toString());
    
 13、判断ImagerView的src是否为指定图片:
    image[0].getDrawable().getCurrent().getConstantState().equals(getResources().
getDrawable(R.drawable.ios7_switch_off).getConstantState())  

14、19、开机动画广播:
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
    监听这个广播就会监听开机状态
    
15、修改更换语言后,主界面往右靠拢和状态栏时间显示的问题解决方法:(来这工作碰到的第一个问题)
    (1)当系统设为阿拉伯文整体文字都会从右到左,但有些是不要的,要从左到右:apps\Launcher2\res\layout-      landlauncher.xml 23行增加:  android:layoutDirection="ltr" android:layoutDirection="ltr" 即可,意为消除语言对布局的影响
    (2)Locale locale = new Locale("America/Los_Angeles"); ===数字和时钟等都不用反。设为本地码Los_Angeles
      DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale);
      Format = new DecimalFormat(".00",symbols);   
    系统标题栏更改时间的显示:
/home/jbd_lingf/mtk8317/r020_v0229/autochips/frameworks/base/packages/SystemUI


autochips/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java


TextView time_text = (TextView) mStatusBarWindow.findViewById(R.id.f_time);
TextView time_text = (TextView) mStatusBarWindow.findViewById(R.id.f_time);
TextView maohao_text = (TextView) mStatusBarWindow.findViewById(R.id.f_maohao);
TextView ampm_text = (TextView) mStatusBarWindow.findViewById(R.id.f_ampm);
       //llf add begin 2016.03.14阿拉伯文收音挂件显示,调用本地码函数。
   Locale locale = new Locale("America/Los_Angeles");
   DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale);
   Format = new DecimalFormat("00",symbols);
//llf add end 2016.03.14
//llf add begin 2016.03.22阿拉伯文收音挂件显示,调用本地码函数。 PhoneStatusBar.java  lines:2958
Locale locale1 = new Locale("America/Los_Angeles");
 SimpleDateFormat dateFormat24 = new SimpleDateFormat(" HH:mm", locale1);
 SimpleDateFormat dateFormat12 = new SimpleDateFormat(" hh:mm", locale1);
Long long1 = System.currentTimeMillis();
 if(b24) time = dateFormat24.format(long1);
 else time = dateFormat12.format(long1);

      位置:/home/jbd_lingf/mtk8317/hd7010out_v0229
  
16、奇骏F360修改日志:
桌面快捷圆点按钮要跟随工程设置里选择不同的车型配置变化,由于是两个不同的程序,需要跨进程,我在工程设置跟随选择的车型发送对应的广播出来,在圆点按钮程序里注册广播
    ,接收发过来的广播对应进行判断隐藏与显示!
    槽点:
    1、设置车型页面写在Fragment里,不能直接sendBroadcast(intent);起先是写成CarSetup.this.getActivity().sendBroadcast(intent);然后就被坑了一天,因为造这个方法发出来的数据值全为null;
          直到经过我在写一对一模一样的广播的发与收的程序出来测试,排除了所有的可能错误性最终才筛查到这!最终改成getActivity().sendBroadcast(intent);然后才豁然开朗!
          2、圆点按钮程序接收到广播,判断后一直无法显示与隐藏桌面图标,在所有可能出错的地方打了log,最终确定是ImageView.setVisibility(View.INVISIBLE);无法执行,这下就犯难了,
          .setVisibility(View.INVISIBLE);可是用过无数次都不会出错的!磨磨蹭蹭地有崩溃性地试了几个小时,想想是不是因为是引用的另一个程序的控件id,问了基平后,直接找到那个浮动窗口去控制,
          MyWindowManager.smallWindow.setVisibility(View.INVISIBLE); 然后就可以了!
          3、启动判断功能:这个又把我困住,因为每次开机都要根据之前的选择进行开机判断,最终的解决方法是使用的SharedPreferences preferences = context.getSharedPreferences("index", Context.MODE_PRIVATE);
          然后在浮动窗口的Java文件里加:private static boolean getDataFromSharePre();判断方法,
          
17、说明书的几个个问题记录:
   17.1、viewpager的每个页面滑动切换回来,页面会显示是上次滑动的位置;怎么让页面滑动的时候都是显示在顶端?
      scrollTo(0, 0);
  17.2、gridview是viewpager的一个页面,gridview的每个item放的是一个scollview页面,当打开第一个scollview页面滑动动后,返回再打开第二个scollview页面会发现这个页面显示位置跟第一个页面返回前停留的位置一样!怎么让每次打开页面的时候,都显示在顶端?
      scrollTo(0, 0);
   17.3、gridview和scollview页面首次打开时,不动的话不能获取不到页面的高度值,怎么才能静态获取?
      给页面设置了scrollTo(0, 0);后
      发现每次打开新srollview页面都会执行ScrollView.getY();方法:且值为0,那么剩下的事就简单了!
      项目中的各种冲突问题是Gridview引起的!      
      17.4、之前一个自己的一个项目里,因为在如下代码中没加return true,导致没有中断系统的操作,在主页的小分页里点击返回后先显示需要返回的状态后,程序直接退出!
  public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
return true;
}
return super.onKeyDown(keyCode, event);
}

18、改变系统时间的权限:
   在清单配置文件manifest中,添加:android:sharedUserId="android.uid.system";
   但在安装的过程中发现无法安装程序,可能该应用获取的权限过大,在eclipse中无法编译,于是我就放到服务器里编译,然后就成功实现了功能!
        
0 0
原创粉丝点击