android 零星調試筆記(二)

續上篇:http://blog.csdn.net/jimbo_lee/article/details/8694265

通過包名獲取其他包的Context實例

Context有個createPackageContext方法,可以創建另外一個包的上下文,這個實例不同於它本身的Context實例,但是功能是一樣的。這個方法有兩個參數:
1。packageName  包名,要得到Context的包名
2。flags  標誌位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY兩個選項。CONTEXT_INCLUDE_CODE的意思是包括代碼,也就是說可以執行這個包裏面的代碼。CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加這個標誌的話,有些功能是用不了的,會出現安全警告。

java語言中byte[]與十六進制字符串轉換

/** 
* bytes轉換成十六進制字符串 
*/ 
public static String byte2HexStr(byte[] b) { 
String hs = ""; 
String stmp = ""; 
for(int n = 0; n < b.length; n++){ 
stmp = (Integer.toHexString(b[n] & 0XFF)); 
if(stmp.length() == 1) 
hs = hs + "0" + stmp; 
else 
hs = hs + stmp; 
} 
return hs.toUpperCase(); 
} 


/** 
* 十六進制字符串轉換成bytes 
*/ 
public static byte[] hexStr2Bytes(String src) { 
int m = 0, n = 0; 
int l = src.length() / 2; 
byte[] ret = new byte[l]; 
for(int i = 0; i < l; i++){ 
m = i * 2 + 1; 
n = m + 1; 
ret[i] = uniteBytes(src.substring(i * 2, m), src.substring(m, n)); 
} 
return ret; 
} 

private static byte uniteBytes(String src0,String src1) { 
byte b0 = Byte.decode("0x" + src0).byteValue(); 
b0 = (byte) (b0 << 4); 
byte b1 = Byte.decode("0x" + src1).byteValue(); 
byte ret = (byte) (b0 | b1); 
return ret; 
} 
在處理byte數組與字符串轉換的時候,可以使用中間類型十六進制字符串。 

附:    java中 byte字符處理

/**
*將字節數組補成8的倍數,以0填充; 
*/
public static byte[] addZerosForDes(byte[] source) 
{ 
byte [] ret = null; 
if(source==null || source.length%8==0) 
ret = source; 
else 
{ 
int i = source.length+8-source.length%8; 
ret = new byte[i]; 
System.arraycopy(source,0,ret,0,source.length); 
} 
return ret; 
} 

/**
*將字節數組末尾的0去掉(小於8位); 
*/
public static byte[] removeZerosForDes(byte[] encoding) {
byte[] ret = null; 
if (encoding != null && encoding.length > 0) { 
int i = encoding.length; 
while (i-1>=0) { 
if (encoding[i - 1] != (byte) 0) 
break; 
i--; 
} 
ret = new byte[i]; 
System.arraycopy(encoding, 0, ret, 0, i); 
} 
return ret; 
} 

如何判斷字符串是否可以轉換成數字

str.matches("\\d+"); // int
str.matches("\\d+(\\.)?(\\d+)?"); // double or float

把bitmap圖片轉換成byte[]數據

InputStream inputStream = resource.openRawResource(resId);  
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
byte[] bitmapBuffer = bitmap2ByteArray(bitmap);
public static byte[] bitmap2ByteArray(Bitmap bitmap) {
		int height = bitmap.getHeight();
		int width = bitmap.getWidth();

		byte[] tmpBuf = new byte[(height / 8 + 1) * width + 1];
		int[] p = new int[8];
		int t = 0;
		for (int x = 0; x < width; x++) {
			for (int y = 0; y < height; y += 8) {
				for (int m = 0; m < 8; m++) {
					if (y + m >= height){
						p[m] = 0;
					}else {
						p[m] = (bitmap.getPixel(x, y + m) == -1 ? 0 : 1);
					}
				}
				int value = p[0] * 128 + p[1] * 64 + p[2] * 32 + p[3] * 16 + p[4] * 8 + p[5] * 4 + p[6] * 2 + p[7];
				tmpBuf[(++t)] = ((byte) value);
			}
		}
		byte[] realBuf = new byte[t + 1];
		for (int i = 0; i < t + 1; i++) {
			realBuf[i] = tmpBuf[i];
		}
		return realBuf;
	}

NDK開發中 在native方法中使用logcat:

第一步:在對應的mk文件中加入:LOCAL_LDLIBS := -llog
第二步:在要使用LOG的cpp文件中加入:
#include <android/log.h>
第三步:定義各個宏
#define LOG_TAG "nativeRfidUnpack"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__) 
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO  , LOG_TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN  , LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , LOG_TAG, __VA_ARGS__)
第四步:使用
	LOGE("---Java_com_odm_rfid_RfidDevice_nativeDeviceUnpack ---");

NDK開發中使用第三方靜態庫的方法:

將NDK編譯的第三方靜態拷貝到JNI目錄下,在Android.mk中添加如下代碼
以openssl靜態庫(libcrypto-static.a)爲例

第一種鏈接方法:LOCAL_LDFLAGS := libcrypto-static.a

第二種鏈接方法:LOCAL_LDLIBS := libcrypto-static.a

第三種鏈接方法:
include $(CLEAR_VARS)

LOCAL_MODULE := third_static_lib (可以隨便起一個名字)

LOCAL_SRC_FILES := libcrypto-static.a

include $(PREBUILT_STATIC_LIBRARY)

//在你要編譯的模塊中引用third_static_lib

LOCAL_STATIC_LIBRARIES := third_static_lib

No implementation found for native Lcom/android/rfid/RfidUnPack;.nativeUnpackImage:([B[BI)I

在native的實現文件中開頭加入代碼:

namespace android {
<span style="white-space:pre">	</span>
#ifdef __cplusplus
extern "C" {
#endif
結尾加入代碼:
#ifdef __cplusplus
}
#endif
}//namespace android
即ok了 

判斷閏年

if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
return true;
}else{
return false;
}

使用Eclipse的Export功能生成jar包:

一、打包成一般的jar包:

步驟如下:

  1)在要打包的項目上右擊,選擇Export。

  2)在彈出的窗口中,選擇Java -> JAR File,然後點擊next按鈕。

  3)在JAR File Specification窗口中,設置打包成的文件名和存放位置,點擊兩側next。

  4)在JAR Manifest Specification窗口中,設置MANIFEST.MF清單文件的配置,若僅僅打包成單純的jar包的話,不用做任何修改,採取默認即可,若打包成可執行jar包的話,可以使用已存在的MANIFEST文件或者直接選擇Main class。

  5)點擊Finish按鈕,完成打包。

二、打包成可運行的jar包

步驟如下:

  1)在要打包的項目上右擊,選擇Export。

  2)在彈出的窗口中,選擇Java -> Runnable JAR File,然後點擊next按鈕。

  3)在Runnable JAR File Specification窗口中,選擇Launch configuration和Export destination。

  4)點擊Finish按鈕,打包完成。

攔截系統home鍵功能,即按home鍵不返回待機

在oncreate函數中增加代碼

final android.view.Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);

或在調用setContentView函數之前增加代碼

getWindow().setFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED, WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);

Android.mk編譯文件中 LOCAL_MODULE_TAGS選項的含義:

LOCAL_MODULE_TAGS :=user eng tests optional
user: 指該模塊只在user版本下才編譯          
eng: 指該模塊只在eng版本下才編譯            
tests: 指該模塊只在tests版本下才編譯        
optional:指該模塊在所有版本下都編譯   

Java中 String.formatter 的應用

long now = System.currentTimeMillis();
String s = String.format("%tR", now);// "15:12" 
Date d = new Date(now);
s = String.format("%tD", d);// "07/13/04" // Current month/day/year
s = String.format("%,d", Integer.MAX_VALUE); // "2,147,483,647" 
s = String.format("%05d", 123);              // "00123"

格式: %[argument_index$][flags][width][.precision]conversion

可選的 argument_index 是一個十進制整數,用於表明參數在參數列表中的位置。第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推。 
      可選的 flags 是修改輸出格式的字符集。有效標誌的集合取決於轉換類型。  

可選 width 是一個非負十進制整數,表明要向輸出中寫入的最少字符數。 
      可選 precision 是一個非負十進制整數,通常用來限制字符數。特定行爲取決於轉換類型。 
      所需的 conversion 是一個表明應該如何格式化參數的字符。給定參數的有效轉換集合取決於參數的數據類型。

對於日期、時間  第一個字符是 't' 或 'T'。第二個字符表明所使用的格式  具體格式參考 類 java.util.Formatter

示例代碼:

Double d = 12.3366;  
System.out.println(String.format("%2$08d", -3123,-5566));  
System.out.println(String.format("%1$9d", -31));  
System.out.println(String.format("%1$-9d", -31));  
System.out.println(String.format("%1$(9d", -31));  
System.out.println(String.format("%1$#9x", 5689));  

//小數點後面兩位  
System.out.println(String.format("%1$.2f", 5689.0)); //必須是同類型的才能進行轉換  

//格式化的位置  
/*String str = "I love ni %s, you love me %s"; 
String str2 = "I love ni %2$s, you love me %1$s"; 

System.out.println(String.format(str, "abcdefg","1234567")); 

System.out.println(String.format(str2, "abcdefg","1234567"));*/  

//數組的操作  
Object[] sendData = new Object[4];  
sendData[0] = Integer.valueOf(1);  
sendData[1] = "172.12.1.2";  
sendData[2] = Integer.valueOf(123);  
sendData[3] = "testadfaerfa";  
String sendDataString = String.format("%d,%s,%d,%s",(Object[]) sendData);  
System.out.println(sendDataString);  
http://blog.csdn.net/feng_870906/article/details/6870788

全測試monkey指令

adb shell monkey --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --ignore-native-crashes 10000000

靜態壁紙,調整壁紙顯示位置

KK版本 修改文件:packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
       public void syncWithScroll() {
if(enableWallpaperScroll){
//ori code -- 會根據當前screen位置調整牆紙位置
float offset = wallpaperOffsetForCurrentScroll();
mWallpaperOffset.setFinalX(offset);
}else{
//新增code -- 不會根據當前screen位置調整牆紙位置, 僅根據當前手機方向(GSensor方向)調整牆紙位置
if(mLauncher.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
mWallpaperOffset.setFinalX((float) 0.55);
}else{
mWallpaperOffset.setFinalX((float) 0.48);
}
}
updateOffset(true);
}

判斷當前手機是橫屏還是豎屏

mLauncher.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE

手機eng、user版本互轉

  int sdkVersion = SystemProperties.getInt(ANDROID_BUILD_VERSION, 10);
  if(sdkVersion >= ANDROID_BUILD_ICS){
      toRoot_ics();
  }else{
      toRoot_gb();
  }
	private static final String RO_ADB_SECURE = "ro.adb.secure";
    private static final String RO_SECURE = "ro.secure";
    private static final String RO_ALLOW_MOCK_LOCATION="ro.allow.mock.location";
    private static final String RO_DEBUG = "ro.debuggable";
    private static final String ADB_ENABLE_GB = "persist.service.adb.enable";
    private static final String ADB_ENABLE_ICS = "persist.sys.usb.config";
    private static final String ATCI_USERMODE = "persist.service.atci.usermode";

    private void toRoot_ics(){
        SystemProperties.set(ADB_ENABLE_ICS, "none");
        //SystemProperties.set("ctl.stop", "adbd");
        SystemProperties.set(RO_SECURE, "0");
		SystemProperties.set(RO_ADB_SECURE, "0");
        //SystemProperties.set(RO_ALLOW_MOCK_LOCATION,"1" );
        SystemProperties.set(RO_DEBUG, "1");
        SystemProperties.set(ADB_ENABLE_ICS, "mass_storage,adb,acm");
        //SystemProperties.set("ctl.start", "adbd");
        SystemProperties.set(ATCI_USERMODE, "1");
        try {
            Process proc = Runtime.getRuntime().exec("start atcid-daemon-u");
        } catch (IOException e) {
            e.printStackTrace();
        }
        Toast.makeText(User2rootActivity.this, "Update to Root Success", Toast.LENGTH_LONG).show();
    }

 
    private void toUser_ics(){
        SystemProperties.set(ATCI_USERMODE, "0");
        try {
            Process proc = Runtime.getRuntime().exec("stop atcid-daemon-u");
        } catch (IOException e) {
            e.printStackTrace();
        }
        SystemProperties.set(ADB_ENABLE_ICS, "mass_storage");
        SystemProperties.set(RO_SECURE, "1");
		SystemProperties.set(RO_ADB_SECURE, "1");
        //SystemProperties.set(RO_ALLOW_MOCK_LOCATION,"0" );
        SystemProperties.set(RO_DEBUG, "0");
        
        Toast.makeText(User2rootActivity.this, "Update to User Success", Toast.LENGTH_LONG).show();
    }

    private void toRoot_gb(){
        SystemProperties.set(RO_SECURE, "0");
        SystemProperties.set(RO_ALLOW_MOCK_LOCATION,"1" );
        SystemProperties.set(RO_DEBUG, "1");
        SystemClock.sleep(200);
        SystemProperties.set(ADB_ENABLE_GB, "1");
        Toast.makeText(User2rootActivity.this, "Update to Root Success", Toast.LENGTH_LONG).show();
    }

   private void toUser_gb(){
        SystemProperties.set(RO_SECURE, "1");
        SystemProperties.set(RO_ALLOW_MOCK_LOCATION,"0" );
        SystemProperties.set(RO_DEBUG, "0");
        SystemProperties.set(ADB_ENABLE_GB, "0");
        Toast.makeText(User2rootActivity.this, "Update to User Success", Toast.LENGTH_LONG).show();
    }

startActivityForResult   onActivityReult需要注意的事項

1、被startActivityForResult啓動的acitvity的啓動模式不能是singleInstance或singleTask   android:launchMode="singleTask"    否則 函數onActivityResult會被立即執行,子Activity是singleTask,父Activity是singleTask也不行,把子Activity改爲標準的才行
2、startActivityForResult調用時 requestCode 必須>0 才行,否則onActivityResult不會被調用

修改已經提交了的log (git commit -m"log")

1、如果是前一個提交,可以用 git commit --amend -m ""  或  git commit --amend  來改
2、更早這樣修改:假設要修改commit 65ae4f,執行 
   git rebase 65ae4f^ --interactive 
   在編輯器中把第一行的pick改爲edit,保存,退出,然後按提示操作。 
一般是第一種情況比較多,如果不是前一個提交也可以使用git reset commitID 把那個commit放到前一個提交,不過後面的提交要重新git add -> git commit 提交

ubuntu Terminal終端配色方案

文字顏色:#708284
背景顏色:#07242E
近似默認:文字顏色:#FFFFFF  背景:#270C1F

android中的ellipsize屬性

textview中有個內容過長加省略號的屬性,即ellipsize
用法如下:
在xml中
android:ellipsize = "end"    省略號在結尾
android:ellipsize = "start"   省略號在開頭
android:ellipsize = "middle"     省略號在中間
android:ellipsize = "marquee"  跑馬燈

最好加一個約束android:singleline = "true"

當然也可以用代碼語句
tv.setEllipsize(TextUtils.TruncateAt.valueOf("END"));
tv.setEllipsize(TextUtils.TruncateAt.valueOf("START"));
tv.setEllipsize(TextUtils.TruncateAt.valueOf("MIDDLE"));
tv.setEllipsize(TextUtils.TruncateAt.valueOf("MARQUEE"));
最好再加一個約束tv.setSingleLine(true);

不僅對於textview有此屬性,對於editext也有,不過它不支持marquee

SQL通配符字符的搜索

SELECT * FROM tablename WHERE intent LIKE  '%$%%' escape '$'  其中$可以是任何字符  
這句話就是在tablename中搜索字段 intent  含有%字符的數據

Linux 延時執行命令

NAME
       sleep - delay for a specified amount of time
SYNOPSIS
       sleep NUMBER[SUFFIX]...
       sleep OPTION
DESCRIPTION
       Pause for NUMBER seconds.  SUFFIX may be `s' for seconds (the default), `m' for minutes, `h' for hours or
       `d' for days.  Unlike most implementations that require NUMBER be an integer, here NUMBER may be an arbi‐
       trary  floating point number.  Given two or more arguments, pause for the amount of time specified by the
       sum of their values.
eg:  date;sleep 10s;date   先顯示當前日期 暫停10秒鐘,再顯示日期   結果如下:
Thu Jun 11 17:35:03 CST 2015
Thu Jun 11 17:35:13 CST 2015

Unable to add window android.view.ViewRootImpl

用到了懸浮按鈕,報這個錯誤,Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@4129fe70 -- permission denied for this window type,原因是沒有加權限。 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

android系統如何在靜音模式下關閉camera拍照聲音

在CameraService.cpp文件中,關於調用playsound()函數的地方加入如下判斷:

注意:property_get()函數需要引入頭文件,<cutils/properties.h>

Ubuntu12.04下eclipse提示框黑色背景色的修改方法

eclipse提示框的背景顏色使用的是系統的提示框顏色配置,在windows下爲黃色,但在Ubuntu12.04(gnome)下卻是黑色,造成提示內容很難看清。在eclipse中我們是無法修改這個顏色的配置的,只能通過修改系統的顏色配置。在ubuntu11.10以前,我們是可以能過自定義系統外觀來修改這一顏色的配置的,但自ubuntu11.10以後,就沒有相關的操作界面了,只能通過修改配置文件的方式實現了。這個文件位於/usr/share/themes/下對應的主題文件夾下,如你使用Radiance主題,就進入到/usr/share/themes/Radiance/目錄下,

cd /usr/share/themes/Radiance

打開gtk-2.0/gtkrc文件,

sudo vim gtk-2.0/gtkrc

修改第一行的tooltip_fg_color和tooltip_bg_color兩個屬性的值,如果沒有改屬性,可以自行添加,其值仿照windows的默認值,分別設定位:
tooltip_fg_color:#000000
tooltip_bg_color:#f2edbc

然後保存退出,打開系統外觀配置,切換一下主題,當切換回來的時候,修改的效果就生效了。

錯誤解決: java.lang.SecurityException: Permission Denial

應用場景:在一個app中的activity中通過包名、類名啓動另外一個app中的activity 下例爲在contacts中啓動factoryMode中的activity
錯誤:01-01 08:04:09.009: W/System.err(771): java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.mediatek.factorymode/.versionsdialog.InternalVersion } from ProcessRecord{e742bbe 3224:com.yunos.alicontacts/u0a1} (pid=3224, uid=10001) not exported from uid 1000
解決方案: 在目的activity中增加屬性 android:exported="true"
<activity
    android:name="com.mediatek.factorymode.versionsdialog.InternalVersion"
    android:exported="true"
    android:theme="@android:style/Theme.Dialog" />
<activity

Android Layout 中”@+id”、”@id”和”@android:id/”、”?android:attr”區別

    @表示引用資源,聲明這是一個資源引用—隨後的文本是以@[package:]type/name形式提供的資源名。 
    @android:string表明引用的系統的(android.*)資源 
    @string表示引用應用內部資源 
    對於id, 可以用@+id表明創建一個id 
    ?表示引用屬性 
    “?”引用主題屬性,當您使用這個標記,你所提供的資源名必須能夠在主題屬性中找到,因爲資源工具認爲這個資源屬性是被期望得到的,您不需要明確的指出它的類型(?android:attr/android:textDisabledColor)

緊急撥號列表

vendor/mediatek/proprietary/external/EccList/ecc_list.xml

TextView屬性大全

XML屬性
android:autoLink  是否自動鏈接網址或郵箱地址;
android:autoText  自動檢測錯誤;
android:bufferType  決定getText()返回的類型
android:capitalize  指定使用類型
android:cursorVisible  光標是否可見
android:digits   數字輸入
android:drawableBottom  內容顯示在文字的下邊
android:drawableEnd  內容顯示在文字的結尾
android:drawableLeft  內容顯示在文字的左邊
android:drawablePadding  內容和文字之間的空隙
android:drawableRight  內容顯示在文字的右邊
android:drawableStart   內容顯示在文字的開始
android:drawableTop  內容顯示在文字的上邊
android:editable   編輯功能,能夠使用輸入法
android:editorExtras  編輯功能擴展,用戶設置
android:ellipsize  橢圓區域的顯示方式
android:ems  可以在更多系統上運行
android:fontFamily  字體風格
android:freezesText 凍結在光標位置
android:gravity   文字小於顯示範圍時,x和y軸方向的調整
android:height  文字像素高度
android:hint  文本空白時的提示語
android:imeActionId  激活輸入法ID序號
android:imeActionLabel  激活輸入法符號
android:imeOptions  輸入法操作
android:includeFontPadding  足夠空間容納字體顯示
android:inputMethod  指定輸入法
android:inputType  選擇輸入法
android:lineSpacingExtra  額外的文字間距
android:lineSpacingMultiplier  額外的文字間距,乘數
android:lines  多行顯示
android:linksClickable  點擊鏈接
android:marqueeRepeatLimit  跑馬燈重複限制
android:maxEms  最大系統兼容
android:maxHeight  最大文本高度
android:maxLength  最大文本長度
android:maxLines  最大文本行數
android:maxWidth  最大文本長度
android:minEms  最小系統兼容
android:minHeight  最小文本高度
android:minLines  最小文本行數
android:minWidth  最小文本寬度
android:numeric  支持數字輸入
android:password 文本作爲密碼
android:phoneNumber  支持電話號碼輸入
android:privateImeOptions  私人輸入操作
android:selectAllOnFocus   點擊全部選中
android:shadowColor  陰影顏色
android:shadowDx  陰影水平偏移
android:shadowDy  陰影垂直偏移
android:shadowRadius  陰影半徑
android:singleLine  單行顯示
android:text  顯示文本
android:textAllCaps  文本全部大寫
android:textAppearance   基本的文字顏色,字體,大小,風格
android:textColor  文本顏色
android:textColorHighlight  文本高亮顏色
android:textColorHint  文本提示顏色
android:textColorLink  鏈接文本顏色
android:textIsSelectable   文本能夠被選中
android:textScaleX  水平縮放參數
android:textSize  文本大小
android:textStyle  文本風格
android:typeface  文本字體
android:width  文本寬度

Android中Intent對應的category列表大全

android.intent.category.ALTERNATIVE  
  android.intent.category.BROWSABLE  
  android.intent.category.DEFAULT
  android.intent.category.DEVELOPMENT_PREFERENCE  
  android.intent.category.EMBED  
  android.intent.category.HOME  
  android.intent.category.INFO  
  android.intent.category.LAUNCHER  
  android.intent.category.MONKEY  
  android.intent.category.OPENABLE  
  android.intent.category.PREFERENCE  
  android.intent.category.SELECTED_ALTERNATIVE  
  android.intent.category.TAB
  Android 2.0,2.0.1,2.1 新增車座和充電座
  android.intent.category.CAR_DOCK  
  android.intent.category.DESK_DOCK
  Android 2.2 新增行車模式
  android.intent.category.CAR_MODE
  ALTERNATIVE
  你將在這章的後面所看到的,一個 Intent Filter 的用途是使用動作來幫忙填入上下文菜單。 ALTERNATIVE 種類指定,在某種數據類型的項目上可以替代默認執行的動作。例如,一個聯繫人的默認動作時瀏覽它,替代的可能是去編輯或刪除它。  
SELECTED_ALTERNATIVE
  與 ALTERNATIVE 類似,但 ALTERNATIVE 總是使用下面所述的 Intent 解析來指向單一的動作。SELECTED_ALTERNATIVE在需要一個可能性列表時使用。
BROWSABLE
  指定在瀏覽器中的動作。當 Intent 在瀏覽器中被引發,都會被指定成 BROWSABLE 種類。
DEFAULT
  設置這個種類來讓組件成爲 Intent Filter 中定義的 data 的默認動作。這對使用顯式 Intent 啓動的 Activity 來說也是必要的。
GADGET
  通過設置 GADGET 種類,你可以指定這個 Activity 可以嵌入到其他的 Activity 來允許。
HOME
  HOME Activity 是設備啓動(登陸屏幕)時顯示的第一個 Activity 。通過指定 Intent Filter 爲 HOME 種類而不指定動作的話,你正在將其設爲本地 home 畫面的替代。
LAUNCHER
  使用這個種類來讓一個 Activity 作爲應用程序的啓動項。
data
  data 標籤允許你指定組件能作用的數據的匹配;如果你的組件能處理多個的話,你可以包含多個條件。你可以使用下面屬性的任意組合來指定組件支持的數據
android:host
  指定一個有效的主機名(例如, com.google )。
android:mimetype
  允許你設定組件能處理的數據類型。例如,<type android:value=”vnd.android.cursor.dir/*”/>能匹配任何 Android 遊標。
android:path
  有效地 URI 路徑值(例如, /transport/boats/ )。
android:port
  特定主機上的有效端口。
android:scheme
  需要一個特殊的圖示(例如, content 或 http )。

常用的MIME類型

.doc     application/msword
.docx   application/vnd.openxmlformats-officedocument.wordprocessingml.document
.rtf       application/rtf
.xls     application/vnd.ms-excel application/x-excel
.xlsx    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.ppt     application/vnd.ms-powerpoint
.pptx    application/vnd.openxmlformats-officedocument.presentationml.presentation
.pps     application/vnd.ms-powerpoint
.ppsx   application/vnd.openxmlformats-officedocument.presentationml.slideshow
.pdf     application/pdf
.swf    application/x-shockwave-flash
.dll      application/x-msdownload
.exe    application/octet-stream
.msi    application/octet-stream
.chm    application/octet-stream
.cab    application/octet-stream
.ocx    application/octet-stream
.rar     application/octet-stream
.tar     application/x-tar
.tgz    application/x-compressed
.zip    application/x-zip-compressed
.z       application/x-compress
.wav   audio/wav
.wma   audio/x-ms-wma
.wmv   video/x-ms-wmv
.mp3 .mp2 .mpe .mpeg .mpg     audio/mpeg
.rm     application/vnd.rn-realmedia
.mid .midi .rmi     audio/mid
.bmp     image/bmp
.gif     image/gif
.png    image/png
.tif .tiff    image/tiff
.jpe .jpeg .jpg     image/jpeg
.txt      text/plain
.xml     text/xml
.html     text/html
.css      text/css
.js        text/javascript
.mht .mhtml   message/rfc822

默認搜索引擎的修改:

默認搜索引擎設爲google
diff --git a/frameworks/base/services/core/java/com/mediatek/search/SearchEngineManagerService.java b/frameworks/base/se
index 0835085..f66dc55 100755
--- a/frameworks/base/services/core/java/com/mediatek/search/SearchEngineManagerService.java
+++ b/frameworks/base/services/core/java/com/mediatek/search/SearchEngineManagerService.java
@@ -167,9 +167,6 @@ public class SearchEngineManagerService extends ISearchEngineManagerService.Stub
         if(SystemProperties.getBoolean("ro.coolpad",false)){
            searchEngines = res.getStringArray(com.mediatek.internal.R.array.coolpad_new_search_engines);
         }
-        if(SystemProperties.getBoolean("ro.haier",false)){
-           searchEngines = res.getStringArray(com.mediatek.internal.R.array.new_search_engines_haier);
-        } 
         if (null == searchEngines || 1 >= searchEngines.length) {
             // todo: throws an exception in this case.
diff --git a/vendor/mediatek/proprietary/frameworks/base/res/res/values/donottranslate-new-search_engines.xml b/vendor/m
index 5331a73..069df47 100755
--- a/vendor/mediatek/proprietary/frameworks/base/res/res/values/donottranslate-new-search_engines.xml
+++ b/vendor/mediatek/proprietary/frameworks/base/res/res/values/donottranslate-new-search_engines.xml
@@ -37,10 +37,4 @@
     <item>baidu_English--Baidu--baidu.com--search_engine_baidu--http://m.baidu.com/s?from=1089a&amp;word={searchTerms}&
     <item>bing--Bing--bing.com--search_engine_bing--http://www.bing.com/search?q={searchTerms}--UTF-8--http://api.bing.
   </string-array>  
-  <string-array name="new_search_engines_haier" translatable="false">
-    <item>--</item>
-    <item>google--Google--google.com--search_engine_google--http://www.google.com/m?hl={language}&amp;ie={inputEncoding
-    <item>yahoo--Yahoo!--yahoo.com--search_engine_yahoo--https://search.yahoo.com/search?ei={inputEncoding}&amp;.tsrc=m
-    <item>bing--Bing--bing.com--search_engine_bing--http://www.bing.com/search?q={searchTerms}--UTF-8--http://api.bing.
-  </string-array> 
 </resources>
diff --git a/vendor/mediatek/proprietary/frameworks/base/res/res/values/symbols.xml b/vendor/mediatek/proprietary/framew
index e4ae534..ee07099 100755
--- a/vendor/mediatek/proprietary/frameworks/base/res/res/values/symbols.xml
+++ b/vendor/mediatek/proprietary/frameworks/base/res/res/values/symbols.xml
@@ -341,8 +341,7 @@
   <java-symbol type="array" name="new_search_engines" />
   <java-symbol type="array" name="no_google_search_engines" />
   <java-symbol type="array" name="coolpad_new_search_engines" />
-  <java-symbol type="array" name="new_search_engines_haier" />
   <java-symbol type="string" name="wday_year_month_day" />
   <java-symbol type="string" name="wday_year_day_month" />
   <java-symbol type="string" name="wday_month_day_year" />
vendor/mediatek/proprietary/frameworks/base/res/res/values/donottranslate-new-search_engines.xml 完整示例:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
  <string-array name="new_search_engines" translatable="false">
    <item>--</item>
    <item>baidu_English--Baidu--baidu.com--search_engine_baidu--http://m.baidu.com/s?from=1011857c&amp;ie=utf8&amp;word={searchTerms}--UTF-8--http://suggestion.baidu.com/su?wd={searchTerms}</item>
    <item>bing--Bing--bing.com--search_engine_bing--http://www.bing.com/search?q={searchTerms}--UTF-8--http://api.bing.com/osjson.aspx?query={searchTerms}&amp;language={language}</item>
  </string-array>
  <string-array name="coolpad_new_search_engines" translatable="false">
    <item>--</item>
    <item>baidu_English--Baidu--baidu.com--search_engine_baidu--http://m.baidu.com/s?from=1089a&amp;word={searchTerms}&amp;ua=bd_854_480_coolpad*5270_1.10--UTF-8--http://suggestion.baidu.com/su?wd={searchTerms}</item>
    <item>bing--Bing--bing.com--search_engine_bing--http://www.bing.com/search?q={searchTerms}--UTF-8--http://api.bing.com/osjson.aspx?query={searchTerms}&amp;language={language}</item>
  </string-array>
</resources>

動態獲取文本在窗口中佔用的長度

Paint p = new Paint();
p.setTextSize(textSize)
int markTextLen = (int)p.measureText(str);

MTK平臺送CTA注意事項

1.MTK_CTA_SUPPORT=yes
2.DM短信自注冊關閉,關閉
mediatek/config/<project>/custom.conf
dm.SmsRegState=0
3.號碼識別11位
4.刪除移動適配包(如下路徑):
vendor/mediatek/<project>/artifacts/out/target/product/lt;project>//system/vendor/operator/
5.一定要打開user2root切換,最好使用mtk原始的工模指令,入庫也一樣;
6.權限管理默認開啓;
7.發佈eng版本。

ListView焦點問題

如果在一個ListView上面放置一個可以接收焦點的東西,比如Button,當使用向上方向鍵滾動ListView到第一條後,焦點會移到上面的Button上,這個沒問題。但然後使用向下的方向鍵時,焦點會跳到ListView中當前窗口的最下面一條,而不是焦點離開時的第一條。在ListView下方有Button的時候,向上移動焦點,也會出現類似的情況。
方法一:重寫ListView OnFocusChanged()方法
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {  
    super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);  
    if (gainFocus && previouslyFocusedRect != null) {  
        final ListAdapter adapter = getAdapter();  
        final int count = adapter.getCount();  
        switch (direction) {  
            case FOCUS_DOWN:  
                for (int i = 0; i < count; i++) {  
                    if (!adapter.isEnabled(i)) {  
                        continue;  
                    }  
                    setSelection(i);  
                    break;  
                }  
                break;  
            case FOCUS_UP:  
                for (int i = count-1; i>=0; i--) {  
                    if (!adapter.isEnabled(i)) {  
                        continue;  
                    }  
                    setSelection(i);  
                    break;  
                }  
                break;  
            default:  
                break;  
        }  
    }  
}  
方法二:
給listView增加屬性 android:descendantFocusability="blocksDescendants"    

如何根據 dmesg打出的avc denied log確認是缺少哪個權限? 

      1.把含有avc denied的log保存到一個文件中:  avc.txt
2、使用命令 :audit2allow -i avc.txt 
 結果:
#============= shell ==============
allow shell default_prop:property_service set;   即爲在.te文件中需要添加的權限

[  536.338759] init: avc:  denied  { set } for property=usb.config.test scontext=u:r:shell:s0 tcontext=u:object_r:default_prop:s0 tclass=property_service
[  536.338794] init: sys_prop: permission denied uid:2000  name:usb.config.test
[  546.763292] init: avc:  denied  { set } for property=usb.config.test scontext=u:r:shell:s0 tcontext=u:object_r:default_prop:s0 tclass=property_service
[  546.763330] init: sys_prop: permission denied uid:2000  name:usb.config.test

如何根據 dmesg打出的avc denied log確認是哪個te文件中修改

命令: adb shell ps -Z

AVC:denied萬能套用公式

在scontext所指的te文件中加入類似如下內容:
           scontext  tcontext                   tclass   avc denied的權限
allow adbd        system_data_file:dir          read

audit2allow 安裝

The program 'audit2allow' is currently not installed. You can install it by typing:
apt-get install policycoreutils

Ubuntu上SourceInsight突然關閉,重新打開,一直是失敗,彈出對話框提示SourceInsight遇到嚴重問題,需要關閉

解決方案:
卸載後直接刪除%HOME下source insight目錄,然後重新安裝就OK了。
其實只要刪除%HOME/Soutce Insight/Settings下的所有文件,重新運行Source Insight即可。

編譯過程中動態改變app info(如version-code,version-name)

在Android.mk文件中修改LOCAL_AAPT_FLAGS,

舉例:高通SnapdragonCamera

include $(LOCAL_PATH)/version.mk
LOCAL_AAPT_FLAGS := \
        --auto-add-overlay \
        --version-name "$(version_name_package)" \
        --version-code $(version_code_package) \

version.mk代碼如下:

#
# Copyright (C) 2013 Google Inc.
#

# The version code scheme for the package apk is:
#      Mmbbbtad
# where
#    M - major version (one or more digits)
#    m - minor version (exactly 1 digit)
#  bbb - manually specified build number (exactly 3 digits)
#    t - build type (exactly 1 digit).  Current valid values are:
#           0 : eng build
#           1 : build server build
#    a - device architecture (exactly 1 digit).  Current valid values are:
#           0 : non-native
#           1 : armv5te
#           3 : armv7-a
#           5 : mips
#           7 : x86
#    d - asset density (exactly 1 digit).  Current valid values are:
#           0 : all densities
#           2 : mdpi
#           4 : hdpi
#           6 : xhdpi
# Mmbbb is specified manually.  tad is automatically set during the build.
#
# For the client jar, the version code is agnostic to the target architecture and density: Mmbbbt00
#
# NOTE: arch needs to be more significant than density because x86 devices support running ARM
# code in emulation mode, so all x86 versions must be higher than all ARM versions to ensure
# we deliver true x86 code to those devices.
#
# HISTORY:
# 2.0.001 - Factory ROM and 0-day OTA 4.4 (KK)
# 2.0.002 - 4.4 MR1 system image

# Specify the following manually.  Note that base_version_minor must be exactly 1 digit and
# base_version_build must be exactly 3 digits.
base_version_major := 2
base_version_minor := 0
base_version_build := 002

#####################################################
#####################################################
# Collect automatic version code parameters
ifneq "" "$(filter eng.%,$(BUILD_NUMBER))"
  # This is an eng build
  base_version_buildtype := 0
else
  # This is a build server build
  base_version_buildtype := 1
endif

ifeq "$(TARGET_ARCH)" "x86"
  base_version_arch := 7
else ifeq "$(TARGET_ARCH)" "mips"
  base_version_arch := 5
else ifeq "$(TARGET_ARCH)" "arm"
  ifeq ($(TARGET_ARCH_VARIANT),armv5te)
    base_version_arch := 1
  else
    base_version_arch := 3
  endif
else
  base_version_arch := 0
endif

ifeq "$(package_dpi)" "mdpi"
  base_version_density := 2
else ifeq "$(package_dpi)" "hdpi"
  base_version_density := 4
else ifeq "$(package_dpi)" "xhdpi"
  base_version_density := 6
else
  base_version_density := 0
endif

# Build the version code
version_code_package := $(base_version_major)$(base_version_minor)$(base_version_build)$(base_version_buildtype)$(base_version_arch)$(base_version_density)

# The version name scheme for the package apk is:
# - For eng build (t=0):     M.m.bbb eng.$(USER)-hh
# - For build server (t=1):  M.m.bbb (nnnnnn-hh)
#       where nnnnnn is the build number from the build server (no zero-padding)
# On eng builds, the BUILD_NUMBER has the user and timestamp inline
ifneq "" "$(filter eng.%,$(BUILD_NUMBER))"
  git_hash := $(shell git --git-dir $(LOCAL_PATH)/.git log -n 1 --pretty=format:%h)
  date_string := $(shell date +%m%d%y_%H%M%S)
  version_name_package := $(base_version_major).$(base_version_minor).$(base_version_build) (eng.$(USER).$(git_hash).$(date_string)-$(base_version_arch)$(base_version_density))
else
#  version_name_package := $(base_version_major).$(base_version_minor).$(base_version_build) ($(BUILD_NUMBER)-$(base_version_arch)$(base_version_density))
  version_name_package := $(base_version_major).$(base_version_minor).$(base_version_build)
endif

# Cleanup the locals
base_version_major :=
base_version_minor :=
base_version_build :=
base_version_buildtype :=
base_version_arch :=
base_version_density :=
git_hash :=
date_string :=

計算兩個時間戳之間的差值(字串表示)

/**
 * 提供計算兩個時間的差值
 */
public class TimeUtils {
    /*
    *計算time2減去time1的差值 差值只設置 幾天 幾個小時 或 幾分鐘
    * 根據差值返回多長之間前或多長時間後
    * */
    public static String getDistanceTime(long  time1,long time2 ) {
        long day = 0;
        long hour = 0;
        long min = 0;
        long sec = 0;
        long diff ;
        String flag;
        if(time1<time2) {
            diff = time2 - time1;
            flag="前";
        } else {
            diff = time1 - time2;
            flag="後";
        }
        day = diff / (24 * 60 * 60 * 1000);
        hour = (diff / (60 * 60 * 1000) - day * 24);
        min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
        sec = (diff/1000-day*24*60*60-hour*60*60-min*60);
        if(day!=0)return day+"天"+flag;
        if(hour!=0)return hour+"小時"+flag;
        if(min!=0)return min+"分鐘"+flag;
        return "剛剛";
    }
}
調用方法:
String timeDistance = TimeUtils.getDistanceTime(initTime , System.currentTimeMillis());

其中initTime 爲第一個時間點,也是通過System.currentTimeMillis()獲取並保存

/*System.currentTimeMillis():Returns the current time in milliseconds since January 1, 1970 00:00:00.0 UTC.*/

手動簽名apk  Signapk

1. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行

  2. 查看Android.mk文件,加入LOCAL_CERTIFICATE := 這一行,根據這行的內容,選擇相應的簽名。 
     platform----->platform.pk8和platform.x509.pem 
     shared  ----->shared.pk8和shared.x509.pem 
   3. 使用目標系統的platform密鑰來重新給apk文件簽名。這步比較麻煩, 
      首先找到密鑰文件,在我的Android源碼目錄中的位置 
      是"build\target\product\security",下面的platform.pk8和platform.x509.pem 
      兩個文件。 
      然後用Android提供的Signapk工具來簽名,signapk的源代碼是 
      在"build\tools\signapk"下, 
      用法爲"java -jar signapk.jar  platform.x509.pem platform.pk8 input.apk output.apk",
      文件名最好使用絕對路徑防止找不到,也可以修改源代碼直接使用。

高通ELNA GPS調試

代碼路徑:modem/proc/gps   外加導入相應的qcn文件

Index: api/gnss_api.h
===================================================================
--- api/gnss_api.h (revision XX)
+++ api/gnss_api.h (revision XX)
 #define N_MAX_GLO_FREQ (14)
-#define C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT             255
+#define C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT             116
 #define C_PMIC_NPA_MODE_ID_RF_MODE_DEFAULT          255
 #define C_NAVRF_NPA_RESOURCE_NAME_DEFAULT           "UNINITIALIZED"
 #define C_NAVRF_MAX_NPA_RESOURCE_NAME_LEN_DEFAULT   40
Index: gnss/mgp/me/gen8/src/cgps_ext.c
===================================================================
--- gnss/mgp/me/gen8/src/cgps_ext.c (revision XX)
+++ gnss/mgp/me/gen8/src/cgps_ext.c (revision XX)
@@ -471,7 +471,7 @@
 
 /* Customer needs to change this variable in order to override NAVRF driver ELNA setting */
 gnss_ExternalGNSSConfigStruct gnssz_ExtElnaCfg =
-{ GNSS_RF_DEFAULT_CFG, C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT, NULL, C_NAVRF_NPA_RESOURCE_NAME_DEFAULT, C_PMIC_NPA_MODE_ID_RF_MODE_DEFAULT}; 
+{ GNSS_RF_HAS_ELNA, C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT, NULL, C_NAVRF_NPA_RESOURCE_NAME_DEFAULT, C_PMIC_NPA_MODE_ID_RF_MODE_DEFAULT}; 

 如何修改代碼避免app被android LMK殺死

1、修改文件 : frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public final class ActivityManagerService extends ActivityManagerNative  

             app.persistent = true;  
             app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ;  
         }  
+       if("com.xxx.xxx".equals(info.packageName)){  
+           app.persistent = true;   // 判斷包名,修改這個屬性值即可
+           app.maxAdj = ProcessList.SYSTEM_ADJ;  
+       }  

2、通過在androidmanifest.xml中的application標籤中加入android:persistent="true" 並且要把app放入 system/app目錄下(需重啓機器)














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章