在Android应用程序中使用系统PIN对话框

时间:2012-04-11 13:25:21

标签: java android

背景

我正在尝试编写一个如下所述的应用程序。

  • 当用户启动应用程序时,检查用户是否在其设备上注册了PIN。
  • 如果用户已注册PIN,则应用程序必须显示“继续使用PIN”按钮。
  • 当用户按下“继续使用PIN”按钮时,必须出现系统标准PIN对话框。 enter image description here
  • 用户输入个人识别码并按“继续”按钮。
  • 系统必须检查输入的PIN是否正确并继续工作。

搜索

我进行了一些搜索,发现stackoverflow和其他互联网资源上的一些文章说“ There is no way to develop a new custom unlock mechanism on a non-rooted phone. ”或“{{3 }}”。

此外,我还观看了一些视频教程,例如I would be surprised if you could, because then you would be probably able to steal the pin code, and I don't think anyone would want that.Tutorial: Android Internals - Building a Custom ROM, Pt. 1 of 2

EDITED

我今天进行了一些搜索,发现了一个非常有趣的事情,我认为我正在寻找解决方案的正确途径,我希望与您分享我的想法。所以在android源代码中我找到了一个有趣的文件 ChooseLockPassword.java packages \ apps \ Settings \ src \ com \ android \ settings )和现在我感兴趣的是 LockPatternUtils.java (* frameworks \ base \ core \ java \ com \ android \ internal \ widget *):

问题

如何从我的代码中调用LockPatternUtils类函数?或者为什么我在Eclipse中看不到这个功能?


决策

所以我认为访问Android 系统PIN对话框 的唯一方法是root手机对系统文件进行一些更改并使用 系统PIN拨号


问题

  1. 有人可以提供有关在root电话中访问系统PIN对话框的有用链接。
  2. 我是否正确,我能以这种方式解决问题吗?
  3. 如果有人遇到这样的问题请帮我解决。
  4. 任何解决方案?

3 个答案:

答案 0 :(得分:7)

好的,我已经解决了这个问题,现在我想和你分享我的解决方案。

首先,因为我告诉我有安卓源,所以我在android源代码中进行了一些更改,以访问PIN和模式对话框。他们在这里:

〜\ AndroidSources \ pakages \ apps \ Settings \ AndroidManifest.xml 我更改了以下代码行

<activity android:name="ConfirmLockPattern"
          android:exported="true"> // This line was added by me.
</activity>

<activity android:name="ConfirmLockPassword"
          android:exported="true" // This line was added by me.
          android:them="@android:style/Them.NoTitleBar">
</activity>

<activity android:name="ChooseLockPattern"
          android:exported="true" // This line was added by me.
          android:label="@string/lockpattern_change_lock_pattern_label">
</activity>

此修改允许我调用“ ConfirmLockPattern ”,“ ConfirmLockPassword ”和“ < em> ChooseLockPattern “来自我自己的应用程序的活动。在我编译android源代码并在我的模拟器上启动system.img之后。

在我的应用程序中,我编写了以下函数,以便调用“ ConfirmLockPattern ”或“ ChooseLockPattern ”活动:

/**
 * Show PIN/Password confirmation dialog.
 */
void ShowConfirmLockPINActivity() {
    CustomLog.i(TAG, "Show Confirm Lock PIN Activity");
    Intent intent = new Intent(Intent.ACTION_RUN);
    intent.setComponent(new ComponentName("com.android.settings",
        "com.android.settings.ConfirmLockPassword"));
    startActivityForResult(intent, mRequestCode);
} /* ShowConfirmLockPINActivity() */

/**
 * Show set PIN/Password dialog.
 */
void ShowSetLockPINActivity() {
    CustomLog.i(TAG, "Show Set Lock PIN Activity");
    Intent intent = new Intent(Intent.ACTION_RUN);
    intent.setComponent(new ComponentName("com.android.settings",
        "com.android.settings.ChooseLockPassword"));
    startActivityForResult(intent, mRequestCode);
} /* ShowSetLockPINActivity() */

/**
 * Show Pattern Confirmation dialog.
 */
void ShowSetLockPatternActivity() {
    CustomLog.i(TAG, "Show Set Lock Pattern Activity");
    Intent intent = new Intent(Intent.ACTION_RUN);
    intent.setComponent(new ComponentName("com.android.settings",
        "com.android.settings.ConfirmLockPattern"));
    startActivityForResult(intent, mRequestCode);
} /* ShowSetLockPatternActivity() */

答案 1 :(得分:3)

以下是您的问题的一些注意事项。

  1. 在这种特殊情况下深入了解Android代码并不是一个好主意,因为验证PIN码是一个重要的安全点,其机制必须隐藏并受到良好保护以避免任何恶意。

    < / LI>
  2. 因此,您要执行的操作(请求PIN然后根据真实PIN码进行检查)是禁止的,并且看起来像是入侵。因此,您不应该尝试访问用户密码的存储。

  3. 尝试通过某些Intent启动标准PIN屏幕并要求它为您完成所有工作更为正确。但是,简短的调查没有给我这方面的任何结果;或许,你会找到一些东西。

  4. 修改ROM​​显然是死路一条 - 没有人会闪存手机来安装一个应用程序。要求root手机好一点,有些应用程序无法在非root手机上运行,​​但它仍会将我们转发到第2点(入侵)。

  5. 用户可以停用PIN检查和there are devices with no SIM

  6. 所以,根据提到的所有内容,我建议你为自己的应用考虑不同的验证方法。

答案 2 :(得分:1)

从API级别21开始,KeyguardManager.createConfirmDeviceCredentialIntent可用于使用设备锁定销来验证当前用户。

请参见usage example