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

2022-09-01 21:24:39

背景

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

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

搜索

我做了一些搜索,并找到了一些关于stackoverflow和其他互联网来源的文章,这些文章说“没有办法在无根手机上开发新的自定义解锁机制”或“如果可以的话,我会感到惊讶,因为那样你可能会窃取PIN码,我认为没有人会想要这样

我也看过一些视频教程,如教程:Android内部 - 构建自定义ROM,Pt. 1 of 2教程:Android Internals - Building a Custom ROM,Pt. 2 of 2

编辑

我今天做了一些搜索,发现了一件非常有趣的事情,我认为我正走在解决问题的正确道路上,我想与你分享我的想法。因此,在Android源代码中,我发现了一个有趣的文件SelectLockPassword.javapackages\apps\Settings\src\com\android\settings)和LockPatternUtils.java(*frameworks\base\core\java\com\android\internal\widget*)现在我对以下内容感兴趣:

问题

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


决定

因此,我认为访问Android系统PIN对话框的唯一方法是根手机在系统文件中进行一些更改并使用系统PIN拨号


问题

  1. 有人可以为我提供有关在root手机中访问系统PIN对话框的有用链接吗?
  2. 我是否走在正确的道路上,我可以以这种方式解决我的问题吗?
  3. 如果有人遇到这样的问题,请帮我解决。

任何解决方案?


答案 1

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

起初,我告诉我有Android源代码,所以我在Android源代码中进行了一些更改,以访问PIN和Patline对话框。它们在这里:

~\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() */

答案 2

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

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

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

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

  4. 修改ROM显然是死胡同 - 没有人会刷新手机来安装一个应用程序。要求有根手机更好一些,有些应用程序无法在无根手机上运行,但它仍然将我们转发回第2点(入侵)。

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

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


推荐