DCS/ruiyiweiUX/Assets/Scripts/Managers/AndroidPermissionManager.cs

197 lines
6.7 KiB
C#
Raw Normal View History

2026-06-09 13:59:11 +08:00
using UnityEngine;
/// <summary>
/// Android权限管理器
/// 处理Android平台所需的各种权限
/// </summary>
public static class AndroidPermissionManager
{
#if UNITY_ANDROID && !UNITY_EDITOR
/// <summary>
/// 检查是否有写入系统设置的权限
/// </summary>
public static bool HasWriteSettingsPermission()
{
try
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass settingsClass = new AndroidJavaClass("android.provider.Settings$System");
bool canWrite = settingsClass.CallStatic<bool>("canWrite", currentActivity);
return canWrite;
}
catch (System.Exception ex)
{
Debug.LogError($"检查写入设置权限失败: {ex.Message}");
return false;
}
}
/// <summary>
/// 请求写入系统设置权限
/// </summary>
public static void RequestWriteSettingsPermission()
{
try
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent");
// 设置Action为管理写入设置
intent.Call<AndroidJavaObject>("setAction", "android.settings.action.MANAGE_WRITE_SETTINGS");
// 设置数据URI
AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
AndroidJavaObject uri = uriClass.CallStatic<AndroidJavaObject>("parse", "package:" + GetPackageName());
intent.Call<AndroidJavaObject>("setData", uri);
currentActivity.Call("startActivity", intent);
Debug.Log("已请求写入设置权限,请在系统设置中授权");
}
catch (System.Exception ex)
{
Debug.LogError($"请求写入设置权限失败: {ex.Message}");
}
}
/// <summary>
/// 检查是否有访问网络状态权限
/// </summary>
public static bool HasNetworkStatePermission()
{
try
{
return HasPermission("android.permission.ACCESS_NETWORK_STATE");
}
catch (System.Exception ex)
{
Debug.LogError($"检查网络状态权限失败: {ex.Message}");
return false;
}
}
/// <summary>
/// 检查是否有访问WiFi状态权限
/// </summary>
public static bool HasWifiStatePermission()
{
try
{
return HasPermission("android.permission.ACCESS_WIFI_STATE");
}
catch (System.Exception ex)
{
Debug.LogError($"检查WiFi状态权限失败: {ex.Message}");
return false;
}
}
/// <summary>
/// 检查是否有改变WiFi状态权限
/// </summary>
public static bool HasChangeWifiStatePermission()
{
try
{
return HasPermission("android.permission.CHANGE_WIFI_STATE");
}
catch (System.Exception ex)
{
Debug.LogError($"检查WiFi控制权限失败: {ex.Message}");
return false;
}
}
/// <summary>
/// 请求运行时权限
/// </summary>
public static void RequestPermissions(string[] permissions)
{
try
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
currentActivity.Call("requestPermissions", permissions, 1001);
Debug.Log($"已请求权限: {string.Join(", ", permissions)}");
}
catch (System.Exception ex)
{
Debug.LogError($"请求权限失败: {ex.Message}");
}
}
/// <summary>
/// 检查指定权限
/// </summary>
private static bool HasPermission(string permission)
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
int result = currentActivity.Call<int>("checkSelfPermission", permission);
// PackageManager.PERMISSION_GRANTED = 0
return result == 0;
}
/// <summary>
/// 获取应用包名
/// </summary>
private static string GetPackageName()
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
return currentActivity.Call<string>("getPackageName");
}
/// <summary>
/// 初始化必要权限检查
/// </summary>
public static void InitializePermissions()
{
Debug.Log("=== Android权限检查 ===");
bool writeSettings = HasWriteSettingsPermission();
bool networkState = HasNetworkStatePermission();
bool wifiState = HasWifiStatePermission();
bool changeWifiState = HasChangeWifiStatePermission();
Debug.Log($"写入设置权限: {writeSettings}");
Debug.Log($"网络状态权限: {networkState}");
Debug.Log($"WiFi状态权限: {wifiState}");
Debug.Log($"WiFi控制权限: {changeWifiState}");
// 如果缺少关键权限,给出提示
if (!writeSettings)
{
Debug.LogWarning("缺少写入设置权限,亮度控制可能无法正常工作");
}
if (!networkState || !wifiState)
{
Debug.LogWarning("缺少网络相关权限,网络功能可能受限");
}
}
#else
// 非Android平台的空实现
public static bool HasWriteSettingsPermission() => true;
public static void RequestWriteSettingsPermission() => Debug.Log("[非Android] 无需权限");
public static bool HasNetworkStatePermission() => true;
public static bool HasWifiStatePermission() => true;
public static bool HasChangeWifiStatePermission() => true;
public static void RequestPermissions(string[] permissions) => Debug.Log("[非Android] 无需权限");
public static void InitializePermissions() => Debug.Log("[非Android] 权限检查跳过");
#endif
}