我們可以在Setting中找到有關(guān)Phone和SIM相關(guān)設(shè)置。
在MobileNetworkSettings類里面,系統(tǒng)使用了Phone這個類的void setPreferredNetworkType(int networkType, Message response);方法來改變首選網(wǎng)絡(luò)類型。
- mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
- .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
所以我們使用發(fā)射方式獲取到Phone這個類的對象,然后獲取到setPreferredNetworkType方法:
- Object mPhone;
- static Object loadPhoneObject() {
- try {
- Class<?> forName = Class.forName("com.android.internal.telephony.PhoneFactory");
- Method getDefaultPhone = forName.getMethod("getDefaultPhone", new Class[] {});
- return getDefaultPhone.invoke(null, new Object[] {});
- }
- catch (Exception e) {
- Log.e(TAG, "Error!", e);
- }
- return null;
- }
-
- mPhone = loadPhoneObject();
- Method setPreferredNetworkType = mPhone.getClass().getMethod("setPreferredNetworkType", new Class[] { int.class, Message.class });
記住要在Manifest中將使用該方法的Activity或者Server注冊到com.android.phone中,不然無法獲取到Phone對象,因為
- "com.android.internal.telephony.PhoneFactory"
這個類只有在Phone進程下才可以獲取,還要加上權(quán)限:
- <uses-permission android:name="android.permisssion.MODIFY_PHONE_STATE"/>
在IccLockSettings類中,系統(tǒng)使用了tryChangeIccLockState方法:
- private void tryChangeIccLockState() {
- // Try to change icc lock. If it succeeds, toggle the lock state and
- // reset dialog state. Else inject error message and show dialog again.
- Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE);
- mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);
- // Disable the setting till the response is received.
- mPinToggle.setEnabled(false);
- }
其中的
- mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);
使用了IccCard這個接口的setIccLockEnabled方法來設(shè)置SIM是否鎖定,用上面獲取的Phone對象使用反射方式獲取到IccCard類:
- Object loadIccCardObject(){
- try{
- Method getIccCard = mPhone.getClass().getMethod("getIccCard" ,new Class[] {});
- return getIccCard.invoke(mPhone,new Object[] {});
- }catch (Exception e){
- Log.e(TAG, "Error!", e);
- }
- return null;
- }
然后再獲取到setIccLockEnabled方法:
- <pre name="code" class="java">Object mIccCard = loadIccCardObject();
- Method setIccLockEnabled = mIccCard.getClass().getMethod("setIccLockEnabled",new Class[] { boolean.class, String.class, Message.class });
這樣就能使用setIccLockEnabled來設(shè)置SIM是否鎖定了:
- public void setIccLockEnabled(boolean isLock,String password){
- try {
- setIccLockEnabled.invoke(mIccCard,new Object[] {isLock, password,setHandler.obtainMessage(MESSAGE_CHANGE_LOCK_SIM) });
- }catch (Exception e){
- Log.e(TAG, "Error!", e);
- }
- }
PIN的設(shè)置同理:
- Method changeIccLockPassword = mIccCard.getClass().getMethod("changeIccLockPassword",new Class[] { String.class, String.class, Message.class });
- public void changeIccLockPassword(String oldPassWord,String newPassword){
- try {
- changeIccLockPassword.invoke(mIccCard,new Object[] {oldPassWord, newPassword,setHandler.obtainMessage(MESSAGE_CHANGE_PASSWORD_PIN) });
- }catch (Exception e){
- Log.e(TAG, "Error!", e);
- }
- }