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

Java 在Android应用程序中使用系统PIN对话框 背景,java,android,Java,Android,我正在尝试编写一个应用程序,其工作原理如下所述 当用户启动应用程序时,它会检查用户是否在其设备上注册了PIN 若用户已注册PIN,应用程序必须显示“继续PIN”按钮 当用户按下按钮“继续PIN”时,必须显示系统标准PIN对话框。 用户输入PIN并按下“继续”按钮 之后,系统必须检查输入的PIN是否正确,然后继续工作 搜查 我做了一些搜索,在网上和其他网络资源上找到了一些文章,上面写着“”或“” 我还观看了一些视频教程,如和 已编辑 今天我做了一些搜索,发现了一件非常有趣的事情,我认为我找

我正在尝试编写一个应用程序,其工作原理如下所述

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

搜查 我做了一些搜索,在网上和其他网络资源上找到了一些文章,上面写着“”或“”

我还观看了一些视频教程,如和

已编辑

今天我做了一些搜索,发现了一件非常有趣的事情,我认为我找到了解决问题的正确方法,我想与大家分享我的想法。因此,在android源代码中,我发现了一个有趣的文件ChooseLockPassword.java(packages\apps\Settings\src\com\android\Settings)和LockPatternUtils.java(*frameworks\base\core\java\com\android\internal\widget*),现在我感兴趣的是:

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


决断 因此,我认为访问安卓系统PIN对话框的唯一方法是在系统文件中进行一些更改,然后使用系统PIN拨号


问题:
  • 有人能给我提供一些有用的链接,让我可以访问根手机中的系统PIN对话框
  • 我的方法正确吗?我能用这种方法解决我的问题吗
  • 如果有人遇到这样的问题,请帮我解决

  • 有什么解决办法吗?

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

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

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

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

  • 修改ROM显然是死路一条——没有人会为了安装一个应用程序而刷新手机。要求有根的手机要好一点,有些应用程序无法在无根的手机上运行,但它仍然将我们带回第二点(入侵)

  • 用户可以禁用PIN检查和


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

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

    起初,正如我所说,我有android源代码,所以我对android源代码进行了一些更改,以访问PIN和模式对话框。这是:

    ~\AndroidSources\packages\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>
    

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


    请参阅。

    这看起来是一个很好的尝试,但是为什么不编辑您之前的问题,这是关于同一件事的?你在这之前问了不到一天的问题?然后神奇地,我的几个高分答案被否决了。随机。你错了@Nanne@我为你删除了以前的帖子!你们不需要为我做任何特别的事情,也许那个里发生的评论太糟糕了,但我想这是你们的选择。我无法撤销投票结果,但它不会像我怀疑的那样吸引新的投票结果。它解决了你的问题#2和“任何想法”——问题,不是吗?@a.ch。我不同意你的第一点。一个最佳的安全实践是假设你的对手完全可以访问你的算法(源代码),唯一的秘密是你的密钥材料(密码)。然而,我想暗示的是,这个方向是死胡同。@a.ch。我找到了解决办法,你可以看到:)很好。在分发应用程序时,您将如何应用此功能?这一切都很好。然而,你真的需要制作一个定制的ROM吗?这是供其他用户使用的应用程序,还是仅供您使用?因为我认为没有人会仅仅为了使用你的应用程序而更改ROM。@Matsemann这是一个演示应用程序。我使用它只是为了演示一些功能。我在我的系统上找不到~\AndroidSources\pakages\apps\Settings\AndroidManifest.xml?@Pehlaj抱歉,我6年前就这么做了,我想很多东西都在以下情况下被更改了:)文件不在系统中,而是在Android源代码中,您需要让andoid源代码在那里和重建android源代码之后对其进行更改。
    /**
     * 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() */