【问题标题】:Use system PIN dialog in Android application在 Android 应用程序中使用系统 PIN 对话框
【发布时间】:2012-04-11 13:25:21
【问题描述】:

背景

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

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

搜索

我进行了一些搜索,并在 stackoverflow 和其他互联网资源上找到了一些文章,上面写着“There is no way to develop a new custom unlock mechanism on a non-rooted phone.”或“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.”。 p>

我也看过一些视频教程,比如Tutorial: Android Internals - Building a Custom ROM, Pt. 1 of 2Tutorial: Android Internals - Building a Custom ROM, Pt. 2 of 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 拨号


问题

  1. 谁能给我提供有用的链接,让我可以访问 root 手机中的系统 PIN 对话框。
  2. 我的方法是否正确,我可以通过这种方式解决我的问题吗?
  3. 如果有人遇到此类问题,请帮我解决。

有什么解决办法吗?

【问题讨论】:

  • 这看起来像是付出了很大的努力,但你为什么不直接编辑你之前的问题呢? stackoverflow.com/questions/10086659/use-system-pin-in-android 你问的比这个前一天还少?
  • 然后神奇地我的几个高分接受的答案被否决了。随机。
  • 你错了@Nanne !!!
  • @Nanne 我为你删除了之前的帖子!
  • 你不需要特别为我做任何事情,也许那里的cmets太糟糕了,但我想这是你的选择。我无法撤消接近投票,但它不会像我怀疑的那样吸引新的接近投票。

标签: java android


【解决方案1】:

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

起初我告诉过我有 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() */

【讨论】:

  • 这一切都很好。但是,您实际上需要制作自定义 ROM 吗?这是供其他用户使用的应用程序,还是仅供您使用?因为我认为没有人会为了使用您的应用而更改 ROM。
  • @Matsemann 这是演示应用程序。我只是用它来演示一些功能。
  • 我无法在我的系统上找到 ~\AndroidSources\pakages\apps\Settings\AndroidManifest.xml?
  • @Pehlaj 对不起,我是 6 年前做的,我想很多东西都在之后改变了 :) 文件不在系统中,而是在 Android 源代码中,你需要有 Android 源代码代码在那里和重建android源代码后更改它。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 它解决了您的问题 #2 和“任何想法”问题,不是吗?
  • @a.ch.我不得不不同意你的第一点。安全的最佳实践是假设您的对手可以完全访问您的算法(源代码),并且唯一的秘密是您的密钥材料(密码)
  • 嗯,你可能是对的。但是,我想暗示这个方向是死胡同。
  • @a.ch.我找到了解决方案,你可以看到它:)
  • 好。在分发您的应用程序时,您将如何应用它?
【解决方案3】:

从 API 级别 21 开始,KeyguardManager.createConfirmDeviceCredentialIntent 可用于使用设备锁定密码对当前用户进行身份验证。

请参阅usage example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多