分享

Android5.0使用反射设置首选网络类型、SIM锁定解锁、PIN码设置

 quasiceo 2016-07-15
标签: PhoneandroidPIN
2016-06-16 12:11 36人阅读 评论(0) 收藏 举报
分类:

我们可以在Setting中找到有关Phone和SIM相关设置。

在MobileNetworkSettings类里面,系统使用了Phone这个类的void setPreferredNetworkType(int networkType, Message response);方法来改变首选网络类型。

  1. mPhone.setPreferredNetworkType(modemNetworkMode, mHandler  
  2.         .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));  
所以我们使用发射方式获取到Phone这个类的对象,然后获取到setPreferredNetworkType方法:
  1. Object mPhone;  
  2. static Object loadPhoneObject() {  
  3.         try {  
  4.             Class<?> forName = Class.forName("com.android.internal.telephony.PhoneFactory");  
  5.             Method getDefaultPhone = forName.getMethod("getDefaultPhone"new Class[] {});  
  6.             return getDefaultPhone.invoke(nullnew Object[] {});  
  7.         }  
  8.         catch (Exception e) {  
  9.             Log.e(TAG, "Error!", e);  
  10.         }  
  11.         return null;  
  12.     }  
  13.   
  14. mPhone = loadPhoneObject();  
  15. Method setPreferredNetworkType = mPhone.getClass().getMethod("setPreferredNetworkType"new Class[] { int.class, Message.class });  

记住要在Manifest中将使用该方法的Activity或者Server注册到com.android.phone中,不然无法获取到Phone对象,因为
  1. "com.android.internal.telephony.PhoneFactory"  
这个类只有在Phone进程下才可以获取,还要加上权限:
  1. <uses-permission android:name="android.permisssion.MODIFY_PHONE_STATE"/>  
在IccLockSettings类中,系统使用了tryChangeIccLockState方法:
  1. private void tryChangeIccLockState() {  
  2.         // Try to change icc lock. If it succeeds, toggle the lock state and  
  3.         // reset dialog state. Else inject error message and show dialog again.  
  4.         Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE);  
  5.         mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);  
  6.         // Disable the setting till the response is received.  
  7.         mPinToggle.setEnabled(false);  
  8.     }  

其中的
  1. mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);  
使用了IccCard这个接口的setIccLockEnabled方法来设置SIM是否锁定,用上面获取的Phone对象使用反射方式获取到IccCard类:
  1. Object loadIccCardObject(){  
  2.         try{  
  3.             Method getIccCard = mPhone.getClass().getMethod("getIccCard" ,new Class[] {});  
  4.             return getIccCard.invoke(mPhone,new Object[] {});  
  5.         }catch (Exception e){  
  6.             Log.e(TAG, "Error!", e);  
  7.         }  
  8.         return null;  
  9.     }  

然后再获取到setIccLockEnabled方法:
  1. <pre name="code" class="java">Object mIccCard = loadIccCardObject();  
  1. Method setIccLockEnabled = mIccCard.getClass().getMethod("setIccLockEnabled",new Class[] { boolean.class, String.class, Message.class });  

这样就能使用setIccLockEnabled来设置SIM是否锁定了:
  1. public void setIccLockEnabled(boolean isLock,String password){  
  2.         try {  
  3.             setIccLockEnabled.invoke(mIccCard,new Object[] {isLock, password,setHandler.obtainMessage(MESSAGE_CHANGE_LOCK_SIM) });  
  4.         }catch (Exception e){  
  5.             Log.e(TAG, "Error!", e);  
  6.         }  
  7.     }  

PIN的设置同理:
  1. Method changeIccLockPassword = mIccCard.getClass().getMethod("changeIccLockPassword",new Class[] { String.class, String.class, Message.class });  

  1. public void changeIccLockPassword(String oldPassWord,String newPassword){  
  2.         try {  
  3.             changeIccLockPassword.invoke(mIccCard,new Object[] {oldPassWord, newPassword,setHandler.obtainMessage(MESSAGE_CHANGE_PASSWORD_PIN) });  
  4.         }catch (Exception e){  
  5.             Log.e(TAG, "Error!", e);  
  6.         }  
  7.     }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多