24

背景

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

  • 当用户启动应用程序时,它会检查用户是否在其设备上注册了 PIN。
  • 如果用户已注册 PIN,应用程序必须显示“使用 PIN 继续”按钮。
  • 当用户按下“继续使用 PIN”按钮时,系统标准 PIN 对话框必须出现。 在此处输入图像描述
  • 用户输入他的 PIN 并按“继续”按钮。
  • 系统必须检查输入的 PIN 是否正确并继续工作。

搜索

我进行了一些搜索,发现一些关于stackoverflow和其他互联网资源的文章说“没有办法在非 root 手机上开发新的自定义解锁机制。 ”或“如果你能,我会感到惊讶,因为那样你很可能能够窃取 PIN 码,我认为没有人会想要这样。 ”。

我还观看了一些视频教程,例如教程:Android 内部 - 构建自定义 ROM,Pt。1 of 2教程:Android 内部 - 构建自定义 ROM,Pt。2 的 2

已编辑

我今天进行了一些搜索,发现了一个非常有趣的事情,我认为我在解决问题的路上是正确的,我想与你分享我的想法。所以在 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 dialod


问题

  1. 有人可以为我提供有关在有根电话中访问系统 PIN 对话框的有用链接吗?
  2. 我走对路了吗?我可以用这种方式解决我的问题吗?
  3. 如果有人遇到这样的问题,请帮我解决。

任何解决方案?

4

3 回答 3

7

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

起初,正如我所说的,我有 android 资源,所以我对 android 资源进行了一些更改,以访问 PIN 和 Pattern 对话框。他们在这里:

~\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 ”和“ 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() */
于 2012-04-27T12:30:07.200 回答
3

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

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

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

  3. 尝试通过一些启动标准 PIN 屏幕Intent并要求它为您完成所有工作会更正确。然而,一个简短的调查并没有给我这个方向的任何结果。也许,你会发现一些东西。

  4. 修改ROM​​显然是死路一条——没有人会刷手机安装一个应用程序。需要 root 手机会更好一些,有些应用程序无法在非 root 手机上运行,​​但它仍然让我们回到第 2 点(入侵)。

  5. 用户可以禁用 PIN 检查,并且有些设备没有 SIM 卡

因此,根据所有提到的,我建议您为您的应用考虑不同的验证方法。

于 2012-04-26T07:49:56.267 回答
2

由于 API 级别 21 KeyguardManager.createConfirmDeviceCredentialIntent,因此可以使用设备锁定销对当前用户进行身份验证。

请参阅使用示例

于 2018-09-19T12:03:44.230 回答