久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Unity游戲開發(fā)實(shí)戰(zhàn):Android 13權(quán)限適配與優(yōu)雅權(quán)限管理器實(shí)現(xiàn)

Unity游戲開發(fā)實(shí)戰(zhàn):Android 13權(quán)限適配與優(yōu)雅權(quán)限管理器實(shí)現(xiàn) 1. 項(xiàng)目概述為什么Android 13權(quán)限適配是Unity開發(fā)者的“必修課”如果你最近用Unity打包的Android游戲在Android 13設(shè)備上運(yùn)行時(shí)突然發(fā)現(xiàn)相機(jī)打不開、相冊(cè)訪問(wèn)不了或者通知不彈了別急著懷疑是自己的代碼寫錯(cuò)了。這大概率是撞上了Android 13API 33引入的新一輪權(quán)限策略收緊。從Android 6.0的動(dòng)態(tài)權(quán)限到Android 10的作用域存儲(chǔ)再到Android 13的細(xì)粒度媒體權(quán)限和運(yùn)行時(shí)通知權(quán)限Google每一次大版本更新都在把“用戶隱私和數(shù)據(jù)安全”的緊箍咒再念緊一圈。對(duì)于Unity開發(fā)者來(lái)說(shuō)這不再是簡(jiǎn)單的調(diào)用幾個(gè)API的問(wèn)題而是一套需要從設(shè)計(jì)、編碼到測(cè)試全流程貫通的“合規(guī)性工程”。我經(jīng)歷過(guò)不止一次因?yàn)闄?quán)限問(wèn)題導(dǎo)致的線上事故新版本上線后差評(píng)突然增多核心功能失效排查半天才發(fā)現(xiàn)是目標(biāo)API等級(jí)Target API Level升級(jí)后新的權(quán)限模型生效了。所以今天我們不聊虛的直接切入實(shí)戰(zhàn)把Android 13下Unity游戲開發(fā)中那些“坑”一個(gè)個(gè)填平。我會(huì)帶你理解背后的機(jī)制并給出一套完整的、可復(fù)用的代碼方案讓你能優(yōu)雅地處理權(quán)限問(wèn)題而不是在用戶拒絕后讓游戲卡死或崩潰。記住優(yōu)雅的權(quán)限處理是提升用戶體驗(yàn)和留存率的關(guān)鍵一步絕不是可有可無(wú)的邊緣功能。2. Android 13權(quán)限模型的核心變化與Unity適配要點(diǎn)Android 13的權(quán)限變化不是小修小補(bǔ)而是對(duì)開發(fā)者習(xí)慣的一次“顛覆”。如果你還停留在“在Start()里一次性請(qǐng)求所有權(quán)限”的舊思維那你的應(yīng)用在Android 13上會(huì)舉步維艱。我們必須先理解這些變化才能寫出正確的代碼。2.1 細(xì)粒度媒體權(quán)限告別“讀寫存儲(chǔ)”一刀切在Android 13之前我們通常使用READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE這兩個(gè)“粗放”的權(quán)限來(lái)訪問(wèn)用戶的媒體文件。這相當(dāng)于你向用戶要了一把能打開他整個(gè)媒體庫(kù)包括照片、視頻、音樂(lè)的萬(wàn)能鑰匙。用戶自然會(huì)警惕。Android 13引入了更細(xì)分的媒體權(quán)限將訪問(wèn)權(quán)限與具體的媒體類型掛鉤READ_MEDIA_IMAGES僅讀取圖片和照片。READ_MEDIA_VIDEO僅讀取視頻。READ_MEDIA_AUDIO僅讀取音頻文件。這對(duì)Unity開發(fā)者的直接影響是什么目標(biāo)APITarget API Level 33時(shí)新規(guī)則強(qiáng)制生效。如果你的游戲需要保存截圖到相冊(cè)或者讓用戶選擇頭像你不能再只請(qǐng)求READ_EXTERNAL_STORAGE。如果你只需要讀取圖片就應(yīng)該只請(qǐng)求READ_MEDIA_IMAGES。WRITE_EXTERNAL_STORAGE在Android 13上幾乎被廢棄。對(duì)于媒體文件應(yīng)用現(xiàn)在擁有其創(chuàng)建的文件的完全訪問(wèn)權(quán)限無(wú)需寫入權(quán)限。向共享存儲(chǔ)寫入媒體文件應(yīng)使用MediaStoreAPI。Unity引擎的兼容性較老版本的Unity如2020.3 LTS之前的版本可能沒(méi)有預(yù)定義這些新權(quán)限的常量。你需要手動(dòng)聲明它們。注意如果你的應(yīng)用需要同時(shí)訪問(wèn)圖片和視頻你必須同時(shí)請(qǐng)求READ_MEDIA_IMAGES和READ_MEDIA_VIDEO兩個(gè)權(quán)限。系統(tǒng)會(huì)彈出一個(gè)合并的對(duì)話框但邏輯上是兩個(gè)獨(dú)立的權(quán)限請(qǐng)求。2.2 運(yùn)行時(shí)通知權(quán)限從安裝時(shí)授予到用時(shí)申請(qǐng)這是另一個(gè)重大變化。以前只要你在AndroidManifest.xml里聲明了POST_NOTIFICATIONS權(quán)限應(yīng)用安裝后默認(rèn)就擁有發(fā)送通知的能力?,F(xiàn)在POST_NOTIFICATIONS被提升為運(yùn)行時(shí)危險(xiǎn)權(quán)限。這意味著應(yīng)用必須在向用戶發(fā)送任何通知之前主動(dòng)請(qǐng)求并獲得該權(quán)限。請(qǐng)求的時(shí)機(jī)至關(guān)重要。最好的實(shí)踐是在用戶可能希望收到通知的上下文場(chǎng)景中請(qǐng)求例如在游戲設(shè)置中開啟“戰(zhàn)斗獎(jiǎng)勵(lì)提醒”時(shí)或者在社交功能中請(qǐng)求“好友消息通知”權(quán)限時(shí)。不要在游戲一啟動(dòng)就彈窗那會(huì)被用戶視為騷擾而拒絕。2.3 鄰近Wi-Fi權(quán)限與身體傳感器權(quán)限這兩項(xiàng)對(duì)特定品類的游戲影響較大NEARBY_WIFI_DEVICES用于發(fā)現(xiàn)和連接附近的Wi-Fi設(shè)備。如果你的游戲涉及本地多人聯(lián)機(jī)如通過(guò)Wi-Fi直連需要此權(quán)限。BODY_SENSORS訪問(wèn)身體傳感器如心率。主要針對(duì)健康類應(yīng)用普通游戲較少涉及。Unity適配的核心思路轉(zhuǎn)變從“一次性索要所有權(quán)限”轉(zhuǎn)變?yōu)榘葱?、分?chǎng)景、有解釋地請(qǐng)求權(quán)限。你的代碼邏輯需要變得更加動(dòng)態(tài)和智能。3. 實(shí)戰(zhàn)構(gòu)建一個(gè)優(yōu)雅的Unity Android權(quán)限管理器理解了理論我們開始動(dòng)手。我將構(gòu)建一個(gè)名為AndroidPermissionManager的單例類它負(fù)責(zé)所有權(quán)限相關(guān)的邏輯。這樣做的好處是職責(zé)清晰便于在整個(gè)項(xiàng)目中復(fù)用和維護(hù)。3.1 定義權(quán)限常量與管理器框架首先我們需要定義Android 13的新權(quán)限常量。因?yàn)閁nity的UnityEngine.Android.Permission類可能還未更新包含它們。// AndroidPermissionConstants.cs public static class AndroidPermissionConstants { // 傳統(tǒng)存儲(chǔ)權(quán)限 (用于 API 33 或作為回退) public const string ReadExternalStorage android.permission.READ_EXTERNAL_STORAGE; public const string WriteExternalStorage android.permission.WRITE_EXTERNAL_STORAGE; // Android 13 (API 33) 細(xì)粒度媒體權(quán)限 public const string ReadMediaImages android.permission.READ_MEDIA_IMAGES; public const string ReadMediaVideo android.permission.READ_MEDIA_VIDEO; public const string ReadMediaAudio android.permission.READ_MEDIA_AUDIO; // Android 13 (API 33) 通知權(quán)限 public const string PostNotifications android.permission.POST_NOTIFICATIONS; // 其他常用權(quán)限 public const string Camera android.permission.CAMERA; public const string RecordAudio android.permission.RECORD_AUDIO; public const string AccessFineLocation android.permission.ACCESS_FINE_LOCATION; }接下來(lái)是權(quán)限管理器的核心框架。我們使用單例模式確保全局只有一個(gè)權(quán)限管理器。// AndroidPermissionManager.cs using UnityEngine; using System; using System.Collections.Generic; #if UNITY_ANDROID using UnityEngine.Android; #endif public class AndroidPermissionManager : MonoBehaviour { public static AndroidPermissionManager Instance { get; private set; } // 定義一個(gè)委托用于權(quán)限請(qǐng)求結(jié)果的回調(diào) public delegate void PermissionCallback(bool granted); // 存儲(chǔ)正在進(jìn)行的權(quán)限請(qǐng)求的回調(diào) private Dictionarystring, PermissionCallback pendingCallbacks new Dictionarystring, PermissionCallback(); // 權(quán)限與其中文解釋的映射用于向用戶展示 private Dictionarystring, string permissionRationaleMap new Dictionarystring, string() { { AndroidPermissionConstants.ReadMediaImages, 需要訪問(wèn)您的相冊(cè)以便您選擇游戲頭像或上傳截圖。 }, { AndroidPermissionConstants.ReadMediaVideo, 需要訪問(wèn)您的視頻文件用于錄制和分享游戲精彩時(shí)刻。 }, { AndroidPermissionConstants.PostNotifications, 希望向您發(fā)送游戲更新、活動(dòng)提醒和好友消息以免您錯(cuò)過(guò)重要內(nèi)容。 }, { AndroidPermissionConstants.Camera, 需要使用攝像頭進(jìn)行AR游戲體驗(yàn)或掃描二維碼添加好友。 }, { AndroidPermissionConstants.RecordAudio, 需要麥克風(fēng)權(quán)限用于游戲內(nèi)語(yǔ)音聊天或語(yǔ)音指令。 }, { AndroidPermissionConstants.AccessFineLocation, 需要獲取您的位置信息用于基于位置的游戲玩法或附近玩家匹配。 } }; private void Awake() { if (Instance ! null Instance ! this) { Destroy(this.gameObject); return; } Instance this; DontDestroyOnLoad(this.gameObject); // 常駐場(chǎng)景方便全局調(diào)用 } }3.2 核心方法檢查、請(qǐng)求與處理回調(diào)管理器的核心是三個(gè)方法檢查權(quán)限狀態(tài)、發(fā)起權(quán)限請(qǐng)求、處理系統(tǒng)返回的結(jié)果。// 在 AndroidPermissionManager.cs 中繼續(xù)添加 public bool CheckPermission(string permission) { #if UNITY_ANDROID return Permission.HasUserAuthorizedPermission(permission); #else Debug.LogWarning($[PermissionManager] 非Android平臺(tái)默認(rèn)授予權(quán)限: {permission}); return true; // 在編輯器或其他平臺(tái)默認(rèn)返回true #endif } public void RequestPermission(string permission, PermissionCallback callback) { #if UNITY_ANDROID // 1. 先檢查是否已有權(quán)限 if (CheckPermission(permission)) { callback?.Invoke(true); return; } // 2. 檢查用戶是否之前選擇了“不再詢問(wèn)” if (ShouldShowRequestPermissionRationale(permission)) { // 用戶拒絕過(guò)但未勾選“不再詢問(wèn)”可以展示解釋性UI ShowRationaleDialog(permission, callback); } else { // 首次請(qǐng)求或用戶已選擇“不再詢問(wèn)”直接向系統(tǒng)發(fā)起請(qǐng)求 DoRequestPermission(permission, callback); } #else callback?.Invoke(true); // 非Android平臺(tái)直接模擬成功 #endif } // 處理系統(tǒng)權(quán)限請(qǐng)求結(jié)果這個(gè)函數(shù)需要由Android系統(tǒng)回調(diào) private void OnPermissionRequestResult(string permission, bool granted) { Debug.Log($[PermissionManager] 權(quán)限 {permission} 請(qǐng)求結(jié)果: {granted}); if (pendingCallbacks.TryGetValue(permission, out var callback)) { callback?.Invoke(granted); pendingCallbacks.Remove(permission); } } // 實(shí)際調(diào)用Unity API發(fā)起請(qǐng)求 private void DoRequestPermission(string permission, PermissionCallback callback) { #if UNITY_ANDROID pendingCallbacks[permission] callback; // 注意這里我們使用一個(gè)協(xié)程來(lái)等待并捕獲回調(diào)因?yàn)閁nity的Permission類回調(diào)方式比較原始。 // 更優(yōu)雅的方式是使用Android原生插件但為簡(jiǎn)化此處用Unity內(nèi)置方式演示。 StartCoroutine(RequestPermissionCoroutine(permission)); #endif } private System.Collections.IEnumerator RequestPermissionCoroutine(string permission) { var callbacks PermissionCallbacks.Instance; bool requestCompleted false; bool resultGranted false; callbacks.PermissionGranted (string perm) { if (perm permission) { resultGranted true; requestCompleted true; } }; callbacks.PermissionDenied (string perm) { if (perm permission) { requestCompleted true; } }; callbacks.PermissionDeniedAndDontAskAgain (string perm) { if (perm permission) { requestCompleted true; } }; Permission.RequestUserPermission(permission); // 等待請(qǐng)求完成簡(jiǎn)單輪詢實(shí)際項(xiàng)目可用更高級(jí)的異步等待 float timeout 5f; // 超時(shí)時(shí)間 float timer 0; while (!requestCompleted timer timeout) { timer Time.deltaTime; yield return null; } OnPermissionRequestResult(permission, resultGranted); }關(guān)鍵點(diǎn)解析ShouldShowRequestPermissionRationale這是一個(gè)關(guān)鍵方法。它返回true表示用戶之前拒絕過(guò)此權(quán)限但沒(méi)有勾選“不再詢問(wèn)”。這是你向用戶解釋權(quán)限用途的黃金窗口期。如果返回false要么是用戶從未被詢問(wèn)過(guò)要么是用戶已經(jīng)勾選了“不再詢問(wèn)”。對(duì)于后者你只能引導(dǎo)用戶去系統(tǒng)設(shè)置頁(yè)手動(dòng)開啟?;卣{(diào)處理Unity的Permission.RequestUserPermission是異步的但沒(méi)有提供方便的async/await或回調(diào)參數(shù)。上面的代碼通過(guò)PermissionCallbacks來(lái)監(jiān)聽結(jié)果并用協(xié)程等待。這是Unity API比較別扭的地方我們通過(guò)封裝來(lái)簡(jiǎn)化上層調(diào)用。3.3 實(shí)現(xiàn)解釋性對(duì)話框與引導(dǎo)至系統(tǒng)設(shè)置當(dāng)ShouldShowRequestPermissionRationale返回true時(shí)我們應(yīng)該彈出一個(gè)自定義對(duì)話框友好地解釋為什么需要這個(gè)權(quán)限從而提高用戶的授權(quán)率。// 在 AndroidPermissionManager.cs 中添加 private void ShowRationaleDialog(string permission, PermissionCallback callback) { // 這里應(yīng)該觸發(fā)你的UI系統(tǒng)彈出一個(gè)模態(tài)對(duì)話框。 // 例如使用UGUI創(chuàng)建一個(gè)簡(jiǎn)單的對(duì)話框Prefab。 // 以下為邏輯示例 string rationaleText GetRationaleText(permission); string dialogTitle 權(quán)限請(qǐng)求; // 假設(shè)你有一個(gè)UI管理器可以顯示對(duì)話框 UIManager.Instance.ShowConfirmDialog( dialogTitle, rationaleText, 去設(shè)置, 取消, () { // 用戶點(diǎn)擊“去設(shè)置”再次發(fā)起系統(tǒng)請(qǐng)求 DoRequestPermission(permission, callback); }, () { // 用戶點(diǎn)擊“取消”直接回調(diào)拒絕 callback?.Invoke(false); } ); } private string GetRationaleText(string permission) { if (permissionRationaleMap.TryGetValue(permission, out string rationale)) { return rationale; } return 此功能需要相關(guān)權(quán)限才能正常使用請(qǐng)授權(quán)。; }如果用戶已經(jīng)選擇了“不再詢問(wèn)”Permission.RequestUserPermission將不會(huì)彈出系統(tǒng)對(duì)話框。此時(shí)我們必須引導(dǎo)用戶手動(dòng)去系統(tǒng)設(shè)置頁(yè)面開啟。public void OpenAppSettings() { #if UNITY_ANDROID !UNITY_EDITOR try { using (var unityClass new AndroidJavaClass(com.unity3d.player.UnityPlayer)) using (var currentActivity unityClass.GetStaticAndroidJavaObject(currentActivity)) using (var intent new AndroidJavaObject(android.content.Intent)) { string packageName currentActivity.Callstring(getPackageName); using (var uri new AndroidJavaObject(android.net.Uri)) { // Android 8.0 (API 26) 之后跳轉(zhuǎn)到應(yīng)用信息頁(yè)面的Intent Action intent.CallAndroidJavaObject(setAction, android.settings.APPLICATION_DETAILS_SETTINGS); string uriString package: packageName; var uriObj uri.CallStaticAndroidJavaObject(parse, uriString); intent.CallAndroidJavaObject(setData, uriObj); intent.CallAndroidJavaObject(addCategory, android.intent.category.DEFAULT); intent.CallAndroidJavaObject(setFlags, 0x10000000); // FLAG_ACTIVITY_NEW_TASK currentActivity.Call(startActivity, intent); } } } catch (System.Exception e) { Debug.LogError($[PermissionManager] 打開系統(tǒng)設(shè)置失敗: {e.Message}); } #else Debug.Log([PermissionManager] 非Android運(yùn)行時(shí)無(wú)法打開系統(tǒng)設(shè)置。); #endif }3.4 針對(duì)Android 13的智能權(quán)限請(qǐng)求策略現(xiàn)在我們將所有部分組合起來(lái)實(shí)現(xiàn)一個(gè)智能的、兼容Android 13的權(quán)限請(qǐng)求方法。這個(gè)方法會(huì)自動(dòng)根據(jù)設(shè)備API等級(jí)選擇正確的權(quán)限字符串。// 在 AndroidPermissionManager.cs 中添加 public void RequestMediaPermission(PermissionCallback callback, MediaType mediaType) { string permissionToRequest; #if UNITY_ANDROID // 獲取當(dāng)前Android API級(jí)別 int apiLevel GetAndroidAPILevel(); if (apiLevel 33) // Android 13 (T) 及以上 { switch (mediaType) { case MediaType.Image: permissionToRequest AndroidPermissionConstants.ReadMediaImages; break; case MediaType.Video: permissionToRequest AndroidPermissionConstants.ReadMediaVideo; break; case MediaType.Audio: permissionToRequest AndroidPermissionConstants.ReadMediaAudio; break; default: permissionToRequest AndroidPermissionConstants.ReadExternalStorage; // 回退 break; } } else { // Android 13 以下使用傳統(tǒng)的存儲(chǔ)權(quán)限 permissionToRequest AndroidPermissionConstants.ReadExternalStorage; // 注意在Android 10-12上即使有READ_EXTERNAL_STORAGE訪問(wèn)媒體文件也受作用域存儲(chǔ)限制。 // 實(shí)際開發(fā)中應(yīng)使用Unity的NativeGallery等插件或FilePicker來(lái)安全訪問(wèn)。 } RequestPermission(permissionToRequest, callback); #else callback?.Invoke(true); #endif } public void RequestNotificationPermission(PermissionCallback callback) { #if UNITY_ANDROID int apiLevel GetAndroidAPILevel(); if (apiLevel 33) { RequestPermission(AndroidPermissionConstants.PostNotifications, callback); } else { // Android 13以下通知權(quán)限非運(yùn)行時(shí)權(quán)限默認(rèn)擁有需在Manifest聲明 callback?.Invoke(true); } #else callback?.Invoke(true); #endif } private int GetAndroidAPILevel() { #if UNITY_ANDROID !UNITY_EDITOR using (var version new AndroidJavaClass(android.os.Build$VERSION)) { return version.GetStaticint(SDK_INT); } #else return 0; // 編輯器環(huán)境 #endif } public enum MediaType { Image, Video, Audio }4. 在游戲業(yè)務(wù)邏輯中集成權(quán)限管理有了強(qiáng)大的AndroidPermissionManager我們?cè)跇I(yè)務(wù)層調(diào)用就變得非常清晰和安全。以下是一些典型場(chǎng)景的示例。4.1 場(chǎng)景一用戶上傳頭像假設(shè)有一個(gè)按鈕點(diǎn)擊后允許用戶從相冊(cè)選擇頭像。// AvatarUploadHandler.cs using UnityEngine; using UnityEngine.UI; public class AvatarUploadHandler : MonoBehaviour { public Button selectAvatarButton; void Start() { selectAvatarButton.onClick.AddListener(OnSelectAvatarClicked); } private void OnSelectAvatarClicked() { // 1. 請(qǐng)求讀取圖片的權(quán)限 AndroidPermissionManager.Instance.RequestMediaPermission(OnImagePermissionResult, MediaType.Image); } private void OnImagePermissionResult(bool granted) { if (granted) { // 權(quán)限已獲取打開圖片選擇器 // 這里需要接入一個(gè)原生圖片選擇器插件例如 NativeGallery // NativeGallery.GetImageFromGallery(...); Debug.Log(權(quán)限獲取成功開始選擇圖片...); // TODO: 調(diào)用具體的圖片選擇邏輯 } else { // 權(quán)限被拒絕 Debug.LogWarning(讀取相冊(cè)權(quán)限被拒絕無(wú)法選擇頭像。); // 可以在這里顯示一個(gè)提示告知用戶功能不可用并提供一個(gè)按鈕引導(dǎo)至設(shè)置。 ShowPermissionDeniedTip(相冊(cè)訪問(wèn)); } } private void ShowPermissionDeniedTip(string featureName) { UIManager.Instance.ShowConfirmDialog( 權(quán)限不足, $您拒絕了{(lán)featureName}權(quán)限相關(guān)功能將無(wú)法使用。您可以去系統(tǒng)設(shè)置中手動(dòng)開啟。, 去設(shè)置, 稍后再說(shuō), () { AndroidPermissionManager.Instance.OpenAppSettings(); }, null ); } }4.2 場(chǎng)景二請(qǐng)求通知權(quán)限不要在游戲啟動(dòng)時(shí)請(qǐng)求通知權(quán)限。更好的時(shí)機(jī)是在用戶完成新手引導(dǎo)、進(jìn)入主城后彈出一個(gè)溫馨的提示。// NotificationPermissionRequester.cs using UnityEngine; public class NotificationPermissionRequester : MonoBehaviour { [SerializeField] private string triggerPrefKey HasAskedNotificationPermission; // 用于記錄是否已詢問(wèn)過(guò) void Start() { // 例如在玩家首次進(jìn)入游戲大廳時(shí)觸發(fā) if (!PlayerPrefs.HasKey(triggerPrefKey)) { // 可以延遲幾秒避免干擾初始體驗(yàn) Invoke(nameof(PromptNotificationPermission), 5f); } } private void PromptNotificationPermission() { // 先檢查是否已有權(quán)限用戶可能在其他地方已經(jīng)授予 if (AndroidPermissionManager.Instance.CheckPermission(AndroidPermissionConstants.PostNotifications)) { return; } // 展示一個(gè)自定義的、吸引人的解釋界面而不是直接彈系統(tǒng)窗 UIManager.Instance.ShowNotificationPermissionDialog( 開啟游戲通知, 及時(shí)接收好友消息、體力恢復(fù)提醒和限時(shí)活動(dòng)通知讓你永不掉隊(duì), 立即開啟, 暫時(shí)不要, () { // 用戶點(diǎn)擊“立即開啟”發(fā)起系統(tǒng)權(quán)限請(qǐng)求 AndroidPermissionManager.Instance.RequestNotificationPermission(OnNotificationPermissionResult); PlayerPrefs.SetInt(triggerPrefKey, 1); }, () { // 用戶點(diǎn)擊“暫時(shí)不要”記錄并關(guān)閉 PlayerPrefs.SetInt(triggerPrefKey, 1); } ); } private void OnNotificationPermissionResult(bool granted) { if (granted) { Debug.Log(通知權(quán)限已開啟可以開始安排本地通知了。); // TODO: 初始化游戲內(nèi)通知調(diào)度系統(tǒng) } else { Debug.Log(用戶拒絕了通知權(quán)限。); } } }4.3 場(chǎng)景三使用相機(jī)進(jìn)行AR掃描// ARScanner.cs using UnityEngine; public class ARScanner : MonoBehaviour { public void StartScan() { AndroidPermissionManager.Instance.RequestPermission( AndroidPermissionConstants.Camera, (granted) { if (granted) { InitializeARCamera(); } else { Debug.LogError(相機(jī)權(quán)限被拒絕AR功能無(wú)法使用。); // 提示用戶并可能提供一個(gè)“重試”或“去設(shè)置”的按鈕 } } ); } private void InitializeARCamera() { // 初始化AR Foundation或其他AR SDK的代碼 Debug.Log(相機(jī)權(quán)限OK啟動(dòng)AR掃描...); } }5. 清單文件AndroidManifest.xml的關(guān)鍵配置代碼寫好了但AndroidManifest.xml的配置同樣重要否則權(quán)限請(qǐng)求可能根本不會(huì)觸發(fā)。你需要通過(guò)Unity的Plugins/Android文件夾來(lái)定制清單文件。創(chuàng)建或修改清單文件在項(xiàng)目的Assets/Plugins/Android目錄下創(chuàng)建或找到AndroidManifest.xml文件。如果沒(méi)有可以從Unity安裝目錄下的Editor/Data/PlaybackEngines/AndroidPlayer/Apk中復(fù)制一個(gè)模板。聲明權(quán)限在manifest標(biāo)簽內(nèi)添加你需要的所有權(quán)限。注意即使Android 13使用了新權(quán)限為了向后兼容有時(shí)也需要聲明舊權(quán)限。?xml version1.0 encodingutf-8? manifest xmlns:androidhttp://schemas.android.com/apk/res/android packagecom.yourcompany.yourgame android:installLocationpreferExternal !-- 傳統(tǒng)存儲(chǔ)權(quán)限 (用于 API 33 兼容) -- uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE android:maxSdkVersion32 / !-- 注意WRITE_EXTERNAL_STORAGE 在 Android 10 對(duì)媒體文件作用有限通常不需要了 -- !-- Android 13 (API 33) 細(xì)粒度媒體權(quán)限 -- uses-permission android:nameandroid.permission.READ_MEDIA_IMAGES / uses-permission android:nameandroid.permission.READ_MEDIA_VIDEO / uses-permission android:nameandroid.permission.READ_MEDIA_AUDIO / !-- Android 13 (API 33) 通知權(quán)限 -- uses-permission android:nameandroid.permission.POST_NOTIFICATIONS / !-- 其他常用權(quán)限 -- uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.RECORD_AUDIO / uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION / !-- 如果你的游戲需要保持屏幕常亮 -- uses-permission android:nameandroid.permission.WAKE_LOCK / application android:labelstring/app_name android:iconmipmap/app_icon android:themestyle/UnityThemeSelector android:usesCleartextTraffictrue !-- 其他Activity配置特別是UnityPlayerActivity -- activity android:namecom.unity3d.player.UnityPlayerActivity android:configChangesfontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen android:launchModesingleTask android:resizeableActivitytrue intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter meta-data android:nameunityplayer.UnityActivity android:valuetrue / /activity /application /manifest關(guān)鍵說(shuō)明android:maxSdkVersion32這個(gè)屬性用于READ_EXTERNAL_STORAGE表示此權(quán)限只對(duì)API 32Android 12L及以下的設(shè)備生效。在API 33的設(shè)備上系統(tǒng)會(huì)忽略此權(quán)限聲明。這是Google推薦的兼容性寫法。務(wù)必設(shè)置正確的Target API在Unity的Player Settings Android Other Settings中將Target API Level設(shè)置為最新如Android 13.0 (API Level 33)。這不僅是商店的要求也是確保新權(quán)限規(guī)則生效的前提。6. 測(cè)試、調(diào)試與常見問(wèn)題排查權(quán)限問(wèn)題在測(cè)試階段尤其棘手因?yàn)椴煌珹ndroid版本、不同廠商設(shè)備的行為可能有差異。以下是我總結(jié)的一套測(cè)試方法和常見問(wèn)題清單。6.1 在Unity編輯器和真機(jī)上的測(cè)試策略編輯器模擬我們的AndroidPermissionManager在非Android平臺(tái)會(huì)直接返回true方便在編輯器中跑通邏輯流程。但真正的回調(diào)行為和系統(tǒng)對(duì)話框無(wú)法模擬。ADB命令快速測(cè)試這是最高效的測(cè)試方法。在電腦上連接Android設(shè)備后使用命令行adb shell pm list permissions -d -g查看危險(xiǎn)權(quán)限組。adb shell pm grant package_name permission授予權(quán)限。例如adb shell pm grant com.yourcompany.yourgame android.permission.CAMERAadb shell pm revoke package_name permission撤銷權(quán)限。adb shell am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:package_name直接跳轉(zhuǎn)到你應(yīng)用的系統(tǒng)設(shè)置頁(yè)。測(cè)試用例覆蓋首次安裝所有權(quán)限都應(yīng)該是未授予狀態(tài)。允許權(quán)限點(diǎn)擊請(qǐng)求選擇“允許”。檢查功能是否正常。拒絕權(quán)限點(diǎn)擊請(qǐng)求選擇“拒絕”。檢查你的解釋性對(duì)話框是否彈出再次請(qǐng)求是否有效。拒絕并不再詢問(wèn)在系統(tǒng)對(duì)話框勾選“不再詢問(wèn)”后拒絕。檢查你的邏輯是否會(huì)引導(dǎo)用戶去系統(tǒng)設(shè)置。從系統(tǒng)設(shè)置中開啟/關(guān)閉權(quán)限在應(yīng)用運(yùn)行時(shí)去系統(tǒng)設(shè)置里開關(guān)權(quán)限返回應(yīng)用后檢查狀態(tài)是否被正確檢測(cè)到可能需要監(jiān)聽OnApplicationPause/OnApplicationFocus事件來(lái)重新檢查。6.2 常見問(wèn)題與解決方案速查表問(wèn)題現(xiàn)象可能原因解決方案在Android 13設(shè)備上請(qǐng)求READ_EXTERNAL_STORAGE無(wú)效無(wú)法訪問(wèn)相冊(cè)。Target API Level 33系統(tǒng)已啟用新權(quán)限模型。READ_EXTERNAL_STORAGE對(duì)媒體文件無(wú)效。使用RequestMediaPermission方法它會(huì)根據(jù)API等級(jí)自動(dòng)請(qǐng)求READ_MEDIA_IMAGES等權(quán)限。確保清單文件已聲明新權(quán)限。用戶點(diǎn)擊“拒絕并不再詢問(wèn)”后再次調(diào)用RequestUserPermission系統(tǒng)對(duì)話框不彈出。這是Android系統(tǒng)的預(yù)期行為。當(dāng)用戶勾選“不再詢問(wèn)”后該權(quán)限的請(qǐng)求通道被系統(tǒng)屏蔽。調(diào)用ShouldShowRequestPermissionRationale(permission)如果返回false且CheckPermission也返回false則應(yīng)顯示自定義界面引導(dǎo)用戶點(diǎn)擊按鈕通過(guò)OpenAppSettings()跳轉(zhuǎn)到系統(tǒng)設(shè)置頁(yè)。在Unity編輯器中運(yùn)行正常打包到Android后權(quán)限相關(guān)代碼不執(zhí)行。條件編譯指令#if UNITY_ANDROID和#if !UNITY_EDITOR使用有誤或者AndroidManifest.xml未正確合并。檢查所有平臺(tái)相關(guān)代碼是否被正確包裹。在Player Settings中查看最終的合并后的Manifest文件構(gòu)建后可以在Temp目錄找到確認(rèn)權(quán)限聲明已存在。通知權(quán)限請(qǐng)求了但用戶收不到通知。1. 未在AndroidManifest.xml中聲明POST_NOTIFICATIONS。2. 在Android 13以下設(shè)備上沒(méi)有正確配置通知渠道Notification Channel。3. 發(fā)送通知的代碼邏輯有誤。1. 確認(rèn)清單文件已聲明該權(quán)限。2. 對(duì)于API 26的設(shè)備創(chuàng)建通知時(shí)必須指定有效的通知渠道ID。確保你的通知發(fā)送代碼如使用Unity.Notifications包正確創(chuàng)建了渠道。3. 檢查通知的標(biāo)題、內(nèi)容、圖標(biāo)等是否有效。權(quán)限回調(diào)OnPermissionRequestResult沒(méi)有被調(diào)用。PermissionCallbacks的事件訂閱可能因?yàn)閷?duì)象生命周期問(wèn)題被意外取消或者協(xié)程超時(shí)。確保PermissionCallbacks實(shí)例在場(chǎng)景中持久存在。在我們的封裝中AndroidPermissionManager是DontDestroyOnLoad的??梢赃m當(dāng)增加協(xié)程超時(shí)時(shí)間并添加更詳細(xì)的日志。一個(gè)更穩(wěn)健的方法是使用Android原生插件如UnityAndroidPermissions來(lái)獲得更可靠的回調(diào)。不同手機(jī)廠商小米、華為、OPPO等權(quán)限彈窗樣式或行為不一致。這是Android碎片化的典型問(wèn)題。廠商可能會(huì)修改權(quán)限對(duì)話框的UI甚至增加額外的“后臺(tái)彈出界面”等權(quán)限。進(jìn)行充分的真機(jī)兼容性測(cè)試。對(duì)于廠商特有的權(quán)限如自啟動(dòng)、電池優(yōu)化忽略需要在你的應(yīng)用內(nèi)增加額外的引導(dǎo)說(shuō)明告訴用戶如何手動(dòng)設(shè)置。這超出了標(biāo)準(zhǔn)權(quán)限API的范圍屬于“中國(guó)特色”的適配。6.3 一個(gè)實(shí)用的調(diào)試工具類在開發(fā)過(guò)程中可以創(chuàng)建一個(gè)簡(jiǎn)單的調(diào)試UI實(shí)時(shí)顯示所有關(guān)鍵權(quán)限的狀態(tài)。// PermissionDebugUI.cs using UnityEngine; using UnityEngine.UI; #if UNITY_ANDROID using UnityEngine.Android; #endif public class PermissionDebugUI : MonoBehaviour { public Text debugText; void OnGUI() { if (debugText ! null) { string status 權(quán)限狀態(tài) \n; #if UNITY_ANDROID status $Camera: {Permission.HasUserAuthorizedPermission(Permission.Camera)}\n; status $Microphone: {Permission.HasUserAuthorizedPermission(Permission.Microphone)}\n; // 檢查Android 13權(quán)限需要用到我們定義的常量 if (GetAndroidAPILevel() 33) { status $ReadMediaImages: {Permission.HasUserAuthorizedPermission(AndroidPermissionConstants.ReadMediaImages)}\n; status $PostNotifications: {Permission.HasUserAuthorizedPermission(AndroidPermissionConstants.PostNotifications)}\n; } else { status $ExternalStorage: {Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)}\n; } #endif debugText.text status; } // 在屏幕上畫幾個(gè)測(cè)試按鈕 if (GUI.Button(new Rect(10, 100, 200, 60), 請(qǐng)求相機(jī)權(quán)限)) { AndroidPermissionManager.Instance.RequestPermission(AndroidPermissionConstants.Camera, (granted) { Debug.Log($Camera: {granted}); }); } if (GUI.Button(new Rect(10, 170, 200, 60), 請(qǐng)求圖片權(quán)限)) { AndroidPermissionManager.Instance.RequestMediaPermission((granted) { Debug.Log($Image Permission: {granted}); }, MediaType.Image); } if (GUI.Button(new Rect(10, 240, 200, 60), 打開應(yīng)用設(shè)置)) { AndroidPermissionManager.Instance.OpenAppSettings(); } } private int GetAndroidAPILevel() { // ... 同前文 GetAndroidAPILevel 方法 return 0; } }踩過(guò)幾次坑之后我最大的體會(huì)是權(quán)限適配不是一次性任務(wù)而是一個(gè)持續(xù)的過(guò)程。每次Google發(fā)布新的Android版本都需要重新審視你的權(quán)限邏輯。將權(quán)限管理模塊化、服務(wù)化是應(yīng)對(duì)這種變化的最佳策略。本文提供的AndroidPermissionManager只是一個(gè)起點(diǎn)你可以根據(jù)自己項(xiàng)目的UI框架、日志系統(tǒng)和異常處理機(jī)制對(duì)其進(jìn)行增強(qiáng)。比如將權(quán)限請(qǐng)求與游戲內(nèi)的任務(wù)系統(tǒng)結(jié)合或者與數(shù)據(jù)分析平臺(tái)打通記錄用戶拒絕權(quán)限的比率和場(chǎng)景從而持續(xù)優(yōu)化你的權(quán)限請(qǐng)求策略最終的目標(biāo)是讓權(quán)限請(qǐng)求成為流暢用戶體驗(yàn)的一部分而不是令人反感的阻礙。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
看全色黄大色大片免费视频| 国产高清在线观看欧美| 91人妻视频| 欧美国产伊人久久久久| 中日韩一区二区三区欧美| 国产第二页| 91碰碰碰| 久久久精品视频免费观看| 亚洲综合大片| 国产馆极品诱惑| 日亚韩精品视频二区三| 99e久久国产精品| 色区97| 一区二区视频你懂的| 久久久久成人蜜桃精品| 日韩特级毛片免费观看全集| 日本视频在线中文字幕| 天天看夜夜看日日干| 国内亚洲精彩视频在线| 色噜噜综合在线| 精品无码产区一区二| 一级@啪啪视频| av天堂手机版追回| 搡老熟女国产1000部| 中文字幕精品一区二区精| 中文字幕av乱伦| 日本国产高清色www视频在线| 美女自卫慰黄网站免费| 性爱AV天堂| 日韩免费中文字幕视频| 久久久久久电影| 97超碰国产精品| 好吊色综合| 思思热免费视频观看| 91超碰人人| 91av熟女人妻| 97伪v| 日va操| www国产精品| 精品少妇一区二区三区免费观看| 国产精品懂色tv影视免费观看| 黄色小说亚洲| 美女一区二区国产精品| 激情五月天校园春色网| 五月天丁香| 黄色大片免费在线| 国产精品电| 久久草在线综合视频| 国产免费内射视频| 久久精品国产久精国产| 色婷婷网| 欧美αv.com| 久久中久文96| 欧美亚洲今日在线| 日日夜夜干| 国产无码精品成人| 国产熟女无套内射| 久久9999| jiujiujiujingpin| 刺激性视频黄页| 97av在线视频| 日本 欧美 国产一区| AV乱伦专区| 久久久久久九九九九九| 久九九九九九九九热| m欧洲一级午老| 久久久久久久极品香蕉视频| 中文伊人大香蕉视频| 91精品久久久久久77777| 国产网站在线播放| 久久国产视频性吧 | 韩国黄片aaaa| 九九热久久99精品re| 国语精品av| 久久久久久裸体| baiduhicn.com。| 色眯眯射| www被窝色com| 欧美,亚洲,日韩,v,天堂,手机在线观看| 超碰97人妻自拍| 亚洲成人一二三区| 国产有码一区| 蜜臀色乳| 蜜桃精品一区二区三区久在线| 欧美日韩亚洲电影| 色色毛片| www狠狠| 熟女人妻av在线资源,黄色的资源 粉嫩国产精品久久粉嫩 | 亚洲成人免费在线| 99热免费| 一区二区国产视频在线观看| 久9爱经典视频| 男人把坤坤插入女人的下体| 成人在线永久| 干妹子| 91狠狠| 日韩成人在线性爱视频| 亚洲色系另类精品国产| 色香色欲天天综合网天天来吧| 尤物黄色在线观看网站| 多乙久久久久久| 大屁股xxxxx| 综合久久六月久久婷婷| 久久人妻办公室视频| 日韩电影天堂视频一区二区| 国产夫妻一区二区| 99999国产| 思思热国产在线视频| 亚洲国产综合久久天堂| 亚洲nv男人的天堂网| 91女优在线观看| 伊人久久大香线蕉无码| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 曰韩无码777| 色婷婷综合久久中文字幕雪峰| 999久久芭蕾| 小草精彩毛片| 亚欧美色| 麻豆色99999| 91三级理论片播放器| 九九久久国产精品| 亚洲欧洲日本精品中文a∨| 国产99 中文字幕日韩小视频| 加勒比日本在线| 日韩性爱一级片| 丁香激情五月| 日逼国产| 久久欧洲| 91视频伊人| 97操97色| 国产高清26uuu| 亚洲欧洲色情高清| 久久毛卡| 超碰碰碰碰| 欧美熟妇视频| 国产精品ⅴ无码大片在线看.| 日本欧美韩国日产片片在线看免| 日本道不卡| 97人人中文网| 懂色AV蜜臀无码精品APP| 9久9久| 日本有码久久| 日韩免费看黄片| 欧美综合第一页| 日韩钢筋无码高清啾啾啾| 国产一区二区av综合| 老熟妇乱轮| 丝袜视频网国产90| 人妻内射一区二区在线视频| 日韩av乱伦| 欧美日韩国产成人高清| 久久综合久色欧美综合狠狠| 婷婷五月天色| 久久国产免费激情视频| 国产精品成人午夜福利| 国产女主播视频在线观看| 亚洲图片欧美91N| 香蕉在线一区二区三区| 五月丁香激情四射| 欧美亚洲综合999| 天天综合色电影| 亚洲日韩美女中文字幕乱| 老司机午夜精品视频| 99最新日韩偷拍视频| 大香蕉免| 丰满欧美少妇| 九一综合精品视品av| 自拍鲍鱼一区在线高清观看免费| 一级AV性爱| 大香蕉啪啪啪啪在线| 夜夜草网站| 蜜臀久久99精品久久久电影| 国产熟妇一区二区| 丝袜制服字幕在线| 精品少妇人妻av久久免费| 蜜臀久久99精品久久久久久成人小说 | 天天热精品| 欧美综合在线91| 男人的天堂.com| 国产黄a三级三级三级av在线看| 大奶啊啊好爽| 草b在线| 9超碰免费| 手机久操欧美综合色码| 欧美日韩另类字幕中文| 91 国产丝袜在线播放-百度| 久久熟女嫩草成人片免费| 久久久999国产| 精品人妻av区天天看片| 国产女大学生AV| 国产精品白丝在线播放| 男人女人18禁片免费看网站| 在线观看一级α片刺激高潮视频| 中文字幕第9页萱萱影音先锋| 黄片www视频免费| 亚洲国产成人精品999| 免费一级特黄特色大片在线观看看| 女欧美一区二三区| 黄片www.| 欧美色图 人妻| 亚洲日本天堂| 亚洲婷婷综合网| 国产午夜无码片在线观看影视| 国产激情在线观看| 69人妻精品丰满熟女区| 97在线观| 曰韩成人免费视频| 超碰久久草| 亚洲激情视频| 亚洲丝袜色| 中文字幕乱偷人妻久久艾草网| 国产一区在线观看无码AV | 青青草公开在线免费不卡视频| 日韩精品一区二区日韩| 久久 精品| 六月色色| 国产成人免费观看在线视频| 中文字幕福利视频一区二区三区在线观看| 无码一区二区三区四区五区六区七区八区九区十区视频 | 欧美性爱视频免费一区一A| www久久精品| 久久久久久久久久久久久久久性生活视频 | 久热99999| 日日日日日| 蜜乳视频网站| 国产馆| 亚洲码和欧洲精品激情系列| 一区二区日韩欧美久久| www黄片免费看com| 性91| 一本色道久久综合亚洲二区三区| 精品久久久九九九孕妇| 五月天婷婷色色| 日韩性爱免费视频在线网站| 囯产精品久久久久久久久久梁医生 | 国产熟女无套内射| 1024亚洲中文字幕久在线看片你懂的| 免费国产视频| 国产家庭乱伦表演| 麻豆国产视频精品观看| 欧美97超碰| 99re热| 午夜精品探花| 狼人狠干| 97香蕉网| 日韩性爱小视频| 激情五月天中文字幕色| 欧美乱伦专区| 91丝袜| 超碰九区| 一区二区三区国产在线播放 | 国产精品无码久久久久2028| 午夜视频久久久久一区| 18禁的网站在线| 2019天天干天天操 | 亚洲欧美校园另类春色| 草b在线| 日韩av熟女一区二区三区成人| 99色视频| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 无码精品一区二区三区潘金莲| 日本乱人伦片中文三区| 精品日韩中文在线| 中文字幕av亚洲精品| 欧美成人性爱视频在线播放| 极品尤物在线观看| 打av高清| 91少妇通奸网站| 91天天美女| 精品日韩人妻视频| 欧美很很操视频| 精品乱码久久久久| 99精品伊人| 亚洲天堂精品日韩电影| 超碰在线看| 国内外毛片在线观看| 97精品熟女少妇一区| 色狠人在线99| 亚洲欧洲自拍图片专区满春格| 99精品在线| julia国产在线 | 99精品久久久久久久婷婷蜜桃| 日韩欧亚太美不卡| 91狠狠综| 久操操| 国产AAAAAABBBBB| 91成人在线| 翔田千里爆乳巨臀无码| 91日日| 无码人妻精品一区二区中文| 欧美日韩一干二干| 96一区二区三区| 爱爱啊啊啊| 欧美情色贴图| 老外又粗又长一晚做五次| 超碰免费在线| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 国产不良强奸视频免费看| 99爱视频| 亚州综合色| 91狠狠色丁香婷婷综合久久| 欧美人妻熟女在线| 大香蕉综合网| 久久久青青草| 又大又白奶子| 久久精品久久久久久久| 欧美色图中文字幕| 91小视频| 91 丝袜在线播放| 97公开久久| 久久久一区二区三区四曲免费听| 91情色| 91女优在线观看| 翘臀vidoes| 欧美成人黄网色网站| 国产乱伦视频污| 亚洲高清男人天堂| 伊人国产av| 激情小说五月天| 少妇3P性爱自拍| 欧美亚洲激情| 嗯嗯不要 视频| 蜜臀99999| 国产伊人自拍| 久久香蕉影院| 欧美日韩性爱视屏免费看了| 美女淫穴| 操逼视频国产无套| 国产精品剧情| 欧美日韩大黄片| 5252色欧美在线男人的天堂| 91艹逼精品| 黄色小说亚洲| 国产欧美美女免费观看视频| 久久综合婷婷| 青青草操逼逼视频| 五月丁香婷婷色| 欧美精品久久久久久久久88| 国产 亚洲 丝袜 制服| 国产91乱伦| 一本精品日本在线视频精品| 国产美女口爆吞精视频| 香蕉欧美| 午夜激情成人在线观看| 欧美亚洲色图另类国产| 色官网色综合| 久久久久久久国产a∨| 亚洲免费成人在线高清无码视频| 综合久久少妇中文字幕| 操婢日韩| 草草网站影院白丝内射| www.99在线| 性爱久久| 99精品伊人| 亚洲青青草| 美女诱惑久久| 国产无码三级视频在线观看| 国产51色综合久久免费| 3p国产色噜噜一区| 久99久视频精选| AV一二区| 人人操人人操人人人操| 粉嫩av久久一区二区三区| 久久精品视频久久久| 精品在线78| 97超碰精品图片| 午夜操一操| 狠狠激情综合狠狠操中文字幕| 大香蕉伊人在线成人AV在线观看| 大香蕉狠狠爱| 少妇精品久久久| 亚洲国产成人精品无码专区| 91九九九吃| 人妻AV 中文字幕的| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 91蜜臀熟女| 日韩欧美~中文字| 国产精品4p在线观看| 欧美日韩高潮喷水91| 国产精品原创巨作?v网站| 亚洲欧美首页| av黄图片在线观看| 精品熟妇视频一区二区| 任你艹| 色999偷自拍拍| 操淫穴亚洲五月丁香 | 狠狠躁日日躁夜夜躁A| 五月情色天| 天天视频黄| 久久婷婷伊人| 五月婷久久| 九月丁香婷婷色| 91丨人妻丨国产丨丝袜| 91xingse| 狠狠色五月亚洲91| 嫩草一区二区在线观看| 91快色色色色色| 日韩欧美中文日韩欧美色| 太久视频| 国产成人91一区二区三区| 日日骚一区二区三区| 国产suv精品一区二区四区999 | 手机看片1025| 国产精品一二三免费网站| 日韩猛交| 精品久久久久久中文字幕三区 | 91免费看一区二区三区| 国模一区二区三区| 91 国产丝袜在线放观看| 97精品一区二区三区免费| 天天色综合图片| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 97欧美色综合| 四虎影视永久在线免费| 日韩av电影网站| 色色色欧美| 国产精品不卡高清在线观看| 欧美天堂超碰97| 黄片aaaaa一区| 天天综合官网| 亚洲熟妇乱女区二区三区| 怡红院成人视频| 激情露脸爱| 欧美日韩岛国大片在线观看| 91人人操| 中精品一区二区三区| 日本大片日本一区二区免费高清| 日本成人在线不卡一区二区三区| 伊人久久青青草| 亚洲 一区二区 自拍| 麻豆 美女 丝袜 人妻 中文| 日本999精品视频| www超碰| 日韩中文字幕精品一区在线| 欧美性性性| 国产精品ww久久| 一区二区三区高清天码| 91丨九色丨熟女高潮| 美日韩一二三区| 91成人精品在线播放| 亚洲第一色页夜| 夜夜爽夜夜高潮夜夜爽| 欧美白嫩女HD| 亚洲精品亚洲人成在线麻豆| 操人妻逼91| 久久侵犯人妻爽爽爽| 校园春色制服丝袜中文字亚洲| 久久999久| 免费男人的天堂| 一区二区中文| 日本高清免费一本视频在线观看| 欧美91精品国产自产| 秋霞久久亚洲精品成人| 九九热精品| 91伊人大香蕉| 午夜精品久久99蜜桃的功能章节| 探花激情视频| 蜜臀99久久精品| 眼镜人妻101.com| 九九人人操| 国产欧美一区二区| 国产精品视频| 日本一区二区亚洲综合| 日本99久久| 伊人操操| 琪琪精品免费一区二区三区| 久久久久久久久久久久久久久性生活视频| 超碰色美女| 曰韩人妻中文字幕在线| 精品大久久| 亚洲精品欧洲色| 中文字幕性感少妇av| 欧美在线综合| 国产女生在线| 日韩人妻精品| 牛黄色久午久| 久久久久久久久久久精| 国产AV超爽| 日日黄色三级网站| 人人操人人搞人人草| 国产传媒1234区| 国产成人 综合亚洲 天堂| 夜夜爽77777| 96一区二区| 久99热| 粉嫩av一区二区三区天美传媒| a级成人毛片免费视频高清| 九九自拍伦理| 青青草天天亲夜夜操网| 噜噜噜噜天天狠狠| 91操操| 国产捆绑一区| 精品久久久久黄少妇| 性色AV蜜色av色欲av| 夜夜高潮夜夜爽| 国产精品ⅴ无码大片在线看.| 欧美日韩免费专区在线| 看免费一级在线播放毛片| 五月天久久婷婷亚洲| 九月丁香婷婷色| 久久久久久少妇| 激情99| 日本中文字幕在线视频| 超碰97欧美日韩| 百度百度日本操逼| 日韩另类色图| 91超碰人人操| 精品九九九九九九| 国产 热久久久久国产精品| 人妻少妇精品久久久| 日本精品免费一区二区三区四区| 超碰人妻久久人妻中文97| B049AV在线播放| 亚洲综合嫩| 日本特黄f c2| 熟妇熟女一区二三区| 懂色Av一区二区三区| 国模吧 一区二区三区| 风间由美日韩欧美久久| 亚洲色色色| 亚洲第一页第二页激情| 四虎免费视频| 亚洲 欧美 中文 日韩超碰 | 精品久久人妻成人网| 91偷拍欧美亚洲| 亚洲激情在线观看一区| 好屌色综合| 综合色图亚洲欧美| 亚洲情色中文字幕一区| 麻豆天美91| 丝袜视频网国产90| 日日骚 av| 免费一级视频特黄色大片| 男人天堂网站| 超碰97男女| 天天看高清麻豆| 婷婷五月天影院| 日韩黄片影院| 欧美欧美啪啪视频| 91久久精品美女高潮喷水| 国产精品老熟女一区二区| 日本人妻最新在线中| 免费国产| 久日91在线| 亚洲天堂人妻熟妇视频| 美女让帅哥通她小鸡鸡| 夂久色| 欧美性爱91| 国产91精品在线免费| 亚洲熟久久| 9色在线| 免费一级毛片在线视频观看| 香伊人在线| 男人天堂网址| 久午视频| 97资源站日韩| 精品国产乱码久久久影院| 操b网站亚洲无码| 综合天天网| 国产后入精品| 操人无码| 六月丁香啪啪啪| 91九色精品熟女内射| 久久鲁干| 91天堂色男人的天堂| 国产久久av| 精品中文字幕一区二区| 一级岛国大片| 97在线视频观看网站| 人人人摸人人| 免费家庭乱伦视频| 日韩欧美午夜一区二区| 精品三级在线专区| 国产欧美日本亚洲精品| 999久久久免费精品国产牛牛| 欧美亚洲综合高清在线| 亚洲欧美另类图片| 91美女视频| 成人五月天丁香激情综合| 人人模人人看| 99这里只有精品国产| 久久久精品中文字幕爱豆| 色欧美亚洲| 欧美AAAA黄片| 风流老熟女一区二区三区l| 性爱边摸边日免费AV| 3P乱轮视频| 天美麻花大全视频| 日本人体九九九九九九| 天天操女人| 亚洲91网。| 亚州中文字幕超碰97| 秋霞一区二区三区四区五区六区七区| 蜜臀一二三| 综精品久久久aaaa| 日韩精品作爱导航| 91M一社| 男人久久天堂| 国模艳艳啪啪一区| 丁香五月激情综合| 亚洲瓯美色图| 亚洲se电影| 密臀在线一区尤物| 性暴力欧美猛交在线直播| 成人激情无码在线视频| 天天干美少妇一区| 91jk色拍| 青青草原成人| 九九综合九九综合| 免费看A片毛毛片在线播| 亚洲欧美精品91| 99www.bibizy香蕉资源国产一区二区三区高清 | 天天操妹子| 资源在线观一 二| 五月天婷婷久久| 亚洲欧美97| 人妻精品一区二区| 美国精品国产精品| 1024香蕉视频| 久久大精品乱码视频人妻熟女| 久久久久九九九九九| 欧美色图99| 日韩一区二区精彩视频| 五月婷婷色| 69AV女优男人的天堂| 亚洲区限制级 99| 另类图片综合| 69精品久久久久中文字幕| 国产精品一区二区三区在线密挑| 天天看高清麻豆| 欧美在线 亚洲| 成人一二| 欧美有码激情视频一区二区三区| 校园春色中文字幕AV| 久久专区| 无码自拍SM| 色色色色色色色色综合| 好色综合| 一区二区激情国产熟女 | 1769成人国产精品视频| 人妻熟女av国产网站| 超碰碰激情97+久| 九九九999久久久网站| 亚洲精品一区二区三区在线播放| 91九九九逼| 九九九九9999| 99在线免费视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 四虎视频在线观看| 日产操逼| 超碰亚洲欧美日韩无| 天天影视91看看| 99热18| 欧美日韩中国x| 久久久久亚洲?V片无码V| 爽爽爽免费视频| 91天天综合| 啊v视频在线观看| 一区二区亚州激情久婷婷欧美 | 亚洲吊色| 岛国黄| 日韩精品人妻中文字幕久久久| 校园春色综合网| 亚洲中文字幕噜噜噜久久久| 欧美淫乱视频| 亚欧精品久久久久久久久久久| 校园春色 亚洲| 国产AV久久久蜜爱影集| 99草精| 亚洲另类在线观看| 人妻精品一区二区| 自拍偷拍2025在线观看| 亚洲综合20p| 99热超碰| 免费看片黄| 新精精品久久精品| 欧美视频一区二区在线| 一本色道久久综合亚洲二区三区| 69少妇一区二区| 男人的天堂在线| 免费av大片| 亚洲一区二区av| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 999熟女精品| 日本黄 R色 成 人网站| 久久精品区| 精品免费一区二区三区在线亚洲人成| 天天插天天操| 夜夜国产一区| 五月婷婷AV| 青娱乐休闲视频在线观看| 亚洲自拍欧美国产首页网曝| 日本人妻丰满熟妇久久久久久 | 久久久久久久| 人妻美腿丝袜制服诱惑综合天堂-| 99久久久无码精品国产人| 欧美精品,四区。五区| 天天干天天做| ,成人免费啪啪视频| 偷拍综合亚洲| 免费a在线播放v| 校园春色综合网| 96久久久精品| 欧美天天插| 操逼无码一区| 97天堂| 狠操91,com| 校园春色亚洲欧洲| 99热日本| 亚洲精品国产专区在线观看| 熟女熟妇一区二区三四区 | 97在线观看视频| 午夜天堂精品久久久久91| 自拍内地三级在线观看| 欧成人在线| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 亚洲图片欧洲图片aⅴ| 91视频综合网| 97资源站久久| 亚洲国产精品久久久男人的天堂| 特级特黄一级毛片免费| 精品少妇高潮久久| 麻豆激情综合| 狠狠狠一区二区三区| 无码国产精品久久久久| 女性喷水高潮在线观看| 99re99在线视频| 一区二区三区在线日韩影院观看| 情色日播放AV| 日本三级大片| 无码在线亚洲| 久久毛卡| 国内精品久久人妻性色av| 欧美激情激情xxxx欧美专区| 国产精品农村妇女| 国产AV人人夜夜澡人人爽麻豆| 久日91在线| 亚洲综合888| 综合色播| 四虎在线免费视频| 亚洲有码第一页| 欧美真人抽搐一进一出gif| 色婷婷日韩精品一区二区三区| 神马久久久久久久久久| 日日干日日操五月天伦理视频| 亚洲色欲天天人妻无码系列专区| 久久久久久久亚洲Av无码| 成人一道本免费视频| 色网色网色网色网色网色| 1二区9| 久久99草| 国产妇女精品视频青青草| 欧亚不卡| 精品人妻一区春色| 成人片视频| 亚洲欧美一区二区不卡视频播放| 色婷婷六月| 天天爽天天| 婷婷五月天基地| 色婷五月天| 色狠狠综合噜一二三区| 久操B网| 在线天堂999| 欧美极品女人的天堂| 精品女人999| 青青青国产| 中文字幕视频在线观看一区二区| 成人综合网 欧美| 东京成人一区| 东京热熟女亚洲视频网站| 啊啊啊好疼| 国产白丝网站| 久久一二三四| 国产一二三在线视频五十路| 亚洲成人贴图| 8x福利精品第一福利视频导航| 国产黄片精品在线| 五月天婷婷激情| 99自拍B亚洲 | 丁香色五月 97干| 久妇网| 久操 高清| 热久久无毒不卡| 激情欧美97| 强奸乱伦免费网站| 在线人人人人人人精品超| 国产女人操逼视频| 天天插天天干| 欧美 日韩 国产传媒| 亚洲天堂美臀在线| 秋霞午夜成人福利片片| 国产精品久久久久久久AV大片| α√在线| 欧美天堂日韩三级国产传媒| 日本黄色XXX| 日本成人在线不卡一区二区三区| 日本一区二区不卡| 日韩人妻播放| 大香蕉操久久| 自拍视频大全亚洲专媒视频/一区二区三区| 欧美精品偷拍| 天天干人人乐| 看免费的黄片| 五月丁香影院| 久久综合av| 亚洲交性| 国产 日韩 欧美高清| 色婷婷成人| 欧美97日韩精品| 60秒不遮不挡| 五月天激情四射| 九九夜精品九九在线| 麻豆av一区二区| 97在线精品观看视频| 一区二区 韩日AV| 色麻豆AV| 尤物网址| 中文字幕丝袜美腿| 另类欧美综合| 日本熟女不卡视频| 97自拍视频在线| 屁股久久久久久久久| 久久性爱视频免费看| 婷婷亚洲天堂| 东京热大香焦| 国产一区二区三区白丝| 久久中文色图| 国产 日韩 欧美一区| 欧美成不卡网| 亚洲色婷婷久久91| 国产乱码久久| 丰满人妻一区二区三区四区| A 天堂在线观看视频| 亚洲天天影视色综合| 色色色日本| 日韩av三四区| 在线小视频| 国产日韩区| 丝袜综合色图| 少妇被c 黄 免费观看| 亚洲国产精品无石码久久 | 亚洲乱伦图片视频| 久操 高清| av黄图片在线观看| 男人的天堂不卡一区二区| 密臀在线一区尤物| 中文字幕在线日亚州9| 91视频综合在线| 欧美性爱在线无码| 91女优在线观看| 亚洲免费成人在线高清无码视频| 大香蕉99热| 人人操,人人插| 欧美性暴力猛交XXXX | 五月激情小说| 欧美色图电影| 欧美激情综合色综合啪啪五月| 久久久久久久久女黄| 韩日色费| 美女干逼2| 九九热AV| 福利视频合集| 涩爱AV在线| 青娱乐999| 和协无码影院| 久草视频观看视频在线| 国产精品另类一区大香蕉| 91在线无码精品秘 软件| 日韩中文字幕精品一二三事国产精品| 亚州操逼图| 欧美最婬乱婬爆婬牲视频| 欧美啪啪女女| 日日干夜夜欢| 精品一区二区三区蜜桃臀赵总| 上特色A在线| 精品美女在线视频| 色青青久久影视| 97视频免费播放| 欧美亚洲第1页| 一区二区三区成人高清视频| 2017大香蕉国产精品久久| 五月天久久综合网| 97欧美色综合| 婷色五月天| 蜜乳AV.COM| 久久人妻熟女一区二区| 久久9精品视频| 超97在线精品视频| 中文字幕欧美丝袜07资源| 内射黑人| 国产超碰| 国产乱色国产精品免费视| 色香91| 国产成人精品亚洲日本| 97欧美精品| 欧美在线综合| 后X久久| 综合操逼| 日韩免费一级性爱视频| 欧美性第1页| 久操精品网| 国产精品久久久久久久久久梁医生| 伊人网在线点播| 亚洲色图加勒比| 国内三级自拍小视频在线观看| 久久这里只精品免费福利| 天天日天天干天天摸天天操| 国产白嫩精品久久| 久草免费福利在线播放| 国产精品999aaa| 欧美九一精品久久久熟妇| 91一区二区| 强奸乱伦Av网| 高清有码一区二区| 9999伦理视频| www久| 高清无码 国产精品| 无码国产精品96久久久久孕妇| 99999亚洲另类| 97在线观看免费视频l| 久草成人福利导航| 综合激情婷婷| AV污污污污| 国产精品久久妻无码网站| 亚洲色电影在线| 免费97视频| laoshunv91| 18一区二区三区| 久久精彩视频| 天天日少妇逼AV| 日韩欧美经典在线观看| 亚洲日韩美国人妻| 欧美αv.com| 国产家庭乱伦表演| 国产精品白丝| 麻豆成人影音在线| 色欧美在线| 91热色| 加勒比人妻综合| 无码视频一区二区| 99爱久久视频频| 日韩欧美视频青青| 东北丰满熟女国产一区 | 99操逼| 操逼网站地址| 熟女人妻一区二区三区| 亚洲国产尤物yw在线观看| 偷拍视频青青草在线视频| 91亚洲黄色网| 884t在线| 久久久久久久久九九久孕交| 欧美熟妇视频| 久久理论字幕视频| 欧洲无码一区二区| 色综合91| 9九九九九视频在线观看| 五月花婷婷| 无码乱人伦中文视频| 久久久久久亚洲Av无码| 欧美人妻精品一区二区| 综合操逼| 777奇米影视777四色| 激情啪啪拍91| 日韩中文欧美| 综合五月天| 成人影 天天操 亚洲| 97这里都是精品| 最新av在线| 91日产桃蜜| 亚洲熟女av中文字幕| 亚洲网站一区二区在线| 国产精品久久久久无码A√| 欧美综合娱乐久久| 国产女人成人精品视频| 无码聚合| 丁香五月天社区| 男人的天堂2018.| 久久久久久夜夜夜夜夜| 九一综合精品视品av| 天天干天天日天天射黄色| 久久精品国产精品亚洲艾通辽熟妇| 中文一区二区婷婷视频| 亚洲美女30b| 人人摸人人舔一区二区| 91n处女在线观看| yiqicaoav| 人妻丰满熟妇一区二区三| 日本操BAV| 91无码中出人妻视频| 日韩天堂av电影在线观看| 一级免费精品| 国产v亚洲v日韩v欧美v片另类| 蜜乳av一区二区| 太久视频| oumeisetu综合| 噜噜噜亚洲精品| 日韩av情韩国爱禁区av一区二区| 美女网站91| 国产性久久久| 日韩欧美综合激情| 激情婷婷丁香| 91丝袜激情在线| 人妻精品一区一区三区蜜桃91| 色香欲影| 91精品无码人妻系列| 婷婷五月天色色| 神马午夜久久久| 抽插一区二区视频| a男人的天堂久久一级A毛片| 国产午夜无码片在线观看影视 | 91激情国产| 久久在线观看免费视频| 粉嫩在线一区二区懂色| 无码久| 久操视频在线观看| 天堂中文资源在线bt| 怡春苑东京热| 淫荡网址| 国产亚洲精品第一最新| 午夜福利免费福利视频| 蜜臀99久| 在线看的av| 美女97超碰| 久久精品一区二区三区四区五区| 中文字幕aⅴ在线视频| 日韩有码免费视频| 麻豆区久久久久亚| 国产日韩色综合| 欧美熟爽综合| 亚洲av青草久久一区二区| 噜噜吧,噜噜色,噜噜| 亚洲综合九| 91精品婷婷国产综合久久| 久久午夜鲁丝片| 97蜜桃综合| 精品日日人妻| 国产精品美女视频诱惑| 五月天开心网| JuliaAnnXXX888| 日韩精品碰碰| 日韩精品9999| 91人精品妻入口| 嗯嗯啊啊视频在线看| 大香蕉之青青草原| 在线强奷到舒服的无码视频| 制服少妇欧美| 亚洲av性爱电影| 天天综合影院91| www.亚洲黄色| 国产乱弄免费在线视频。| 日韩av在线精品观看| 中文字幕视频一区视频二区| 熟女探花啪啪| 亚射在线| 国产综合在线视频网站| ..日韩av毛片精品久久久| 日韩 欧美 视频 在线 一区| 风月影院十八禁| 欧美色图小说综合| 欧姜老司机| 亚洲成人免费中文字幕| 亚洲诱惑| 国产精品一区二区a| 五月丁香啪啪啪| 最近二区三区视频大全| 大奶啊啊好爽| 四虎影视 亚洲无码| 婷色五月天| 97视频网站| 撸撸成人在线视频| 色视频蜜乳| 26uuu性| 乱伦色图网址是多少| 美女尤物福利视频| 日本性感人妻91| 熟女天天干| 乱伦日本色图AⅤ| 人妻天天爽| 亚洲欧美综合区自拍另类| 97色色国产视频| 91社区拍啪人妻| 抽插亚洲无码| 日本三级韩三级99久久| 97超碰9| 嗯嗯啊啊啊好舒服| 免费99精品国产自在在线| 亚洲色91| 爱爱啊啊啊| 97九色人妻| 看免费的黄片| 久久久96精品| 青草青青久久久久久国产| 人妻少妇精品| 躁躁日曰躁2020| 色汉综合| 日韩乱伦视频| 成人热久久精品| 欧美一区二区亚洲天堂| 精品人妻一区二区三区在| 色色色色色色色色综合| 五月色网| 五月丁香黄色网| 97超碰免费人人性爱| 国产成人网站在线观看| 91丝袜在线观看| 久久视频,这里只有精品| 天天干天天插| 国产高清无码一区三区二区| 超碰99在线| 小骚逼被操的爽不爽| 五月婷在线| 亚洲精品人妻在线| 大香蕉综合网| 国产精品97超碰| 少妇毛片久久| 无码视频黄色网战| 偷拍亚洲熟女视频播放| 欧美色91| 欧美色图成人网一区二区| 97人人射| 午夜电影在线观看无码专区| 久久、1234| 久久大香蕉手机高清视频| 91人妻尻屄视频| 91成人无码| 亚洲a色| 天天天天天天天天综合| 色性综合| 99热综合| 黄色高清无码无码破解免费暗网| 久久精品国产AV一区二区三区| 亚洲精品97| 九九碰九九爱97超碰| 2017天天操天天日| 97 国产精品| 99热在线只有精品| 色yeye成人免费视频| 亚洲AV成人无码一二三久久| 日韩猛交| 91丝袜美女视频| 97 色综合| 加勒比aⅴ| 日韩一二三区| 久久人妻| 少妇特黄一区二区三区| 欧美亚洲美少妇一区二区| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 无码视频一区二区| 绯色AV粉色AV蜜臀AV| av天堂手机版追回| 91殴美| 国产这里只有精品| 一级啊性爱在线视频| 92人人操人人| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 中文字幕91综合| 口爆欧美91| 一直超碰| 亚洲性感丝袜诱惑在线观看| 九九九只有精品|