【问题标题】:.NET MAUI: How to ensure that Android platform specific code is only executed on supported Android versions?.NET MAUI:如何确保仅在支持的 Android 版本上执行 Android 平台特定代码?
【发布时间】:2022-10-24 14:26:13
【问题描述】:

我有 partial class DeviceServices 的各种实现,为 Android、iOS 等提供某些设备或操作系统特定功能的平台特定实现。我的应用程序的目标是 API 级别 33.0,最低版本是 API 级别 21.0。

某些 API 特定于某些 Android 版本及更高版本,因此我想确保它们仅在受支持的版本上被调用。但是,我总是收到以下警告(以及类似的警告,具体取决于所使用的 API):

警告 CA1416:此呼叫站点可在:'Android' 21.0 和 之后。 'WindowInsets.Type.SystemBars()' 仅支持: 'android' 30.0 及更高版本。

以下用于隐藏和显示系统栏的代码适用于我迄今为止尝试过的所有设备和模拟器,但我担心早期的 Android 版本。尽管检查了正确的目标 API 版本,但我仍然收到上面的警告:

static partial class DeviceServices
{
    private static Activity _activity;

    public static void SetActivity(Activity activity)
    {
        _activity = activity;
    }

    public static partial void HideSystemControls()
    {
#if ANDROID30_0_OR_GREATER
       if (Build.VERSION.SdkInt >= BuildVersionCodes.R) //R == API level 30.0
       {
            _activity?.Window?.InsetsController?.Hide(WindowInsets.Type.SystemBars());
       }
#endif
    }

    public static partial void ShowSystemControls()
    {
#if ANDROID30_0_OR_GREATER
       if (Build.VERSION.SdkInt >= BuildVersionCodes.R) //R == API level 30.0
       {
            _activity?.Window?.InsetsController?.Show(WindowInsets.Type.SystemBars());
       }
#endif
    }
}

那么,这样做的正确方法是什么?我不确定如何进行。我已经多次使用特定于平台的 API,之前从未遇到过任何问题,但这个警告让我很担心。我也已经查看了有关此警告的支持文章,但我没有发现它很有帮助:https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1416。我也不想压制警告。也许我在这里遗漏了一些东西,或者在这种情况下我可以简单地忽略警告吗?

【问题讨论】:

  • 您必须在运行时检查 api 级别。 #如果是编译时间
  • 是的,我知道预处理器指令是编译时检查。这就是为什么我也尝试了第二种方法,但它也没有帮助。
  • 您的第二个示例仍包含在 #if 中
  • 我已经更新了这个问题。我也收到没有#if 的警告。这就是为什么我尝试添加它。当它针对 API 29 或更低版本编译时,它甚至不应该出现在 MSIL 代码中,对吧?
  • 您是否正在尝试解决实际问题,或者您只是想解决警告消息?我怀疑编译器根本不够“聪明”,无法识别可疑代码包含在 API 级别的检查中

标签: c# android maui conditional-compilation android-api-levels


【解决方案1】:

起初,我创建了一个新示例并添加了您在 MainActivity 中提供的代码,没有任何警告消息。所以你也可以试一试。

然后,我像你一样创建了一个新类,也没有任何警告。以及解决方案的组成:

  1. Visual Studio 2022 17.4 预览版 2.1
  2. 在AndroidManifest.xml中添加<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" android:maxSdkVersion="33"/>这个
  3. 在我项目的构建设置文件中,Android Target FrameWork 是 Android api 31。

    另外,对于maui中的android部分,只有一个Activity名为MainActivity,它继承自AppCompactActivity。所以你不需要为android声明static partial class DeviceServices,你可以在mainactivity中这样做。此外,ActivityAppCompactActivity 并不相同。

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 2022-12-19
    • 2023-02-19
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多