使用 Avalonia 生成安卓应用

1、通过新建 Avalonia C# Project 项目向导,建立带有 Android 的 Avalonia 项目。

假设项目名称为:AvaloniaTest

2、添加需要申请设备的权限(如网络、蓝牙等)声明到 AvaloniaTest.Android/Properties/AndroidManifest.xml

以申请蓝牙权限为例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
	<application android:label="AvaloniaTest" android:icon="@drawable/Icon" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
</manifest>

3、在最新版本的安卓系统下,对于某些权限,除在 AndroidManifest.xml 进行声明外,还需要通过代码在运行中弹出请求。

本来 Avalonia 是有一个自己的跨平台工具包 Avalonia.Essentials,不过因为官方基于 MAUI 后来也独立出来提供了一个 Maui.Essentials 跨平台工具包,所以自己的就不再维护,统一使用 MAUI 的包了。

故此步请在 nuget 中添加 Microsoft.Maui.Essentials 到 AvaloniaTest.Android 项目中。

4、在 AvaloniaTest.Android 项目中编写相关权限声明代码

public class BluetoothHelperForAndroid : IBluetoothHelper
{
    // 预设需要申请的权限
    private class BluetoothPermissions : Permissions.BasePlatformPermission
    {
        public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
            new List<(string androidPermission, bool isRuntime)>
            {
                (Permission.AccessFineLocation, true),
                (Permission.Bluetooth, true),
                (Permission.BluetoothScan, true),
                (Permission.BluetoothConnect, true),
                (Permission.BluetoothAdmin, true),
            }.ToArray();
    }

    public async Task<bool> AndroidCheckAndRequestBluetoothPermission()
    {
        // 检查权限
        var status = await Permissions.CheckStatusAsync<BluetoothPermissions>();
        if (status == PermissionStatus.Granted)
        {
            return true;
        }

        // 检查没有,则申请授权
        status = await Permissions.RequestAsync<BluetoothPermissions>();
        if (status == PermissionStatus.Granted)
        {
            return true;
        }

        // 没有授权
        return false;
    }
}

并在初始化时进行相关处理

public class MainActivity : AvaloniaMainActivity<App>
{
    protected override void OnCreate(Bundle? savedInstanceState)
    {
        // 初始化 Maui.Essentials 组件
        Platform.Init(this.Application);
        
        base.OnCreate(savedInstanceState);
    }

    protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
    {
        // 注入授权操作
        App.BluetoothHelper = new BluetoothHelperForAndroid();

        return base.CustomizeAppBuilder(builder)
            .WithInterFont()
            .UseReactiveUI();
    }
}

5、在 AvaloniaTest 项目中,需要申请相关权限时,调用即可。

public interface IBluetoothHelper
{
    Task<bool> AndroidCheckAndRequestBluetoothPermission();
}

public partial class App : Application
{
    public static IBluetoothHelper BluetoothHelper { get; set; } = new BluetoothHelper();
}

public async Task<bool> CheckBluetooth()
{
    if (!await App.BluetoothHelper.AndroidCheckAndRequestBluetoothPermission())
    {
        return false;
    }
}

结束。 

参考:

https://github.com/AvaloniaUI/Avalonia.Essentials

https://stackoverflow.com/questions/51800427/xamarin-essentials-the-current-activity-can-not-be-detected-ensure-that-you-ha

posted @   不是豆豆  阅读(1239)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2021-11-15 使用 SQL 命令 通过备份文件恢复数据库
友情链接:迷途


点击右上角即可分享
微信分享提示