first commit

This commit is contained in:
2025-07-14 00:42:12 +08:00
commit 1632c3329d
45 changed files with 2714 additions and 0 deletions

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true">
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
</manifest>

View File

@ -0,0 +1,102 @@
using Android.App;
using Android.Content;
using AndroidX.Core.App;
using Application = Android.App.Application;
namespace HeartRateMonitorAndroid.Platforms.Android
{
// Android平台特定的通知帮助类
public static class AndroidNotificationHelper
{
// 创建通知渠道
public static void CreateNotificationChannel(string channelId, string channelName, string description)
{
if (OperatingSystem.IsAndroidVersionAtLeast(26))
{
var context = Application.Context;
var channel = new NotificationChannel(channelId, channelName, NotificationImportance.High)
{
Description = description
};
var notificationManager = context.GetSystemService(Context.NotificationService) as NotificationManager;
notificationManager?.CreateNotificationChannel(channel);
}
}
// 显示通知
public static void ShowNotification(string channelId, int notificationId, string title, string content, int iconResourceId, bool ongoing = true)
{
var context = Application.Context;
// 创建PendingIntent用于点击通知时打开应用
var intent = context.PackageManager.GetLaunchIntentForPackage(context.PackageName);
var pendingIntent = PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.Immutable);
// 创建通知内容
var notificationBuilder = new NotificationCompat.Builder(context, channelId)
.SetContentTitle(title)
.SetContentText(content)
.SetSmallIcon(iconResourceId)
.SetOngoing(ongoing)
.SetContentIntent(pendingIntent)
.SetPriority(NotificationCompat.PriorityHigh);
// 显示通知
var notificationManager = NotificationManagerCompat.From(context);
notificationManager.Notify(notificationId, notificationBuilder.Build());
}
// 显示普通通知 - 用于重连提示等
public static void ShowNormalNotification(string channelId, int notificationId, string title, string content, int iconResourceId, bool isForeground)
{
var context = Application.Context;
var intent = context.PackageManager.GetLaunchIntentForPackage(context.PackageName);
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);
var pendingIntent = PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.Immutable);
var builder = new NotificationCompat.Builder(context, channelId)
.SetContentTitle(title)
.SetContentText(content)
.SetSmallIcon(iconResourceId)
.SetContentIntent(pendingIntent)
.SetAutoCancel(true);
var notification = builder.Build();
// 普通通知
var notificationManager = NotificationManagerCompat.From(context);
notificationManager.Notify(notificationId, notification);
}
// 显示带有扩展内容的通知
public static void ShowBigTextNotification(string channelId, int notificationId, string title, string content, string bigText, int iconResourceId, bool ongoing = true)
{
var context = Application.Context;
// 创建PendingIntent用于点击通知时打开应用
var intent = context.PackageManager.GetLaunchIntentForPackage(context.PackageName);
var pendingIntent = PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.Immutable);
// 创建通知内容
var notificationBuilder = new NotificationCompat.Builder(context, channelId)
.SetContentTitle(title)
.SetContentText(content)
.SetSmallIcon(iconResourceId)
.SetOngoing(ongoing)
.SetContentIntent(pendingIntent)
.SetPriority(NotificationCompat.PriorityHigh)
.SetStyle(new NotificationCompat.BigTextStyle().BigText(bigText));
// 显示通知
var notificationManager = NotificationManagerCompat.From(context);
notificationManager.Notify(notificationId, notificationBuilder.Build());
}
// 取消通知
public static void CancelNotification(int notificationId)
{
var context = Application.Context;
var notificationManager = NotificationManagerCompat.From(context);
notificationManager.Cancel(notificationId);
}
}
}

View File

@ -0,0 +1,12 @@
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace HeartRateMonitorAndroid;
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode |
ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
}

View File

@ -0,0 +1,15 @@
using Android.App;
using Android.Runtime;
namespace HeartRateMonitorAndroid;
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#512BD4</color>
<color name="colorPrimaryDark">#2B0B98</color>
<color name="colorAccent">#2B0B98</color>
</resources>