使用密钥库安卓。针对版本 18 及更高版本。必须使用已弃用的方法调用?

Posted

技术标签:

【中文标题】使用密钥库安卓。针对版本 18 及更高版本。必须使用已弃用的方法调用?【英文标题】:using keystore android. targeting version 18 and above. have to use deprecated method calls? 【发布时间】:2017-06-01 09:40:09 【问题描述】:

我正在开发一个应用程序,使用 android KeyStore API 调用来加密一些字符串值。我的目标是 API 级别 18 及更高级别。我的代码中有一个 if else 块,它针对 API 级别 18 到 23。我的问题是我要么必须在块中使用不推荐使用的方法调用(如下所示是我的 if 块)

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 &&
            Build.VERSION.SDK_INT < Build.VERSION_CODES.M) 

       KeyPairGenerator kpg = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");

       kpg.initialize(new KeyPairGeneratorSpec.Builder(alias, keyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
       .setDigests(KeyProperties.DIGEST_SHA256,KeyProperties.DIGEST_SHA512)
       .build());

       KeyPair kp = kpg.generateKeyPair();
     

由于不推荐使用方法调用,因此在 IDE 中会出现一条穿过它的线。但是,它确实针对构建此代码运行的 api 级别?

如果我切换到KeyGenParameterSpec.builder(),我会收到编译时错误,因为该对象只能在 API 级别 23 及更高级别上使用。我的应用针对 API 级别 18 及以上?

有没有一种方法可以在我的KeyStore 中生成密钥对条目,而无需使用已弃用的方法调用或不必移动到 API 级别 23 及更高级别?

提前致谢!

【问题讨论】:

【参考方案1】:

只需在新的 API 级别 23 代码中包含一个 else 块,这样您就可以双向进行!

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 &&
            Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
    // deprecated code on 23
else
    // new code for 23+

【讨论】:

是的,.build() 方法调用仍然是一条线,尽管它的目标是正确的 api 级别。这有点担心。 删除线表示此方法已弃用,将来可能会停止使用。这与您支持的 API 级别无关。但是,如果您想抑制 Lint 错误,您可能希望使用 @TargetApi 注释来指示此 API 设计运行的最低 SDK。没有什么可担心的,因为 Android 需要几年时间才能真正切断已弃用的 API。我希望这是您迁移到更新 API 的合理时间 只要在支持的 API 级别上运行就可以了,不要依赖 linting 进行错误检测。使用//noinspection deprecation 禁用对以下语句的检查。

以上是关于使用密钥库安卓。针对版本 18 及更高版本。必须使用已弃用的方法调用?的主要内容,如果未能解决你的问题,请参考以下文章

嗅探 Firefox 4 及更高版本的方法

如何使用支持库 25.0.0 及更高版本获取片段()

访问器仅在针对 ECMAScript 5 及更高版本时可用 - 使用 TypeScript 时出现错误消息

Google Play 服务库 9.0 及更高版本

我应该怎么做才能使这个菜单栏在 Internet Explorer 7 及更高版本中正常工作?

security-crypto:针对 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一