使用密钥库安卓。针对版本 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 及更高版本。必须使用已弃用的方法调用?的主要内容,如果未能解决你的问题,请参考以下文章
访问器仅在针对 ECMAScript 5 及更高版本时可用 - 使用 TypeScript 时出现错误消息
我应该怎么做才能使这个菜单栏在 Internet Explorer 7 及更高版本中正常工作?
security-crypto:针对 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一