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}&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中无法编译,于是我就放到服务器里编译,然后就成功实现了功能!
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}&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
- 2016年工作笔记汇总
- 2016年9月份工作知识点汇总
- 【工作笔记】ElasticSearch —— 常用插件/工具汇总
- Asp.net工作汇总
- Flex工作汇总
- 工作规范汇总
- 工作常用命令汇总
- 工作常见问题汇总
- 工作常用工具汇总
- 程序员工作常用工具汇总
- 竖排汇总工作表
- 笔记汇总
- 2016-01-12 工作笔记
- 【2016-12-30】工作笔记
- 工作笔记
- 工作笔记
- 工作笔记
- 工作笔记
- Android glide 3.0 图片处理学习笔记
- 程序员,如何写好文档?
- 文章标题
- 243. Shortest Word Distance
- Android开发学习—指纹识别系统的原理与使用
- 2016年工作笔记汇总
- Unity同时充当移动端和后台的界面+Sevelet+Mysql+Tomcat 学生信息的录入
- 没有需求,我们开发个毛?
- 中国剩余定理
- 上班两周-离职打算
- Macbook 下设置多ip
- unity移动端+bootstrap后台界面+JavaWeb+Mysql+tomcat
- @MappedSuperclass的用法
- windows、linux查看端口占用