使用 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
输了你,赢了世界又如何...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2021-11-15 使用 SQL 命令 通过备份文件恢复数据库