1. 把设置菜单下的黑色背景换成图片显示,修改如下:
(1)找开 \packages\apps\Settings\AndroidManifest.xml 文件,找到 Setting菜单的主题
android:theme="@android:style/Theme.Holo"
(2)找开 \frameworks\base\core\res\res\values\themes.xml 文件,找到
<style name="Theme.Holo">
把<item name="windowBackground">@android:drawable/screen_background_selector_light</item>
改成:<item name="windowBackground">@android:drawable/setting_bg</item>
注:setting_bg.png放在 \frameworks\base\core\res\res\drawable-hdpi 目录下。
2. 外部类的对象去实例化一内部类的对象
Outer 外部类
Inner 内部类
public class InnerCalssDemo3
{
public static void main(String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display();
}
}
3. publicclass APN {
publicStringid;
publicStringset; //我自己添加的,用户确认是否需要设置为默认
publicString name; //显示的名称
publicString apn; //接入点名称 cmwap/cmnet…….
publicString mcc; //国家编号
publicString mnc; //运营商编号
publicString numeric; //mcc+mnc运营商在全球上唯一标识
publicString user; //用户名
publicString password; //密码
publicString server; //服务
publicString proxy; //代理
publicString port; //端口
publicString mmsport; //短信端口
publicString mmsproxy; //短信代理
publicString mmsc;
publicString authtype;
publicString current; //当=“1”的时候,显示
publicString type; //类型
}
4. 修改插入Usb安装驱动时弹出的字串显示: #define PRODUCT_STRING "MT65xx Android Phone"
文件路径: \kernel\drivers\usb\gadget\android.c
5. 自动删除文件
方法一:
public static boolean deleteFoder(File file) {
if (file.exists()) { // 判断文件是否存在
if (file.isFile()) { // 判断是否是文件
file.delete(); // delete()方法 你应该知道 是删除的意思;
} else if (file.isDirectory()) { // 否则如果它是一个目录
File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
if (files != null) {
for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
deleteFoder(files[i]); // 把每个文件 用这个方法进行迭代
}
}
}
boolean isSuccess = file.delete();
if (!isSuccess) {
return false;
}
}
return true;
}用这个方法解决
方法二:
File f=new File(“路径”)
if(f.exist()){
f.delete();
}
这个是可以实现的,需要权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
6. 关机电压
\mediatek\kernel\include\mach\battery_common.h
#define SYSTEM_OFF_VOLTAGE 3400
7. 改假内存
alps\kernel\fs\proc\meminfo.c
8. 具体对应时区
\frameworks\base\core\res\res\xml\time_zones_by_country.xml
9. android工程源码root手机
APK获取Root的su权限
针对一些APK,只有在一键Root之后才能使用的问题,如下是破解方法:
(1)在源码顶层目录下搜索su.c,find -name Su.c
(2)修改Su.c 路径:\system\extras\su\su.c
int main(int argc, char **argv)
{
...
/* Until we have something better, only root and the shell can use su. */
myuid = getuid();
#if 0 //注释掉如下if模块,就是su的时候不检查uid的权限了
if (myuid != AID_ROOT && myuid != AID_SHELL) {
fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
return 1;
}
#endif
....
}
(3)然后需要在init.rc中添加chmod 4777 /system/xbin/su 修改su的属性
修改su.c后,可以直接用adb把重新生成的su push到手机里
但是修改了init.rc需要刷boot.img
(4)如有必要:如果涉及到/data目录而非/data/data/<你的包名>/的修改,则修改system/core/rootdir/init.rc
将 mount yaffs2 mtd@userdata /data nosuid nodev 改为 mount yaffs2 mtd@userdata /data nodev
10. Android 双卡改单卡
双卡:
GEMINI = yes
MTK_GEMINI_ENHANCEMENT = yes
MTK_GEMINI_3G_SWITCH = yes
MTK_SHARE_MODEM_SUPPORT = 2
MTK_SHARE_MODEM_CURRENT = 2
单卡:
GEMINI = no
MTK_GEMINI_ENHANCEMENT = no
MTK_GEMINI_3G_SWITCH = no
MTK_SHARE_MODEM_SUPPORT = 2
MTK_SHARE_MODEM_CURRENT = 1
10-1. MT6575 3G切换2G
(1)在mediatek/custom/common/modem/ 路径下增加一个文件夹: yecon15_tb_ics_gprs
(2)修改修改编译工程配置文件ProjectConfig.mk 文件
[2G]
CUSTOM_MODEM= yecon15_tb_ics_gprs
MTK_VT3G324M_SUPPORT= no
MTK_MODEM_SUPPORT= modem_2g
MTK_FD_SUPPORT= no
MTK_GEMINI_3G_SWITCH=no
MTK_FD_FORCE_REL_SUPPORT=no
MTK_RAT_WCDMA_PREFERRED = no
MTK_MD1_SUPPORT=1
[3G]
CUSTOM_MODEM= yecon75_tb_ics_hspa
MTK_VT3G324M_SUPPORT= yes
MTK_MODEM_SUPPORT= modem_3g
MTK_FD_SUPPORT= yes
MTK_GEMINI_3G_SWITCH=yes
MTK_FD_FORCE_REL_SUPPORT=yes
MTK_RAT_WCDMA_PREFERRED =yes
MTK_MD1_SUPPORT=3
执行命令 ./mk yecon75_tb_ics new
11.
dip device independent pixels(设备独立像素). dip的换算: dip(value)=(int) (px(value)/1.5 + 0.5)
dp (与密度无关的像素):同dip是一样的。 一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。 dip 与dp相同,多用于android/ophone示例中。
px pixels(像素) 屏幕上的点,不同设备不同的显示屏显示效果相同,这是绝对像素,是多少就永远是多少不会改变。
sp scaled pixels — best for text size (放大像素)(与刻度无关的像素):主要处理字体的大小。与dp类似,但是可以根据用户的字体大小首选项进行缩放。主要用于字体显示best for textsize。
由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。
pt(磅) point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; 在 Android 中,1pt 大概等于 2.22sp
in inches(英寸):长度单位。
mm millimeters(毫米):长度单位。
12. android 电话接通时震动
电话接通时振动功能,亦可进一步做成系统设置选项,用preference实现。
package com.android.phone;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.gsm.SuppServiceNotification;
import com.android.phone.CdmaDisplayInfo;
import com.android.phone.NotificationMgr;
import com.android.phone.CallNotifier.InCallTonePlayer;
import android.os.AsyncResult;
import android.os.Message;
import android.util.Log;
//来电入口类
public class CallNotifier extends Handler implements CallerInfoAsyncQuery.OnQueryCompleteListener {
//保存上一状态
private Call.State mPreviousCallState;
private void onNewRingingConnection(AsyncResult r) {
}
//处理通话状态message
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
//other
case PHONE_STATE_CHANGED:
onPhoneStateChanged((AsyncResult) msg.obj);
break;
//other
}
}
//通话状态改变时
private void onPhoneStateChanged(AsyncResult r) {
//other
//判断来电状态,若刚接通则震动
if ((mPhone.getForegroundCall().getState() == Call.State.ACTIVE)
&& ((mPreviousCallState == Call.State.DIALING) || (mPreviousCallState == Call.State.ALERTING))) {
Vibrator vbr = (Vibrator) mPhone.getContext().getSystemService(Context.VIBRATOR_SERVICE);
vbr.vibrate(200);
}
mPreviousCallState = mPhone.getForegroundCall().getState();
}
}
13.电话接通时打开扬声器
public class LoudSpeakerOnOff extends BroadcastReceiver{
TelephonyManager tm;
public static ITelephony telephonyService;
public static AudioManager am;
Context context;
boolean loudspeakerOn = false, vibrateOn = false;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
this.context = context;
am = (AudioManager)context.getSystemService("audio");
tm = (TelephonyManager)context.getSystemService("phone");
tm.listen(new phoneState(), PhoneStateListener.LISTEN_CALL_STATE);
}
class phoneState extends PhoneStateListener{
public void onCallStateChanged(int state, String incomingNumber){
switch(state){
case TelephonyManager.CALL_STATE_IDLE:
am.setSpeakerphoneOn(false);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
am.setSpeakerphoneOn(true);
break;
case TelephonyManager.CALL_STATE_RINGING:
break;
}
}
}
}
14. 修改Ram内存显示,做假
\kernel\fs\proc\meminfo.c
把K(i.totalram),改成 K(i.totalram<<1), 意思是改成原值的双倍。
15. 改CPU型号
在 \frameworks\base\core\java\android\widget\TextView.java
private void setText(CharSequence text, BufferType type,
boolean notifyBefore, int oldlen) {
if (text == null) {
text = "";
}
//add start
if(text.toString().trim().equals("Dual-Core ARMv7 Procesor")){
text = "MT6572"
}
//add end
.....
}
例:
if(text.toString().trim().equals("MT8382")){
text = "Exynos 5420";
}
if(text.toString().trim().equals("1280 x 800")){
text = "2560 x 1600";
}
16. Android获取手机制作商,系统版本等
在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息。
android.os.Build类中。包括了这样的一些信息。我们可以直接调用 而不需要添加任何的权限和方法。
android.os.Build.BOARD:获取设备基板名称
android.os.Build.BOOTLOADER:获取设备引导程序版本号
android.os.Build.BRAND:获取设备品牌
android.os.Build.CPU_ABI:获取设备指令集名称(CPU的类型)
android.os.Build.CPU_ABI2:获取第二个指令集名称
android.os.Build.DEVICE:获取设备驱动名称
android.os.Build.DISPLAY:获取设备显示的版本包(在系统设置中显示为版本号)和ID一样
android.os.Build.FINGERPRINT:设备的唯一标识。由设备的多个信息拼接合成。
android.os.Build.HARDWARE:设备硬件名称,一般和基板名称一样(BOARD)
android.os.Build.HOST:设备主机地址
android.os.Build.ID:设备版本号。
android.os.Build.MODEL :获取手机的型号 设备名称。
android.os.Build.MANUFACTURER:获取设备制造商
android:os.Build.PRODUCT:整个产品的名称
android:os.Build.RADIO:无线电固件版本号,通常是不可用的 显示unknown
android.os.Build.TAGS:设备标签。如release-keys 或测试的 test-keys
android.os.Build.TIME:时间
android.os.Build.TYPE:设备版本类型 主要为"user" 或"eng".
android.os.Build.USER:设备用户名 基本上都为android-build
android.os.Build.VERSION.RELEASE:获取系统版本字符串。如4.1.2 或2.2 或2.3等
android.os.Build.VERSION.CODENAME:设备当前的系统开发代号,一般使用REL代替
android.os.Build.VERSION.INCREMENTAL:系统源代码控制值,一个数字或者git hash值
android.os.Build.VERSION.SDK:系统的API级别 一般使用下面大的SDK_INT 来查看
android.os.Build.VERSION.SDK_INT:系统的API级别 数字表示
android.os.Build.VERSION_CODES类 中有所有的已公布的Android版本号。全部是Int常亮。可用于与SDK_INT进行比较来判断当前的系统版本
17.
而这个persist.sys.usb.config 中adb 的配置是在alps/build/tools/post_process_props.py 中根据ro.debuggable = 1 or 0 来设置,1 就是开启adb, 0 即关闭adb debug. 而这个ro.debuggable 也是在alps/build/core/main.mk 中设置,和2.3 修改类似
不过您这样打开之后,对于user 版本adb shell 开启的还是shell 权限,而不是root 权限,如果您需要root 权限,需要再改一下system/core/adb/adb.c 里面的should_drop_privileges() 这个函数,在#ifndef ALLOW_ADBD_ROOT 时return 0; 而不是return 1; 即可。
User版本默认打开USB调试开关:
ro.debuggable=1
persist.service.adb.enable=1
18. Android动画切换
(1)*.java //设置切换动画,从右边进入,左边退出
overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
(2)*.xml
<translate android:fromXDelta="100%p" android:toXDelta="0%p"
android:duration="500" />
注: android:fromXDelta 动画开始的位置, android:toXDelta 动画结束的位置, android:duration动画的时间。
19. 将Activity伪装成Dialog
就是给AndroidManifest文件中Activity添加Dialog样式属性
<activity android:name=".DialogActivity" android:label="@string/app_name"
android:theme="@android:style/Theme.Dialog">
20. Camera旋转90,270
MT6572平台:\mediatek\custom\mt6572\hal\camera\camera\cfg_setting_imgsensor.h
SensorOrientation_T const&
MT6575平台:\mediatek\custom\project\hal\camera\camera\cfg_tuning_mt6575.h
getSensorOrientation()
{
static SensorOrientation_T const inst = {
u4Degree_0 : 90, // main sensor in degree (0, 90, 180, 270)
u4Degree_1 : 0, // sub sensor in degree (0, 90, 180, 270)
u4Degree_2 : 90, // main2 sensor in degree (0, 90, 180, 270)
};
return inst;
}
21. 设置菜单下的SIM status、Wifi信号dbM值做假
路径: \mediatek\frameworks\base\op\java\com\mediatek\op\telephony\ServiceStateExt.java
public int mapGsmSignalDbm(int GsmRscpQdbm,int asu){
int dBm;
Log.d(TAG,"mapGsmSignalDbm() GsmRscpQdbm=" + GsmRscpQdbm + " asu=" + asu);
if (GsmRscpQdbm < 0) {
dBm = GsmRscpQdbm / 4; //Return raw value for 3G Network
} else {
dBm = -113 + (2 * asu);
}
if(FeatureOption.G6_V21_WEIHENG_GQ_PROJECT){
return dBm+15;
}else{
return dBm;
}
}
22. (一)修改马达震动电压
(1)\mediatek\custom\cp706\kernel\vibrator\cust_vibrator.c
static struct vibrator_hw cust_vibrator_hw = {
.vib_timer = 50,
#ifdef CUST_VIBR_LIMIT
.vib_limit = 10,
#endif
.vosel = VOL_2800,//电压值
};
(2)\mediatek\platform\mt6572\kernel\drivers\vibrator\vibrator.c
static int vibr_Enable(void)
{ ...
hwPowerOn(MT6323_POWER_LDO_VIBR, vibr_voltage, "VIBR");//修改这个值vibr_voltage
..
}
(二)修改震动强弱,通过修改震动时长以达到强震效果:
\packages\apps\Phone\src\com\android\phone\HapticFeedback.java
private static final long DURATION = 15; //4; // millisec.
23. Android里的音量调节 (2012-10-25 16:17:36)转载▼
步骤1:或许系统音量对象的实例
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
步骤2:获取各种音量情报
Android的音量信息一共有7种。
①通话音量
int max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
int current = mAudioManager.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
Log.d(”VIOCE_CALL”, “max : ” + max + ” current : ” + current);
②系统音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
Log.d(”SYSTEM”, “max : ” + max + ” current : ” + current);
③铃声音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
Log.d(”RING”, “max : ” + max + ” current : ” + current);
④音乐音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
Log.d(”MUSIC”, “max : ” + max + ” current : ” + current);
⑤提示声音音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_NOTIFICATION );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_NOTIFICATION );
Log.d(”NOTIFICATION”, “max : ” + max + ” current : ” + current);
⑥闹铃音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_ALARM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_ALARM );
Log.d(”ALARM”, “max : ” + max + ” current : ” + current);
⑦DTMF(Double Tone MulitiFrequency,双音多频)
设置音量的方法也很简单,AudioManager提供了方法:
public void setStreamVolume(int streamType, int index, int flags)
其他:
各种音量有不同的播放方式,例如,音乐就应该用MediaPlayer来播放。
private MediaPlayer mediaPlayer=null; //声频
mediaPlayer=MediaPlayer.create(AudioActivity.this, R.raw.music);
mediaPlayer.setLooping(true);//设置循环播放
mediaPlayer.start();//播放声音
而铃声就应该用RingtoneManager来播放。
如果混用的话,参照的音量就会不正确。
这个时候可以通过设定流类型来改善。
例如
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mRingtone = RingtoneManager.getRingtone(getApplicationContext(), uri);
RingtoneManager是播放铃声的,如果用来播放通知音,
就需要把声音的流类型改成AudioManager.STREAM_NOTIFICATION
mRingtone.setStreamType(AudioManager.STREAM_NOTIFICATION );
24. 内存EMMC做假,步骤如下四步:
(1)mkfs.vfat -n voume_name -v -C fat.img [block-count]
(2)把fat.img mount到某个目录
mkdir fat_disk
mount -o loop,iocharset=utf8 fat.img fat_disk/
(3)umount fat_disk/
(4)./trim fat.img fat_sparse.img
25. Android去掉虚拟按键全屏显示的方法
在 oncreate 方法中 设置
if (Util.getCurrentAPIVersion() >= 14) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
要放在 setcontentview 方法前
而且这个方法只能在api 14以上的代码中使用,所以要注意加上判定。
另外无论你怎么隐藏 虚拟按键,在发生交互行为的时候,按键都是会出现的。具体的解释,可以参考官方文档
26. android截屏功能实现
/**
* 获取和保存当前屏幕的截图
*/
private void GetandSaveCurrentImage()
{
//构建Bitmap
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int w = display.getWidth();
int h = display.getHeight();
Bitmap Bmp = Bitmap.createBitmap( w, h, Config.ARGB_8888 );
//获取屏幕
View decorview = this.getWindow().getDecorView();
decorview.setDrawingCacheEnabled(true);
Bmp = decorview.getDrawingCache();
//图片存储路径
String SavePath = getSDCardPath()+"/Demo/ScreenImages";
//保存Bitmap
try {
File path = new File(SavePath);
//文件
String filepath = SavePath + "/Screen_1.png";
File file = new File(filepath);
if(!path.exists()){
path.mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = null;
fos = new FileOutputStream(file);
if (null != fos) {
Bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.flush();
fos.close();
Toast.makeText(mContext, "截屏文件已保存至SDCard/ScreenImages/目录下",Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取SDCard的目录路径功能
* @return
*/
private String getSDCardPath(){
File sdcardDir = null;
//判断SDCard是否存在
boolean sdcardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(sdcardExist){
sdcardDir = Environment.getExternalStorageDirectory();
}
return sdcardDir.toString();
}
27. Linux下对工程搜索字串命令
grep -Irns "xxxxxx"
28. 情景模式下打开“Touch sound 触摸提示音”
(1)在\mediatek\frameworks\base\media\audio\java\com\mediatek\audioprofile\AudioProfileManager.java
final boolean DEFAULT_SOUNDEFFECT_GENERAL = true; //只改此处即可
(2)\frameworks\base\packages\SettingsProvider\res\values\defaults.xml
<bool name="def_sound_effects_enabled">true</bool> //改此处无效
29.
mt_set_gpio_mode(GPIO_ALS_EINT_PIN, GPIO_ALS_EINT_PIN_M_EINT);
mt_set_gpio_dir(GPIO_ALS_EINT_PIN, GPIO_DIR_IN);
mt_set_gpio_pull_enable(GPIO_ALS_EINT_PIN, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select(GPIO_ALS_EINT_PIN, GPIO_PULL_UP);
这个代码的意思
1. 设置mode为中断
2. 设置输入GPIO
3. 维持上来 内部的
4. 默认高阻 就是开机的时候维持高电平
30. G-sensor兼容开关
# one load to support different accelerometer sensor
MTK_AUTO_DETECT_ACCELEROMETER=no
31. 音量等级
默认音量等级: \frameworks\base\media\java\android\media\AudioManager.java
public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
6, // STREAM_VOICE_CALL
7,//7, // STREAM_SYSTEM
4,// 4, // STREAM_RING
...
};
最大音量: \frameworks\base\media\java\android\media\AudioService.java
private final int[] MAX_STREAM_VOLUME = new int[] {
6, // STREAM_VOICE_CALL
7, // STREAM_SYSTEM
7, // STREAM_RING
...
};
32. G-sensor方向旋转
(1)\mediatek\kernel\drivers\hwmon\hwmsen\hwmsen_helper.c
struct hwmsen_convert map[] = {
{ { 1, 1, 1}, {0, 1, 2} },
{ {-1, 1, 1}, {1, 0, 2} },
{ {-1,-1, 1}, {0, 1, 2} },
//{ { 1,-1, 1}, {1, 0, 2} },
{ { 1,-1, -1}, {1, 0, 2} },
{ { 1, -1,-1}, {0, 1, 2} },
{ { 1, 1,-1}, {1, 0, 2} },
{ { 1,-1,-1}, {0, 1, 2} },
{ {-1,-1,-1}, {1, 0, 2} },
};
(2)\mediatek\custom\cp600\kernel\accelerometer\bma250_auto\cust_acc.c
static struct acc_hw cust_acc_hw = {
.i2c_num = 1,
.direction = 4, // 4///3,
.power_id = MT65XX_POWER_NONE, /*!< LDO is not used */
.power_vol= VOL_DEFAULT, /*!< LDO is not used */
.firlen = 0, //old value 16 /*!< don't enable low pass fileter */
};
33. MIPI与DVP接口区别
DVP是并口,需要PCLK、VSYNC、HSYNC、D[0:11]——可以是8/10/12bit数据,看ISP或baseband是否支持;
MIPI是LVDS,低压差分串口。只需要要CLKP/N、DATAP/N——最大支持4-lane,一般2-lane可以搞定。
显然,MIPI接口比DVP的接口信号线少,由于是低压差分信号,产生的干扰小,抗干扰能力也强。最重要的是DVP接口在信号完整性方面受限制,速率也受限制。500W还可以勉强用DVP,800W及以上都采用MIPI接口。
34. 调光感关闭了I2C兼容共用
\mediatek\platform\mt6572\kernel\core\mt_devs.c
35. 取消破解减360
(1) \mediatek\custom\cp695\lk\include\target\board.h
//#define CFG_DISPLAY_HEIGHT (DISP_GetScreenHeight()-360)//Daniel_mod_lcm
(2)\mediatek\kernel\drivers\video\mtkfb.c
//MTK_FB_YRES = DISP_GetScreenHeight()-360;//Daniel_mod 20141017: Debug 6.95Lcm,delete 360
36. Android 判断sd卡和sim卡是否可用
在一个项目中,要用到sdcard和sim卡。使用sdcard时,需要判断其状态是否可读写。使用sim卡时,要判断是否可读,怎么做呢,请参阅下面两个函数:
//sdcard是否可读写
public boolean IsCanUseSdCard() {
try {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
//sim卡是否可读
public boolean isCanUseSim() {
try {
TelephonyManager mgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
return TelephonyManager.SIM_STATE_READY == mgr
.getSimState();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
主要用到了:android.telephony.TelephonyManager、android.os.Environment及android.app.Activity.getSystemService 方法
37. 开机第一张Logo花屏、屏闪
不良原因為:主板在boot的VSYNC設置的參數過大,達到1270,
而正常的為: VW+VBP+BFP+600=1+22+12+600=635
而其knerel設置是正確的,故導致開機時前面的畫面異常,後面的顯示OK。
38. 延时
void Delayms(kal_uint32 ms)
{
kal_uint32 i;
for(i=0;i<5000*ms;i++)
}
39. Mtk Android 之NvRAM customer
分类: Linux_mtk 2014-08-27 15:17 100人阅读 评论(0) 收藏 举报
转载:http://blog.csdn.net/cbk861110/article/details/26851817
(1)nvram lib id定义:
alps\mediatek\custom\prj\cgen\inc\Custom_NvRam_LID.h
typedef enum
{
AP_CFG_RDCL_FILE_AUDIO_LID=AP_CFG_CUSTOM_BEGIN_LID,//AP_CFG_CUSTOM_BEGIN_LID: this lid must not be changed, it is reserved for system.
AP_CFG_REEB_PRODUCT_INFO_LID,
AP_CFG_CUSTOM_FILE_MAX_LID,
} CUSTOM_CFG_FILE_LID;
#define AP_CFG_REEB_PRODUCT_INFO_LID_VERNO "000"
(2)nvram lib id的数据结构和版本号声明
\alps\mediatek\custom\prj\cgen\inc\Custom_NvRam_data_item.h
LID_BIT VER_LID(AP_CFG_REEB_PRODUCT_INFO_LID)
PRODUCT_INFO *CFG_FILE_PRODUCT_INFO_TOTAL
{
};
(3)nvram lib内容加入nvram数组中
\alps\mediatek\custom\prj\cgen\inc\CFG_file_info_custom.h
const TCFG_FILE g_akCFG_File_Custom[]=
{
{
"/data/nvram/APCFG/APRDEB/PRODUCT_INFO", VER(AP_CFG_REEB_PRODUCT_INFO_LID), CFG_FILE_PRODUCT_INFO_SIZE,
CFG_FILE_PRODUCT_INFO_TOTAL, SIGNLE_DEFUALT_REC, (char *)&stPRODUCT_INFOConfigDefault,DataReset, NULL
},
};
(4)nvram lib 数据结构定义
alps\mediatek\custom\prj\cgen\inc\CFG_file_info_custom.h
// the record structure define of PRODUCT_INFO nvram file
typedef struct
{
unsigned char imei[8];
unsigned char svn;
unsigned char pad;
} nvram_ef_imei_imeisv_struct;
typedef struct{
unsigned char barcode[64];
nvram_ef_imei_imeisv_struct IMEI[4];
unsigned char reserved[1024-40-64];
}PRODUCT_INFO;
//the record size and number of PRODUCT_INFO nvram file
#define CFG_FILE_PRODUCT_INFO_SIZE sizeof(PRODUCT_INFO)
#define CFG_FILE_PRODUCT_INFO_TOTAL 1
(5)nvram lib 默认值定义
alps\mediatek\custom\prj\cgen\cfgdefault\CFG_PRODUCT_INFO_Default.h
PRODUCT_INFO stPRODUCT_INFOConfigDefault =
{
/* barcode */
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
/* IMEI*/
{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0},
/* reserved */
}
(6)nvram lib id需要备份到BinRegion:
\alps\mediatek\custom\prj\cgen\CFG_file_info.c
FileName aBackupToBinRegion[]=
{
#ifndef MTK_PRODUCT_INFO_SUPPORT
{"PRODUCT_INFO",AP_CFG_REEB_PRODUCT_INFO_LID},
#endif
};
(7)native(c)层读写:
[FAQ04545]【NvRAM】Native层读写nvram
1,NVM_GetFileDesc(file_lid, &rec_size, &rec_num,true);//读打开
2,read
3,NVM_CloseFileDesc
4,NVM_GetFileDesc(file_lid, &rec_size, &rec_num,false);//写打开
5,write
6,NVM_CloseFileDesc
(8)java层读写:
参照[FAQ04542]【NvRAM】apk中中读写nvram
IBinder binder = ServiceManager.getService("NvRAMAgent");
NvRAMAgent agent = NvRAMAgent.Stub.asInterface(binder);
buffer = agent.readFile(AP_CFG_CUSTOM_FILE_LID_ID);
agent.writeFile(AP_CFG_CUSTOM_FILE_LID_ID,buffer);
40. Android4.4 MT6572,KK版,开机第一张Logo和第二张Logo之间会出现花屏(第一张Logo开始能正常显示2-3秒钟就开始花屏)。
目前是在分辨率:540X960的情况下花屏,其他分辨率正常。
解决如下: 路径: \mediatek\platform\mt6572\lk\disp_drv.c
UINT32 DISP_GetVRamSize(void)
{
// Use a local static variable to cache the calculated vram size
//
static UINT32 vramSize = 0;
if (0 == vramSize)
{
...
// Align vramSize to 1MB
//
vramSize = ALIGN_TO_POW_OF_2(vramSize, 0x100000);
//if((vramSize%0x100000) < 0x1000){
// vramSize += 0x1000;
// }
DISP_LOG("DISP_GetVRamSize-1: %u bytes\n", vramSize);
if((DISP_GetScreenWidth()==540) && (DISP_GetScreenHeight()==960)){
vramSize=0xb00000;//增加此语句 Add this line to solve First logo abnormal display.
}
DISP_LOG("DISP_GetVRamSize: %u bytes\n", vramSize);
}
return vramSize;
}
41. 去掉设置-存储-内部存储
\packages\apps\Settings\src\com\android\settings\deviceinfo\Memory.java
public void onCreate(Bundle icicle) {
...
if (mMemoryExts.isAddInternalCategory()) {
// addCategory(StorageVolumePreferenceCategory.buildForInternal(context));
}
...
}
42. android 如何将桌面较长的图标名称显示完整(有些APP的图标名称太长)
(1)请找到对应的res资源,修改styles.xml,将
<style name="WorkspaceIcon.Portrait">
<item name="android:drawablePadding">0dp</item>
...
<item name="android:lines">2</item> //增加此项
</style>
(2)请修改BubbleTextView.java的applyFromShortcutInfo方法,将
setCompoundDrawablePadding((int) ((grid.folderIconSizePx - grid.iconSizePx) / 2f));
这行代码中的参数改小为合适的值。
43. android Launcher3中主菜单的布局调整(如从5*4调整为4*4)
Launcher3主菜单布局的行数和列数,都是在DynamicGrid.java中动态计算的,xml中无法配置。
如果想修改主菜单的布局,调整行数和列数,请修改DynamicGrid.java中allAppsNumRows和allAppsNumCols的值。
44. android 让Launcher Hotseat中的图标显示title
(1)请修改alps/packages/apps/Launcher2/res/values/dimens.xml中的hotseat_cell_height值,例如修改为100;
(2)请修改alps/packages/apps/Launcher2/src/com/android/launcher2/HotSeat.java中的resetLayout()方法,对主菜单图标添加title,例如:添加allAppsButton.setText("allAppsButton_title");
(3)请修改alps/packages/apps/Launcher2/src/com/android/launcher2/CellLayout.java的addViewToCellLayout方法,将下面的代码注释掉:
// Hotseat icons - remove text
if (child instanceof BubbleTextView) {
BubbleTextView bubbleChild = (BubbleTextView) child;
bubbleChild.setTextVisibility(!mIsHotseat);
}
45. android 打开蓝牙语音拨号功能
修改mediatek/external/bluetooth/bt_cust/bt_cust_table.h文件,将HFPVoiceRecognition属性的值改为1。
{
.name = "HFPVoiceRecognition",
.value = (void*)1,
},
46. android 修改设备管理器中的磁盘驱动器名
1)修改F_mass_storage.c中fsg_common_init()的此处代码:
snprintf(common->inquiry_string, sizeof common->inquiry_string,
"%-8s%-16s%04x", cfg->vendor_name ?: "Linux",
/* Assume product name dependent on the first LUN */
cfg->product_name ?: (common->luns->cdrom
? "File-Stor Gadget"
: "File-CD Gadget"),
i);
2)或者直接修改/sys/class/android_usb/f_mass_storage/inquiry_string内容
47. Flash做兼容时,Preloader bin size过大编译报错怎么办
相关的FAQ请参考"[FAQ07839]【Storage】eMMC和NAND Flash的兼容个数" 對於KK版本,由於Preloader新增了對LPDDR3的支援,
因此default可能無法配置出10顆兼容的mcp/emcp/discrete dram,需要參考以下的說明修改code,減少debug code佔用的size。
* MT6589/72/71平台,请修改alps\mediatek\platform\$PLATFORM\preloader\src\drivers\inc\mt_pmic_wrap_init.h文件
* MT6582/92平台,请修改alps\mediatek\platform\$PLATFORM\preloader\src\drivers\inc\pmic_wrap_init.h文件
具体修改code的方法是一样的:
(1)#define PMIC_WRAP_DEBUG //注释掉这一行
(2)#define PWRAPERR(fmt, arg...) printf(PWRAPTAG "ERROR,line=%d " fmt, __LINE__, ##arg)
修改为:#define PWRAPERR(fmt, arg...) printf(PWRAPTAG "ERROR,line=%d ", __LINE__)
另外JB3.MP MT6572版本的check_size.sh脚本存在bug,size检查机制会失效,
如果您发现在这个脚本中PL_MAX_ROM_SIZE定义的方法如下,那么就说明您没有打上patch,需要提e-service申请ALPS00869854这笔patch。
# Keep ROM size smaller than 90KB PL_MAX_ROM_SIZE=(95*1024)
注:针对编译报错 mt_pmic_wrap_init.c:772: error: undefined reference to 'PWRAPFUC',用宏开关PMIC_WRAP_DEBUG控制即可编译通过。
48. linux 下查找文件或者内容常用命令
whereis <程序名称>
查找软件的安装路径
-b 只查找二进制文件
-m 只查找帮助文件
-s 只查找源代码
-u 排除指定类型文件
-f 只显示文件名
-B <目录> 在指定目录下查找二进制文件
-M <目录> 在指定目录下查找帮助文件
-S <目录> 在指定目录下查找源代码
locate <文件名称>
在文件索引数据库中搜索文件
-d <数据库路径> 搜索指定数据库
updatedb
更新文件索引数据库
find [路径] <表达式>
查找文件
-name <表达式> 根据文件名查找文件
-iname <表达式> 根据文件名查找文件,忽略大小写
-path <表达式> 根据路径查找文件
-ipath <表达式> 根据路径查找文件,忽略大小写
-amin <分钟> 过去N分钟内访问过的文件
-atime <天数> 过去N天内访问过的文件
-cmin <分钟> 过去N分钟内修改过的文件
-ctime <天数> 过去N天内修改过的文件
-anewer <参照文件> 比参照文件更晚被读取过的文件
-cnewer <参照文件> 比参照文件更晚被修改过的文件
-size <大小> 根据文件大小查找文件,单位b c w k M G
-type <文件类型> 根据文件类型查找文件。b 块设备 c 字符设备 d 目录 p 管道文件 f 普通文件 l 链接 s 端口文件
-user <用户名> 按归属用户查找文件
-uid <uid> 按UID查找文件
-group <群组名> 按归属群组查找文件
-gid <gid> 按GID查找文件
-empty 查找空文件
从文件内容查找匹配指定字符串的行:
$ grep "被查找的字符串" 文件名
从文件内容查找与正则表达式匹配的行:
$ grep –e “正则表达式” 文件名
查找时不区分大小写:
$ grep –i "被查找的字符串" 文件名
查找匹配的行数:
$ grep -c "被查找的字符串" 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行
find / -type f -name "*.log" | xargs grep "ERROR"
系统查找到httpd.conf文件后即时在屏幕上显示httpd.conf文件信息。
find/-name"httpd.conf"-ls
在根目录下查找某个文件
find . -name "test"
在某个目录下查找包含某个字符串的文件
grep -r "zh_CN" ./
49. 通过查字符找文件
find ./ name "aaa"
50. Android4.4 Database路径
\out\target\product\cp706_pq_jqx250\obj\CODEGEN\cgen
\out\target\product\cp706_pq_jqx250\obj\CUSTGEN\custom\modem
51. Camera照相闪烁
Android4.2
packages\apps\Camera\src\com\android\camera\SettingChecker.java
RESET_STATE_VALUE[ROW_SETTING_ANTI_FLICKER] = new String[]{"60HZ
Android4.4
\packages\apps\Camera\res\values\camera_arrays.xml
<!-- Default antibanding setting.-->
<string-array name="pref_camera_antibanding_default_array" translatable="false">
<item>50hz</item>
<item>off</item>
<item>auto</item>
</string-array>
52. 关闭串口打印开关
\mediatek\custom\Project_name\preloader\inc\cust_bldr.h
#define CFG_LOG_BAUDRATE (921600)
#define CFG_META_BAUDRATE (115200)
#define CFG_UART_LOG (UART1) //(UART2) //若要关闭则改为UART2,打开则为UART1
#define CFG_UART_META (UART1)
53. USB打印
打印信息保存路径
adb shell cat /proc/kmsg >D://test
(1)找开 \packages\apps\Settings\AndroidManifest.xml 文件,找到 Setting菜单的主题
android:theme="@android:style/Theme.Holo"
(2)找开 \frameworks\base\core\res\res\values\themes.xml 文件,找到
<style name="Theme.Holo">
把<item name="windowBackground">@android:drawable/screen_background_selector_light</item>
改成:<item name="windowBackground">@android:drawable/setting_bg</item>
注:setting_bg.png放在 \frameworks\base\core\res\res\drawable-hdpi 目录下。
2. 外部类的对象去实例化一内部类的对象
Outer 外部类
Inner 内部类
public class InnerCalssDemo3
{
public static void main(String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display();
}
}
3. publicclass APN {
publicStringid;
publicStringset; //我自己添加的,用户确认是否需要设置为默认
publicString name; //显示的名称
publicString apn; //接入点名称 cmwap/cmnet…….
publicString mcc; //国家编号
publicString mnc; //运营商编号
publicString numeric; //mcc+mnc运营商在全球上唯一标识
publicString user; //用户名
publicString password; //密码
publicString server; //服务
publicString proxy; //代理
publicString port; //端口
publicString mmsport; //短信端口
publicString mmsproxy; //短信代理
publicString mmsc;
publicString authtype;
publicString current; //当=“1”的时候,显示
publicString type; //类型
}
4. 修改插入Usb安装驱动时弹出的字串显示: #define PRODUCT_STRING "MT65xx Android Phone"
文件路径: \kernel\drivers\usb\gadget\android.c
5. 自动删除文件
方法一:
public static boolean deleteFoder(File file) {
if (file.exists()) { // 判断文件是否存在
if (file.isFile()) { // 判断是否是文件
file.delete(); // delete()方法 你应该知道 是删除的意思;
} else if (file.isDirectory()) { // 否则如果它是一个目录
File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
if (files != null) {
for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
deleteFoder(files[i]); // 把每个文件 用这个方法进行迭代
}
}
}
boolean isSuccess = file.delete();
if (!isSuccess) {
return false;
}
}
return true;
}用这个方法解决
方法二:
File f=new File(“路径”)
if(f.exist()){
f.delete();
}
这个是可以实现的,需要权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
6. 关机电压
\mediatek\kernel\include\mach\battery_common.h
#define SYSTEM_OFF_VOLTAGE 3400
7. 改假内存
alps\kernel\fs\proc\meminfo.c
8. 具体对应时区
\frameworks\base\core\res\res\xml\time_zones_by_country.xml
9. android工程源码root手机
APK获取Root的su权限
针对一些APK,只有在一键Root之后才能使用的问题,如下是破解方法:
(1)在源码顶层目录下搜索su.c,find -name Su.c
(2)修改Su.c 路径:\system\extras\su\su.c
int main(int argc, char **argv)
{
...
/* Until we have something better, only root and the shell can use su. */
myuid = getuid();
#if 0 //注释掉如下if模块,就是su的时候不检查uid的权限了
if (myuid != AID_ROOT && myuid != AID_SHELL) {
fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
return 1;
}
#endif
....
}
(3)然后需要在init.rc中添加chmod 4777 /system/xbin/su 修改su的属性
修改su.c后,可以直接用adb把重新生成的su push到手机里
但是修改了init.rc需要刷boot.img
(4)如有必要:如果涉及到/data目录而非/data/data/<你的包名>/的修改,则修改system/core/rootdir/init.rc
将 mount yaffs2 mtd@userdata /data nosuid nodev 改为 mount yaffs2 mtd@userdata /data nodev
10. Android 双卡改单卡
双卡:
GEMINI = yes
MTK_GEMINI_ENHANCEMENT = yes
MTK_GEMINI_3G_SWITCH = yes
MTK_SHARE_MODEM_SUPPORT = 2
MTK_SHARE_MODEM_CURRENT = 2
单卡:
GEMINI = no
MTK_GEMINI_ENHANCEMENT = no
MTK_GEMINI_3G_SWITCH = no
MTK_SHARE_MODEM_SUPPORT = 2
MTK_SHARE_MODEM_CURRENT = 1
10-1. MT6575 3G切换2G
(1)在mediatek/custom/common/modem/ 路径下增加一个文件夹: yecon15_tb_ics_gprs
(2)修改修改编译工程配置文件ProjectConfig.mk 文件
[2G]
CUSTOM_MODEM= yecon15_tb_ics_gprs
MTK_VT3G324M_SUPPORT= no
MTK_MODEM_SUPPORT= modem_2g
MTK_FD_SUPPORT= no
MTK_GEMINI_3G_SWITCH=no
MTK_FD_FORCE_REL_SUPPORT=no
MTK_RAT_WCDMA_PREFERRED = no
MTK_MD1_SUPPORT=1
[3G]
CUSTOM_MODEM= yecon75_tb_ics_hspa
MTK_VT3G324M_SUPPORT= yes
MTK_MODEM_SUPPORT= modem_3g
MTK_FD_SUPPORT= yes
MTK_GEMINI_3G_SWITCH=yes
MTK_FD_FORCE_REL_SUPPORT=yes
MTK_RAT_WCDMA_PREFERRED =yes
MTK_MD1_SUPPORT=3
执行命令 ./mk yecon75_tb_ics new
11.
dip device independent pixels(设备独立像素). dip的换算: dip(value)=(int) (px(value)/1.5 + 0.5)
dp (与密度无关的像素):同dip是一样的。 一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。 dip 与dp相同,多用于android/ophone示例中。
px pixels(像素) 屏幕上的点,不同设备不同的显示屏显示效果相同,这是绝对像素,是多少就永远是多少不会改变。
sp scaled pixels — best for text size (放大像素)(与刻度无关的像素):主要处理字体的大小。与dp类似,但是可以根据用户的字体大小首选项进行缩放。主要用于字体显示best for textsize。
由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。
pt(磅) point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; 在 Android 中,1pt 大概等于 2.22sp
in inches(英寸):长度单位。
mm millimeters(毫米):长度单位。
12. android 电话接通时震动
电话接通时振动功能,亦可进一步做成系统设置选项,用preference实现。
package com.android.phone;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.gsm.SuppServiceNotification;
import com.android.phone.CdmaDisplayInfo;
import com.android.phone.NotificationMgr;
import com.android.phone.CallNotifier.InCallTonePlayer;
import android.os.AsyncResult;
import android.os.Message;
import android.util.Log;
//来电入口类
public class CallNotifier extends Handler implements CallerInfoAsyncQuery.OnQueryCompleteListener {
//保存上一状态
private Call.State mPreviousCallState;
private void onNewRingingConnection(AsyncResult r) {
}
//处理通话状态message
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
//other
case PHONE_STATE_CHANGED:
onPhoneStateChanged((AsyncResult) msg.obj);
break;
//other
}
}
//通话状态改变时
private void onPhoneStateChanged(AsyncResult r) {
//other
//判断来电状态,若刚接通则震动
if ((mPhone.getForegroundCall().getState() == Call.State.ACTIVE)
&& ((mPreviousCallState == Call.State.DIALING) || (mPreviousCallState == Call.State.ALERTING))) {
Vibrator vbr = (Vibrator) mPhone.getContext().getSystemService(Context.VIBRATOR_SERVICE);
vbr.vibrate(200);
}
mPreviousCallState = mPhone.getForegroundCall().getState();
}
}
13.电话接通时打开扬声器
public class LoudSpeakerOnOff extends BroadcastReceiver{
TelephonyManager tm;
public static ITelephony telephonyService;
public static AudioManager am;
Context context;
boolean loudspeakerOn = false, vibrateOn = false;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
this.context = context;
am = (AudioManager)context.getSystemService("audio");
tm = (TelephonyManager)context.getSystemService("phone");
tm.listen(new phoneState(), PhoneStateListener.LISTEN_CALL_STATE);
}
class phoneState extends PhoneStateListener{
public void onCallStateChanged(int state, String incomingNumber){
switch(state){
case TelephonyManager.CALL_STATE_IDLE:
am.setSpeakerphoneOn(false);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
am.setSpeakerphoneOn(true);
break;
case TelephonyManager.CALL_STATE_RINGING:
break;
}
}
}
}
14. 修改Ram内存显示,做假
\kernel\fs\proc\meminfo.c
把K(i.totalram),改成 K(i.totalram<<1), 意思是改成原值的双倍。
15. 改CPU型号
在 \frameworks\base\core\java\android\widget\TextView.java
private void setText(CharSequence text, BufferType type,
boolean notifyBefore, int oldlen) {
if (text == null) {
text = "";
}
//add start
if(text.toString().trim().equals("Dual-Core ARMv7 Procesor")){
text = "MT6572"
}
//add end
.....
}
例:
if(text.toString().trim().equals("MT8382")){
text = "Exynos 5420";
}
if(text.toString().trim().equals("1280 x 800")){
text = "2560 x 1600";
}
16. Android获取手机制作商,系统版本等
在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息。
android.os.Build类中。包括了这样的一些信息。我们可以直接调用 而不需要添加任何的权限和方法。
android.os.Build.BOARD:获取设备基板名称
android.os.Build.BOOTLOADER:获取设备引导程序版本号
android.os.Build.BRAND:获取设备品牌
android.os.Build.CPU_ABI:获取设备指令集名称(CPU的类型)
android.os.Build.CPU_ABI2:获取第二个指令集名称
android.os.Build.DEVICE:获取设备驱动名称
android.os.Build.DISPLAY:获取设备显示的版本包(在系统设置中显示为版本号)和ID一样
android.os.Build.FINGERPRINT:设备的唯一标识。由设备的多个信息拼接合成。
android.os.Build.HARDWARE:设备硬件名称,一般和基板名称一样(BOARD)
android.os.Build.HOST:设备主机地址
android.os.Build.ID:设备版本号。
android.os.Build.MODEL :获取手机的型号 设备名称。
android.os.Build.MANUFACTURER:获取设备制造商
android:os.Build.PRODUCT:整个产品的名称
android:os.Build.RADIO:无线电固件版本号,通常是不可用的 显示unknown
android.os.Build.TAGS:设备标签。如release-keys 或测试的 test-keys
android.os.Build.TIME:时间
android.os.Build.TYPE:设备版本类型 主要为"user" 或"eng".
android.os.Build.USER:设备用户名 基本上都为android-build
android.os.Build.VERSION.RELEASE:获取系统版本字符串。如4.1.2 或2.2 或2.3等
android.os.Build.VERSION.CODENAME:设备当前的系统开发代号,一般使用REL代替
android.os.Build.VERSION.INCREMENTAL:系统源代码控制值,一个数字或者git hash值
android.os.Build.VERSION.SDK:系统的API级别 一般使用下面大的SDK_INT 来查看
android.os.Build.VERSION.SDK_INT:系统的API级别 数字表示
android.os.Build.VERSION_CODES类 中有所有的已公布的Android版本号。全部是Int常亮。可用于与SDK_INT进行比较来判断当前的系统版本
17.
而这个persist.sys.usb.config 中adb 的配置是在alps/build/tools/post_process_props.py 中根据ro.debuggable = 1 or 0 来设置,1 就是开启adb, 0 即关闭adb debug. 而这个ro.debuggable 也是在alps/build/core/main.mk 中设置,和2.3 修改类似
不过您这样打开之后,对于user 版本adb shell 开启的还是shell 权限,而不是root 权限,如果您需要root 权限,需要再改一下system/core/adb/adb.c 里面的should_drop_privileges() 这个函数,在#ifndef ALLOW_ADBD_ROOT 时return 0; 而不是return 1; 即可。
User版本默认打开USB调试开关:
ro.debuggable=1
persist.service.adb.enable=1
18. Android动画切换
(1)*.java //设置切换动画,从右边进入,左边退出
overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
(2)*.xml
<translate android:fromXDelta="100%p" android:toXDelta="0%p"
android:duration="500" />
注: android:fromXDelta 动画开始的位置, android:toXDelta 动画结束的位置, android:duration动画的时间。
19. 将Activity伪装成Dialog
就是给AndroidManifest文件中Activity添加Dialog样式属性
<activity android:name=".DialogActivity" android:label="@string/app_name"
android:theme="@android:style/Theme.Dialog">
20. Camera旋转90,270
MT6572平台:\mediatek\custom\mt6572\hal\camera\camera\cfg_setting_imgsensor.h
SensorOrientation_T const&
MT6575平台:\mediatek\custom\project\hal\camera\camera\cfg_tuning_mt6575.h
getSensorOrientation()
{
static SensorOrientation_T const inst = {
u4Degree_0 : 90, // main sensor in degree (0, 90, 180, 270)
u4Degree_1 : 0, // sub sensor in degree (0, 90, 180, 270)
u4Degree_2 : 90, // main2 sensor in degree (0, 90, 180, 270)
};
return inst;
}
21. 设置菜单下的SIM status、Wifi信号dbM值做假
路径: \mediatek\frameworks\base\op\java\com\mediatek\op\telephony\ServiceStateExt.java
public int mapGsmSignalDbm(int GsmRscpQdbm,int asu){
int dBm;
Log.d(TAG,"mapGsmSignalDbm() GsmRscpQdbm=" + GsmRscpQdbm + " asu=" + asu);
if (GsmRscpQdbm < 0) {
dBm = GsmRscpQdbm / 4; //Return raw value for 3G Network
} else {
dBm = -113 + (2 * asu);
}
if(FeatureOption.G6_V21_WEIHENG_GQ_PROJECT){
return dBm+15;
}else{
return dBm;
}
}
22. (一)修改马达震动电压
(1)\mediatek\custom\cp706\kernel\vibrator\cust_vibrator.c
static struct vibrator_hw cust_vibrator_hw = {
.vib_timer = 50,
#ifdef CUST_VIBR_LIMIT
.vib_limit = 10,
#endif
.vosel = VOL_2800,//电压值
};
(2)\mediatek\platform\mt6572\kernel\drivers\vibrator\vibrator.c
static int vibr_Enable(void)
{ ...
hwPowerOn(MT6323_POWER_LDO_VIBR, vibr_voltage, "VIBR");//修改这个值vibr_voltage
..
}
(二)修改震动强弱,通过修改震动时长以达到强震效果:
\packages\apps\Phone\src\com\android\phone\HapticFeedback.java
private static final long DURATION = 15; //4; // millisec.
23. Android里的音量调节 (2012-10-25 16:17:36)转载▼
步骤1:或许系统音量对象的实例
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
步骤2:获取各种音量情报
Android的音量信息一共有7种。
①通话音量
int max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
int current = mAudioManager.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
Log.d(”VIOCE_CALL”, “max : ” + max + ” current : ” + current);
②系统音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
Log.d(”SYSTEM”, “max : ” + max + ” current : ” + current);
③铃声音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
Log.d(”RING”, “max : ” + max + ” current : ” + current);
④音乐音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
Log.d(”MUSIC”, “max : ” + max + ” current : ” + current);
⑤提示声音音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_NOTIFICATION );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_NOTIFICATION );
Log.d(”NOTIFICATION”, “max : ” + max + ” current : ” + current);
⑥闹铃音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_ALARM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_ALARM );
Log.d(”ALARM”, “max : ” + max + ” current : ” + current);
⑦DTMF(Double Tone MulitiFrequency,双音多频)
设置音量的方法也很简单,AudioManager提供了方法:
public void setStreamVolume(int streamType, int index, int flags)
其他:
各种音量有不同的播放方式,例如,音乐就应该用MediaPlayer来播放。
private MediaPlayer mediaPlayer=null; //声频
mediaPlayer=MediaPlayer.create(AudioActivity.this, R.raw.music);
mediaPlayer.setLooping(true);//设置循环播放
mediaPlayer.start();//播放声音
而铃声就应该用RingtoneManager来播放。
如果混用的话,参照的音量就会不正确。
这个时候可以通过设定流类型来改善。
例如
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mRingtone = RingtoneManager.getRingtone(getApplicationContext(), uri);
RingtoneManager是播放铃声的,如果用来播放通知音,
就需要把声音的流类型改成AudioManager.STREAM_NOTIFICATION
mRingtone.setStreamType(AudioManager.STREAM_NOTIFICATION );
24. 内存EMMC做假,步骤如下四步:
(1)mkfs.vfat -n voume_name -v -C fat.img [block-count]
(2)把fat.img mount到某个目录
mkdir fat_disk
mount -o loop,iocharset=utf8 fat.img fat_disk/
(3)umount fat_disk/
(4)./trim fat.img fat_sparse.img
25. Android去掉虚拟按键全屏显示的方法
在 oncreate 方法中 设置
if (Util.getCurrentAPIVersion() >= 14) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
要放在 setcontentview 方法前
而且这个方法只能在api 14以上的代码中使用,所以要注意加上判定。
另外无论你怎么隐藏 虚拟按键,在发生交互行为的时候,按键都是会出现的。具体的解释,可以参考官方文档
26. android截屏功能实现
/**
* 获取和保存当前屏幕的截图
*/
private void GetandSaveCurrentImage()
{
//构建Bitmap
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int w = display.getWidth();
int h = display.getHeight();
Bitmap Bmp = Bitmap.createBitmap( w, h, Config.ARGB_8888 );
//获取屏幕
View decorview = this.getWindow().getDecorView();
decorview.setDrawingCacheEnabled(true);
Bmp = decorview.getDrawingCache();
//图片存储路径
String SavePath = getSDCardPath()+"/Demo/ScreenImages";
//保存Bitmap
try {
File path = new File(SavePath);
//文件
String filepath = SavePath + "/Screen_1.png";
File file = new File(filepath);
if(!path.exists()){
path.mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = null;
fos = new FileOutputStream(file);
if (null != fos) {
Bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.flush();
fos.close();
Toast.makeText(mContext, "截屏文件已保存至SDCard/ScreenImages/目录下",Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取SDCard的目录路径功能
* @return
*/
private String getSDCardPath(){
File sdcardDir = null;
//判断SDCard是否存在
boolean sdcardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(sdcardExist){
sdcardDir = Environment.getExternalStorageDirectory();
}
return sdcardDir.toString();
}
27. Linux下对工程搜索字串命令
grep -Irns "xxxxxx"
28. 情景模式下打开“Touch sound 触摸提示音”
(1)在\mediatek\frameworks\base\media\audio\java\com\mediatek\audioprofile\AudioProfileManager.java
final boolean DEFAULT_SOUNDEFFECT_GENERAL = true; //只改此处即可
(2)\frameworks\base\packages\SettingsProvider\res\values\defaults.xml
<bool name="def_sound_effects_enabled">true</bool> //改此处无效
29.
mt_set_gpio_mode(GPIO_ALS_EINT_PIN, GPIO_ALS_EINT_PIN_M_EINT);
mt_set_gpio_dir(GPIO_ALS_EINT_PIN, GPIO_DIR_IN);
mt_set_gpio_pull_enable(GPIO_ALS_EINT_PIN, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select(GPIO_ALS_EINT_PIN, GPIO_PULL_UP);
这个代码的意思
1. 设置mode为中断
2. 设置输入GPIO
3. 维持上来 内部的
4. 默认高阻 就是开机的时候维持高电平
30. G-sensor兼容开关
# one load to support different accelerometer sensor
MTK_AUTO_DETECT_ACCELEROMETER=no
31. 音量等级
默认音量等级: \frameworks\base\media\java\android\media\AudioManager.java
public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
6, // STREAM_VOICE_CALL
7,//7, // STREAM_SYSTEM
4,// 4, // STREAM_RING
...
};
最大音量: \frameworks\base\media\java\android\media\AudioService.java
private final int[] MAX_STREAM_VOLUME = new int[] {
6, // STREAM_VOICE_CALL
7, // STREAM_SYSTEM
7, // STREAM_RING
...
};
32. G-sensor方向旋转
(1)\mediatek\kernel\drivers\hwmon\hwmsen\hwmsen_helper.c
struct hwmsen_convert map[] = {
{ { 1, 1, 1}, {0, 1, 2} },
{ {-1, 1, 1}, {1, 0, 2} },
{ {-1,-1, 1}, {0, 1, 2} },
//{ { 1,-1, 1}, {1, 0, 2} },
{ { 1,-1, -1}, {1, 0, 2} },
{ { 1, -1,-1}, {0, 1, 2} },
{ { 1, 1,-1}, {1, 0, 2} },
{ { 1,-1,-1}, {0, 1, 2} },
{ {-1,-1,-1}, {1, 0, 2} },
};
(2)\mediatek\custom\cp600\kernel\accelerometer\bma250_auto\cust_acc.c
static struct acc_hw cust_acc_hw = {
.i2c_num = 1,
.direction = 4, // 4///3,
.power_id = MT65XX_POWER_NONE, /*!< LDO is not used */
.power_vol= VOL_DEFAULT, /*!< LDO is not used */
.firlen = 0, //old value 16 /*!< don't enable low pass fileter */
};
33. MIPI与DVP接口区别
DVP是并口,需要PCLK、VSYNC、HSYNC、D[0:11]——可以是8/10/12bit数据,看ISP或baseband是否支持;
MIPI是LVDS,低压差分串口。只需要要CLKP/N、DATAP/N——最大支持4-lane,一般2-lane可以搞定。
显然,MIPI接口比DVP的接口信号线少,由于是低压差分信号,产生的干扰小,抗干扰能力也强。最重要的是DVP接口在信号完整性方面受限制,速率也受限制。500W还可以勉强用DVP,800W及以上都采用MIPI接口。
34. 调光感关闭了I2C兼容共用
\mediatek\platform\mt6572\kernel\core\mt_devs.c
35. 取消破解减360
(1) \mediatek\custom\cp695\lk\include\target\board.h
//#define CFG_DISPLAY_HEIGHT (DISP_GetScreenHeight()-360)//Daniel_mod_lcm
(2)\mediatek\kernel\drivers\video\mtkfb.c
//MTK_FB_YRES = DISP_GetScreenHeight()-360;//Daniel_mod 20141017: Debug 6.95Lcm,delete 360
36. Android 判断sd卡和sim卡是否可用
在一个项目中,要用到sdcard和sim卡。使用sdcard时,需要判断其状态是否可读写。使用sim卡时,要判断是否可读,怎么做呢,请参阅下面两个函数:
//sdcard是否可读写
public boolean IsCanUseSdCard() {
try {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
//sim卡是否可读
public boolean isCanUseSim() {
try {
TelephonyManager mgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
return TelephonyManager.SIM_STATE_READY == mgr
.getSimState();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
主要用到了:android.telephony.TelephonyManager、android.os.Environment及android.app.Activity.getSystemService 方法
37. 开机第一张Logo花屏、屏闪
不良原因為:主板在boot的VSYNC設置的參數過大,達到1270,
而正常的為: VW+VBP+BFP+600=1+22+12+600=635
而其knerel設置是正確的,故導致開機時前面的畫面異常,後面的顯示OK。
38. 延时
void Delayms(kal_uint32 ms)
{
kal_uint32 i;
for(i=0;i<5000*ms;i++)
}
39. Mtk Android 之NvRAM customer
分类: Linux_mtk 2014-08-27 15:17 100人阅读 评论(0) 收藏 举报
转载:http://blog.csdn.net/cbk861110/article/details/26851817
(1)nvram lib id定义:
alps\mediatek\custom\prj\cgen\inc\Custom_NvRam_LID.h
typedef enum
{
AP_CFG_RDCL_FILE_AUDIO_LID=AP_CFG_CUSTOM_BEGIN_LID,//AP_CFG_CUSTOM_BEGIN_LID: this lid must not be changed, it is reserved for system.
AP_CFG_REEB_PRODUCT_INFO_LID,
AP_CFG_CUSTOM_FILE_MAX_LID,
} CUSTOM_CFG_FILE_LID;
#define AP_CFG_REEB_PRODUCT_INFO_LID_VERNO "000"
(2)nvram lib id的数据结构和版本号声明
\alps\mediatek\custom\prj\cgen\inc\Custom_NvRam_data_item.h
LID_BIT VER_LID(AP_CFG_REEB_PRODUCT_INFO_LID)
PRODUCT_INFO *CFG_FILE_PRODUCT_INFO_TOTAL
{
};
(3)nvram lib内容加入nvram数组中
\alps\mediatek\custom\prj\cgen\inc\CFG_file_info_custom.h
const TCFG_FILE g_akCFG_File_Custom[]=
{
{
"/data/nvram/APCFG/APRDEB/PRODUCT_INFO", VER(AP_CFG_REEB_PRODUCT_INFO_LID), CFG_FILE_PRODUCT_INFO_SIZE,
CFG_FILE_PRODUCT_INFO_TOTAL, SIGNLE_DEFUALT_REC, (char *)&stPRODUCT_INFOConfigDefault,DataReset, NULL
},
};
(4)nvram lib 数据结构定义
alps\mediatek\custom\prj\cgen\inc\CFG_file_info_custom.h
// the record structure define of PRODUCT_INFO nvram file
typedef struct
{
unsigned char imei[8];
unsigned char svn;
unsigned char pad;
} nvram_ef_imei_imeisv_struct;
typedef struct{
unsigned char barcode[64];
nvram_ef_imei_imeisv_struct IMEI[4];
unsigned char reserved[1024-40-64];
}PRODUCT_INFO;
//the record size and number of PRODUCT_INFO nvram file
#define CFG_FILE_PRODUCT_INFO_SIZE sizeof(PRODUCT_INFO)
#define CFG_FILE_PRODUCT_INFO_TOTAL 1
(5)nvram lib 默认值定义
alps\mediatek\custom\prj\cgen\cfgdefault\CFG_PRODUCT_INFO_Default.h
PRODUCT_INFO stPRODUCT_INFOConfigDefault =
{
/* barcode */
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
/* IMEI*/
{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0},
/* reserved */
}
(6)nvram lib id需要备份到BinRegion:
\alps\mediatek\custom\prj\cgen\CFG_file_info.c
FileName aBackupToBinRegion[]=
{
#ifndef MTK_PRODUCT_INFO_SUPPORT
{"PRODUCT_INFO",AP_CFG_REEB_PRODUCT_INFO_LID},
#endif
};
(7)native(c)层读写:
[FAQ04545]【NvRAM】Native层读写nvram
1,NVM_GetFileDesc(file_lid, &rec_size, &rec_num,true);//读打开
2,read
3,NVM_CloseFileDesc
4,NVM_GetFileDesc(file_lid, &rec_size, &rec_num,false);//写打开
5,write
6,NVM_CloseFileDesc
(8)java层读写:
参照[FAQ04542]【NvRAM】apk中中读写nvram
IBinder binder = ServiceManager.getService("NvRAMAgent");
NvRAMAgent agent = NvRAMAgent.Stub.asInterface(binder);
buffer = agent.readFile(AP_CFG_CUSTOM_FILE_LID_ID);
agent.writeFile(AP_CFG_CUSTOM_FILE_LID_ID,buffer);
40. Android4.4 MT6572,KK版,开机第一张Logo和第二张Logo之间会出现花屏(第一张Logo开始能正常显示2-3秒钟就开始花屏)。
目前是在分辨率:540X960的情况下花屏,其他分辨率正常。
解决如下: 路径: \mediatek\platform\mt6572\lk\disp_drv.c
UINT32 DISP_GetVRamSize(void)
{
// Use a local static variable to cache the calculated vram size
//
static UINT32 vramSize = 0;
if (0 == vramSize)
{
...
// Align vramSize to 1MB
//
vramSize = ALIGN_TO_POW_OF_2(vramSize, 0x100000);
//if((vramSize%0x100000) < 0x1000){
// vramSize += 0x1000;
// }
DISP_LOG("DISP_GetVRamSize-1: %u bytes\n", vramSize);
if((DISP_GetScreenWidth()==540) && (DISP_GetScreenHeight()==960)){
vramSize=0xb00000;//增加此语句 Add this line to solve First logo abnormal display.
}
DISP_LOG("DISP_GetVRamSize: %u bytes\n", vramSize);
}
return vramSize;
}
41. 去掉设置-存储-内部存储
\packages\apps\Settings\src\com\android\settings\deviceinfo\Memory.java
public void onCreate(Bundle icicle) {
...
if (mMemoryExts.isAddInternalCategory()) {
// addCategory(StorageVolumePreferenceCategory.buildForInternal(context));
}
...
}
42. android 如何将桌面较长的图标名称显示完整(有些APP的图标名称太长)
(1)请找到对应的res资源,修改styles.xml,将
<style name="WorkspaceIcon.Portrait">
<item name="android:drawablePadding">0dp</item>
...
<item name="android:lines">2</item> //增加此项
</style>
(2)请修改BubbleTextView.java的applyFromShortcutInfo方法,将
setCompoundDrawablePadding((int) ((grid.folderIconSizePx - grid.iconSizePx) / 2f));
这行代码中的参数改小为合适的值。
43. android Launcher3中主菜单的布局调整(如从5*4调整为4*4)
Launcher3主菜单布局的行数和列数,都是在DynamicGrid.java中动态计算的,xml中无法配置。
如果想修改主菜单的布局,调整行数和列数,请修改DynamicGrid.java中allAppsNumRows和allAppsNumCols的值。
44. android 让Launcher Hotseat中的图标显示title
(1)请修改alps/packages/apps/Launcher2/res/values/dimens.xml中的hotseat_cell_height值,例如修改为100;
(2)请修改alps/packages/apps/Launcher2/src/com/android/launcher2/HotSeat.java中的resetLayout()方法,对主菜单图标添加title,例如:添加allAppsButton.setText("allAppsButton_title");
(3)请修改alps/packages/apps/Launcher2/src/com/android/launcher2/CellLayout.java的addViewToCellLayout方法,将下面的代码注释掉:
// Hotseat icons - remove text
if (child instanceof BubbleTextView) {
BubbleTextView bubbleChild = (BubbleTextView) child;
bubbleChild.setTextVisibility(!mIsHotseat);
}
45. android 打开蓝牙语音拨号功能
修改mediatek/external/bluetooth/bt_cust/bt_cust_table.h文件,将HFPVoiceRecognition属性的值改为1。
{
.name = "HFPVoiceRecognition",
.value = (void*)1,
},
46. android 修改设备管理器中的磁盘驱动器名
1)修改F_mass_storage.c中fsg_common_init()的此处代码:
snprintf(common->inquiry_string, sizeof common->inquiry_string,
"%-8s%-16s%04x", cfg->vendor_name ?: "Linux",
/* Assume product name dependent on the first LUN */
cfg->product_name ?: (common->luns->cdrom
? "File-Stor Gadget"
: "File-CD Gadget"),
i);
2)或者直接修改/sys/class/android_usb/f_mass_storage/inquiry_string内容
47. Flash做兼容时,Preloader bin size过大编译报错怎么办
相关的FAQ请参考"[FAQ07839]【Storage】eMMC和NAND Flash的兼容个数" 對於KK版本,由於Preloader新增了對LPDDR3的支援,
因此default可能無法配置出10顆兼容的mcp/emcp/discrete dram,需要參考以下的說明修改code,減少debug code佔用的size。
* MT6589/72/71平台,请修改alps\mediatek\platform\$PLATFORM\preloader\src\drivers\inc\mt_pmic_wrap_init.h文件
* MT6582/92平台,请修改alps\mediatek\platform\$PLATFORM\preloader\src\drivers\inc\pmic_wrap_init.h文件
具体修改code的方法是一样的:
(1)#define PMIC_WRAP_DEBUG //注释掉这一行
(2)#define PWRAPERR(fmt, arg...) printf(PWRAPTAG "ERROR,line=%d " fmt, __LINE__, ##arg)
修改为:#define PWRAPERR(fmt, arg...) printf(PWRAPTAG "ERROR,line=%d ", __LINE__)
另外JB3.MP MT6572版本的check_size.sh脚本存在bug,size检查机制会失效,
如果您发现在这个脚本中PL_MAX_ROM_SIZE定义的方法如下,那么就说明您没有打上patch,需要提e-service申请ALPS00869854这笔patch。
# Keep ROM size smaller than 90KB PL_MAX_ROM_SIZE=(95*1024)
注:针对编译报错 mt_pmic_wrap_init.c:772: error: undefined reference to 'PWRAPFUC',用宏开关PMIC_WRAP_DEBUG控制即可编译通过。
48. linux 下查找文件或者内容常用命令
whereis <程序名称>
查找软件的安装路径
-b 只查找二进制文件
-m 只查找帮助文件
-s 只查找源代码
-u 排除指定类型文件
-f 只显示文件名
-B <目录> 在指定目录下查找二进制文件
-M <目录> 在指定目录下查找帮助文件
-S <目录> 在指定目录下查找源代码
locate <文件名称>
在文件索引数据库中搜索文件
-d <数据库路径> 搜索指定数据库
updatedb
更新文件索引数据库
find [路径] <表达式>
查找文件
-name <表达式> 根据文件名查找文件
-iname <表达式> 根据文件名查找文件,忽略大小写
-path <表达式> 根据路径查找文件
-ipath <表达式> 根据路径查找文件,忽略大小写
-amin <分钟> 过去N分钟内访问过的文件
-atime <天数> 过去N天内访问过的文件
-cmin <分钟> 过去N分钟内修改过的文件
-ctime <天数> 过去N天内修改过的文件
-anewer <参照文件> 比参照文件更晚被读取过的文件
-cnewer <参照文件> 比参照文件更晚被修改过的文件
-size <大小> 根据文件大小查找文件,单位b c w k M G
-type <文件类型> 根据文件类型查找文件。b 块设备 c 字符设备 d 目录 p 管道文件 f 普通文件 l 链接 s 端口文件
-user <用户名> 按归属用户查找文件
-uid <uid> 按UID查找文件
-group <群组名> 按归属群组查找文件
-gid <gid> 按GID查找文件
-empty 查找空文件
从文件内容查找匹配指定字符串的行:
$ grep "被查找的字符串" 文件名
从文件内容查找与正则表达式匹配的行:
$ grep –e “正则表达式” 文件名
查找时不区分大小写:
$ grep –i "被查找的字符串" 文件名
查找匹配的行数:
$ grep -c "被查找的字符串" 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行
find / -type f -name "*.log" | xargs grep "ERROR"
系统查找到httpd.conf文件后即时在屏幕上显示httpd.conf文件信息。
find/-name"httpd.conf"-ls
在根目录下查找某个文件
find . -name "test"
在某个目录下查找包含某个字符串的文件
grep -r "zh_CN" ./
49. 通过查字符找文件
find ./ name "aaa"
50. Android4.4 Database路径
\out\target\product\cp706_pq_jqx250\obj\CODEGEN\cgen
\out\target\product\cp706_pq_jqx250\obj\CUSTGEN\custom\modem
51. Camera照相闪烁
Android4.2
packages\apps\Camera\src\com\android\camera\SettingChecker.java
RESET_STATE_VALUE[ROW_SETTING_ANTI_FLICKER] = new String[]{"60HZ
Android4.4
\packages\apps\Camera\res\values\camera_arrays.xml
<!-- Default antibanding setting.-->
<string-array name="pref_camera_antibanding_default_array" translatable="false">
<item>50hz</item>
<item>off</item>
<item>auto</item>
</string-array>
52. 关闭串口打印开关
\mediatek\custom\Project_name\preloader\inc\cust_bldr.h
#define CFG_LOG_BAUDRATE (921600)
#define CFG_META_BAUDRATE (115200)
#define CFG_UART_LOG (UART1) //(UART2) //若要关闭则改为UART2,打开则为UART1
#define CFG_UART_META (UART1)
53. USB打印
打印信息保存路径
adb shell cat /proc/kmsg >D://test