197 lines
6.7 KiB
C#
197 lines
6.7 KiB
C#
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
|
|
} |