【问题标题】:ActivityNotFoundException for intent android.settings.NFC_PAYMENT_SETTINGSIntent android.settings.NFC_PAYMENT_SETTINGS 的 ActivityNotFoundException
【发布时间】:2017-05-24 09:38:26
【问题描述】:

我正在尝试使用这段代码打开 NFC Tap & Pay 页面上的设置:

startActivity(new Intent(Settings.ACTION_NFC_PAYMENT_SETTINGS));

在装有 Android 7.1.2 的 LG Nexus 5X 上进行测试时,我收到了这个崩溃:

android.content.ActivityNotFoundException:
 No Activity found to handle Intent { act=android.settings.NFC_PAYMENT_SETTINGS }
  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809)
  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
  at android.app.Activity.startActivityForResult(Activity.java:4228)
  at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(SourceFile:50)
  at android.support.v4.app.FragmentActivity.startActivityForResult(SourceFile:79)
  at android.app.Activity.startActivityForResult(Activity.java:4186)
  at android.support.v4.app.FragmentActivity.startActivityForResult(SourceFile:859)
  at android.app.Activity.startActivity(Activity.java:4525)
  at android.app.Activity.startActivity(Activity.java:4493)
  at ...

好吧,这个崩溃可以用 try-catch 轻松处理,但奇怪的是,当我手动打开这个 NFC 设置时,代码就像一个魅力 - 没有崩溃。为什么?有人对这种行为有解释吗?

在文档[1]中是这样写的:

在某些情况下,匹配的 Activity 可能不存在,因此请确保您 防止这种情况发生。

他们的意思是“你必须手动打开设置,然后它就可以正常工作”这样的句子吗?

[1]https://developer.android.com/reference/android/provider/Settings.html#ACTION_NFC_PAYMENT_SETTINGS

【问题讨论】:

    标签: android nfc


    【解决方案1】:

    发件人:https://developer.android.com/reference/android/provider/Settings.html#ACTION_NFC_PAYMENT_SETTINGS

    ACTION_NFC_PAYMENT_SETTINGS

    在 API 级别 19 中添加

    字符串 ACTION_NFC_PAYMENT_SETTINGS

    活动动作: 显示 NFC 触碰付款设置

    这显示了允许用户配置 Tap&Pay 设置的 UI。

    在某些情况下,匹配的 Activity 可能不存在,因此请确保防范这种情况。

    输入:无

    输出:无

    常量值:“android.settings.NFC_PAYMENT_SETTINGS”

    您的设备不支持或至少无法处理 ACTION_NFC_PAYMENT_SETTINGS。

    更新 1

    由于您的 minAPILevel 为 19,因此 Android RT 应该支持该操作。但是,操作和 NFC 设置菜单之间的链接,尽管菜单存在,但可能没有或无法建立。

    尝试使用Settings.ACTION_NFC_SETTINGS 作为动作,看看它是否开始。 如果是这样,我预计会出现实施问题。

    为了防止异常,我建议使用:

    PackageManager packageManager = getActivity().getPackageManager();
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(<your intent>);
    } else {
        Log.d(TAG, "No application available to handle requested action.");
    }
    

    请参阅:How to check if an intent can be handled from some activity? 以获得信用和参考。

    【讨论】:

    • 不支持是不正确的。也许现在无法处理,但我在问为什么?当我手动打开设置时,它可以工作。虽然它是向用户显示一条消息“转到设置,找到诸如触碰付款或移动支付之类的东西,或者您的设备供应商创建的任何东西”。
    • 您使用哪个 MinSDKVersion 和 TargetSDKVersion?您能否提供一个“围绕调用”的实际代码示例,即您调用 startActivity 的位置?
    • minSDK = 19, targetSDK = 25。代码在 onClickListener 内部(使用 Butterknife)。就这行代码,没有别的了。
    • @JerabekJakub 查看更新。我也会尝试重建问题,因为我有相同的 Android 版本。 :D
    • 我无法再重现该问题,因为我已经手动操作了。不行,所以我无法检查您的建议。 :-(
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多