摘要: 廣播接收器: 廣播接收者(BroadcastReceiver)用于監聽系統事件或應用程序事件,通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()可以向系統發送廣播意圖,通過廣播一個意圖(Intent)可以被多個廣播接收者所接收,從而可以在不用修改原始的應用程序的情況下,讓你對事件作出反應。 &n...
網上找到的,HTC One X,三星i9000 cm9 4.0.4測試通過,在此記錄一下,大伙需要的話就拿去吧..
1. Android 2.3(不包括)以下,通過獲取aidl遠程服務接口TelephoneyManager來調用它的answerRingingCall方法(ps: 關于此方法具體做法,由于時間關系,我這里就不詳細說啦,大家Google一下吧)
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService;
telephonyService = (ITelephony) m.invoke(tm);
// Silence the ringer and answer the call!
telephonyService.silenceRinger();
telephonyService.answerRingingCall();
2. Android 2.3(包括)以上,如果照樣使用TelephoneyManager獲取到的answerRingingCall方法的話,就會拋沒有 android.permission.MODIFY_PHONE_STATE權限異常,其實你已經配了這個權限的了,但是不好意思,你的App不是系統 軟件,沒有系統簽名,所以還是不能調用,除非,你root了你的手機,把你的app裝到系統軟件里面去,所以這里使用另外一種方法實現自動接聽這個行為 了,詳細如下:
剛開始我用這段代碼的,發現三星機型可以,但HTC(如: G10 , One X)不行,
Intent intent = new Intent("android.intent.action.MEDIA_BUTTON");
KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK);
intent.putExtra("android.intent.extra.KEY_EVENT",keyEvent);
sendOrderedBroadcast(intent,"android.permission.CALL_PRIVILEGED");
intent = new Intent("android.intent.action.MEDIA_BUTTON");
keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);
intent.putExtra("android.intent.extra.KEY_EVENT",keyEvent);
sendOrderedBroadcast(intent,"android.permission.CALL_PRIVILEGED");
后來又google到了這段代碼,經過測試,完全好使..
Intent localIntent1 = new Intent(Intent.ACTION_HEADSET_PLUG);
localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
localIntent1.putExtra("state", 1);
localIntent1.putExtra("microphone", 1);
localIntent1.putExtra("name", "Headset");
CallingActivity.this.sendOrderedBroadcast(localIntent1,"android.permission.CALL_PRIVILEGED");
Intent localIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON);
KeyEvent localKeyEvent1 = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HEADSETHOOK);
localIntent2.putExtra("android.intent.extra.KEY_EVENT",localKeyEvent1);
CallingActivity.this.sendOrderedBroadcast(localIntent2,"android.permission.CALL_PRIVILEGED");
Intent localIntent3 = new Intent(Intent.ACTION_MEDIA_BUTTON);
KeyEvent localKeyEvent2 = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);
localIntent3.putExtra("android.intent.extra.KEY_EVENT",localKeyEvent2);
CallingActivity.this.sendOrderedBroadcast(localIntent3,"android.permission.CALL_PRIVILEGED");
Intent localIntent4 = new Intent(Intent.ACTION_HEADSET_PLUG);
localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
localIntent4.putExtra("state", 0);
localIntent4.putExtra("microphone", 1);
localIntent4.putExtra("name", "Headset");
CallingActivity.this.sendOrderedBroadcast(localIntent4,"android.permission.CALL_PRIVILEGED");
由于Android安裝包APK文件僅僅是一個簡單的zip包,導致了APK文件很容易被反編譯。這不僅威脅到軟件開發公司及程序開發人員的知識產權,而且成為了惡意程序滋生的溫床。
那么如何增加APK被破解的難度,保障APK程序的安全性呢?這段時間里,我總結了一些技術上可行的方法。它們包括如下幾篇文章。
《APK反破解之一:Android Java混淆(ProGuard)》 《APK反破解之二:Android APK 簽名比對》 《APK反破解之三:NDK編譯.so動態庫》 《APK反破解之四:Android代碼動態加載技術》 為了方便大家查找,特意在這里做個小結,將連接整理在此,方便大家閱讀。之所以將這幾篇文章的整理稱為“小結”,是因為這遠遠算不上“總結”。希望大家多多交流,隨時留言發表自己的想法,多多補充、指正。謝謝了!
Android代表了移動互聯網時代的興起,它將廣泛運行在各種移動終端之上。有機構數據預測,移動互聯網時代的終端數量將是PC時代終端設備數 量的10倍以上。并且移動終端本身的特點決定了它比PC更為私有化。因此它的安全性、隱私保護性將比PC時代的安全和隱私保護更為受到用戶、媒體和機構的 關注。
Android這個可愛的小綠人從出生到現在,滿打滿算也只有三周歲而已。它的安全領域存在著太多的空白等著我們去開拓和填補。這既是挑戰,也是 機遇。希望大家能借看雪論壇Android軟件安全板塊這個平臺,多多交流,相互學習,共同迎接移動互聯網軟件安全的春天!
做Android應用,不可避免的會與SQLite打交道。隨著應用的不斷升級,原有的數據庫結構可能已經不再適應新的功能,這時候,就需要對SQLite數據庫的結構進行升級了。
SQLite提供了ALTER TABLE命令,允許用戶重命名或添加新的字段到已有表中,但是不能從表中刪除字段。
并且只能在表的末尾添加字段,比如,為 Subscription添加兩個字段:
1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;
2 ALTER TABLE Subscription ADD COLUMN Key BLOB;
另外,如果遇到復雜的修改操作,比如在修改的同時,需要進行數據的轉移,那么可以采取在一個事務中執行如下語句來實現修改表的需求。
1. 將表名改為臨時表
ALTER TABLE Subscription RENAME TO __temp__Subscription;
2. 創建新表
CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);
3. 導入數據
INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__Subscription;
或者
INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM __temp__Subscription;
* 注意 雙引號”” 是用來補充原來不存在的數據的
4. 刪除臨時表
DROP TABLE __temp__Subscription;
通過以上四個步驟,就可以完成舊數據庫結構向新數據庫結構的遷移,并且其中還可以保證數據不會應為升級而流失。
當然,如果遇到減少字段的情況,也可以通過創建臨時表的方式來實現。