續上篇: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;
}
附: 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[]數據
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
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
判斷閏年
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
靜態壁紙,調整壁紙顯示位置
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改爲標準的才行修改已經提交了的log (git commit -m"log")
2、更早這樣修改:假設要修改commit 65ae4f,執行
git rebase 65ae4f^ --interactive
在編輯器中把第一行的pick改爲edit,保存,退出,然後按提示操作。
一般是第一種情況比較多,如果不是前一個提交也可以使用git reset commitID 把那個commit放到前一個提交,不過後面的提交要重新git add -> git commit 提交
ubuntu Terminal終端配色方案
文字顏色:#708284背景顏色:#07242E
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通配符字符的搜索
Linux 延時執行命令
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.
Thu Jun 11 17:35:13 CST 2015
Unable to add window android.view.ViewRootImpl
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
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)
緊急撥號列表
TextView屬性大全
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.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 種類。
設置這個種類來讓組件成爲 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
默認搜索引擎的修改:
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&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}&ie={inputEncoding
- <item>yahoo--Yahoo!--yahoo.com--search_engine_yahoo--https://search.yahoo.com/search?ei={inputEncoding}&.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&ie=utf8&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}&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&word={searchTerms}&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}&language={language}</item>
</string-array>
</resources>
動態獲取文本在窗口中佔用的長度
MTK平臺送CTA注意事項
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焦點問題
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;
}
}
}
方法二:如何根據 dmesg打出的avc denied log確認是缺少哪個權限?
#============= shell ==============
allow shell default_prop:property_service set; 即爲在.te文件中需要添加的權限
[ 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目錄下(需重啓機器)