如何检测SIM卡是否需要PIN码解锁?

3
在安卓系统的“设置/位置和安全设置”页面中,有一个名为“SIM卡锁定”的选项。
如果开启了此选项,则需要在启动后输入PIN码。
是否存在编程方法来检测是否需要PIN码?(不是当前SIM状态,而是设置选项值,例如:true/false)

1
只是出于好奇,你的应用程序为什么需要知道那个? - Franci Penov
由于企业的某些审计流程限制,应用程序需要此信息以了解是否存在任何政策违规行为。 - puppy
2个回答

1
您可以使用以下类: TelephonyManager http://developer.android.com/reference/android/telephony/TelephonyManager.html 您不需要直接实例化此类;相反,您可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)检索到一个实例的引用。
TelephonyManager manager = (TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE);
int state = manager.getSimState();
if(state == TelephonyManager.SIM_STATE_PIN_REQUIRED || state == TelephonyManager.SIM_STATE_PUK_REQUIRED)
{
         //PIN/PUK is required
}

根据评论,这是最终版本:

TelephonyManager tm = 
(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
       Class clazz = Class.forName(tm.getClass().getName());
       Method m = clazz.getDeclaredMethod("getITelephony");
       m.setAccessible(true);
       ITelephony it = (ITelephony) m.invoke(tm);
       if(it.isSimPinEnabled())
       {
                //This should work;
       }

谢谢您的回答,但我已经尝试过这种方法了。如果手机已解锁,manager.getSimState()始终返回5(SIM_STATE_READY)。它指的是当前状态,而不是设置选项值。 - puppy
是的,如果您的代码是在启动时运行的服务,则在手机启动时未输入代码时,您将获得这些状态...如果您已经输入了代码并在该事件之后声明了程序,则会获得SIM_STATE_READY。 - Varun Chatterji
是的,如果没有更好的解决方案,这将是一个备选答案,谢谢~ - puppy
看这个链接: http://netmite.com/android/mydroid/frameworks/base/telephony/java/com/android/internal/telephony/SimCard.java/** * 检查是否启用了 SIM 卡 PIN 锁 * 这是一个同步调用,返回缓存的 PIN 启用状态 * * @return true 表示启用了 SIM 卡锁 * false 表示禁用了 SIM 卡锁 */ boolean getSimLockEnabled(); - Varun Chatterji
如果您想访问内部API,则以下链接提供了一些使用反射进行访问的想法: https://dev59.com/iHI-5IYBdhLWcg3wI0t9 - Varun Chatterji
1
我尝试添加ITelephony.aidl来使用这个方法,但是即使我打开了PIN选项,it.isSimPinEnabled()始终返回false。为了测试项目是否配置正确, 我注意到如果我改变手机状态(切换到飞行模式),it.isDataConnectivityPossible()确实会返回正确的值。 有什么想法吗?谢谢~(在htc hero 2.1 update1下测试) - puppy

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接