2016-06-16 12:11
36人阅读
评论(0)
收藏
举报
分类:
我们可以在Setting中找到有关Phone和SIM相关设置。
在MobileNetworkSettings类里面,系统使用了Phone这个类的void setPreferredNetworkType(int networkType, Message response);方法来改变首选网络类型。
- mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
- .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
所以我们使用发射方式获取到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进程下才可以获取,还要加上权限:
- <uses-permission android:name="android.permisssion.MODIFY_PHONE_STATE"/>
在IccLockSettings类中,系统使用了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方法来设置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来设置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的设置同理:
- 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);
- }
- }
|