摘要: 廣播接收器: 廣播接收者(BroadcastReceiver)用于監(jiān)聽(tīng)系統(tǒng)事件或應(yīng)用程序事件,通過(guò)調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()可以向系統(tǒng)發(fā)送廣播意圖,通過(guò)廣播一個(gè)意圖(Intent)可以被多個(gè)廣播接收者所接收,從而可以在不用修改原始的應(yīng)用程序的情況下,讓你對(duì)事件作出反應(yīng)。 &n...
網(wǎng)上找到的,HTC One X,三星i9000 cm9 4.0.4測(cè)試通過(guò),在此記錄一下,大伙需要的話就拿去吧..
1. Android 2.3(不包括)以下,通過(guò)獲取aidl遠(yuǎn)程服務(wù)接口TelephoneyManager來(lái)調(diào)用它的answerRingingCall方法(ps: 關(guān)于此方法具體做法,由于時(shí)間關(guān)系,我這里就不詳細(xì)說(shuō)啦,大家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方法的話,就會(huì)拋沒(méi)有 android.permission.MODIFY_PHONE_STATE權(quán)限異常,其實(shí)你已經(jīng)配了這個(gè)權(quán)限的了,但是不好意思,你的App不是系統(tǒng) 軟件,沒(méi)有系統(tǒng)簽名,所以還是不能調(diào)用,除非,你root了你的手機(jī),把你的app裝到系統(tǒng)軟件里面去,所以這里使用另外一種方法實(shí)現(xiàn)自動(dòng)接聽(tīng)這個(gè)行為 了,詳細(xì)如下:
剛開(kāi)始我用這段代碼的,發(fā)現(xiàn)三星機(jī)型可以,但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");
后來(lái)又google到了這段代碼,經(jīng)過(guò)測(cè)試,完全好使..
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文件僅僅是一個(gè)簡(jiǎn)單的zip包,導(dǎo)致了APK文件很容易被反編譯。這不僅威脅到軟件開(kāi)發(fā)公司及程序開(kāi)發(fā)人員的知識(shí)產(chǎn)權(quán),而且成為了惡意程序滋生的溫床。
那么如何增加APK被破解的難度,保障APK程序的安全性呢?這段時(shí)間里,我總結(jié)了一些技術(shù)上可行的方法。它們包括如下幾篇文章。
《APK反破解之一:Android Java混淆(ProGuard)》 《APK反破解之二:Android APK 簽名比對(duì)》 《APK反破解之三:NDK編譯.so動(dòng)態(tài)庫(kù)》 《APK反破解之四:Android代碼動(dòng)態(tài)加載技術(shù)》 為了方便大家查找,特意在這里做個(gè)小結(jié),將連接整理在此,方便大家閱讀。之所以將這幾篇文章的整理稱為“小結(jié)”,是因?yàn)檫@遠(yuǎn)遠(yuǎn)算不上“總結(jié)”。希望大家多多交流,隨時(shí)留言發(fā)表自己的想法,多多補(bǔ)充、指正。謝謝了!
Android代表了移動(dòng)互聯(lián)網(wǎng)時(shí)代的興起,它將廣泛運(yùn)行在各種移動(dòng)終端之上。有機(jī)構(gòu)數(shù)據(jù)預(yù)測(cè),移動(dòng)互聯(lián)網(wǎng)時(shí)代的終端數(shù)量將是PC時(shí)代終端設(shè)備數(shù) 量的10倍以上。并且移動(dòng)終端本身的特點(diǎn)決定了它比PC更為私有化。因此它的安全性、隱私保護(hù)性將比PC時(shí)代的安全和隱私保護(hù)更為受到用戶、媒體和機(jī)構(gòu)的 關(guān)注。
Android這個(gè)可愛(ài)的小綠人從出生到現(xiàn)在,滿打滿算也只有三周歲而已。它的安全領(lǐng)域存在著太多的空白等著我們?nèi)ラ_(kāi)拓和填補(bǔ)。這既是挑戰(zhàn),也是 機(jī)遇。希望大家能借看雪論壇Android軟件安全板塊這個(gè)平臺(tái),多多交流,相互學(xué)習(xí),共同迎接移動(dòng)互聯(lián)網(wǎng)軟件安全的春天!
做Android應(yīng)用,不可避免的會(huì)與SQLite打交道。隨著應(yīng)用的不斷升級(jí),原有的數(shù)據(jù)庫(kù)結(jié)構(gòu)可能已經(jīng)不再適應(yīng)新的功能,這時(shí)候,就需要對(duì)SQLite數(shù)據(jù)庫(kù)的結(jié)構(gòu)進(jìn)行升級(jí)了。
SQLite提供了ALTER TABLE命令,允許用戶重命名或添加新的字段到已有表中,但是不能從表中刪除字段。
并且只能在表的末尾添加字段,比如,為 Subscription添加兩個(gè)字段:
1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;
2 ALTER TABLE Subscription ADD COLUMN Key BLOB;
另外,如果遇到復(fù)雜的修改操作,比如在修改的同時(shí),需要進(jìn)行數(shù)據(jù)的轉(zhuǎn)移,那么可以采取在一個(gè)事務(wù)中執(zhí)行如下語(yǔ)句來(lái)實(shí)現(xiàn)修改表的需求。
1. 將表名改為臨時(shí)表
ALTER TABLE Subscription RENAME TO __temp__Subscription;
2. 創(chuàng)建新表
CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);
3. 導(dǎo)入數(shù)據(jù)
INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__Subscription;
或者
INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM __temp__Subscription;
* 注意 雙引號(hào)”” 是用來(lái)補(bǔ)充原來(lái)不存在的數(shù)據(jù)的
4. 刪除臨時(shí)表
DROP TABLE __temp__Subscription;
通過(guò)以上四個(gè)步驟,就可以完成舊數(shù)據(jù)庫(kù)結(jié)構(gòu)向新數(shù)據(jù)庫(kù)結(jié)構(gòu)的遷移,并且其中還可以保證數(shù)據(jù)不會(huì)應(yīng)為升級(jí)而流失。
當(dāng)然,如果遇到減少字段的情況,也可以通過(guò)創(chuàng)建臨時(shí)表的方式來(lái)實(shí)現(xiàn)。