uniapp AndroidiOS 定位權限檢查

定位權限檢查

// 檢查定位權限狀態
export const checkPermission = () => {const platform = uni.getSystemInfoSync().platform;console.log('platform', platform)// #ifdef APP-PLUSif (platform === 'android') {// Androidreturn checkAndroidPermission();} else if (platform === 'ios') {// iOSreturn checkIOSPermission();}// #endif
};/*** 獲取Android定位權限狀態* @returns {Promise<string>} 返回權限狀態:*   'granted_always' - 始終允許*   'granted_when_in_use' - 僅在使用時允許 (Android 10+)*   'denied' - 已拒絕*   'denied_forever' - 拒絕且不再詢問*/
// Android 檢測權限
export const checkAndroidPermission = () => {return new Promise((resolve) => {// #ifdef APP-PLUS// 0-引導 1-允許 2-設置const main = plus.android.runtimeMainActivity();const ActivityCompat = plus.android.importClass('androidx.core.app.ActivityCompat');const PackageManager = plus.android.importClass('android.content.pm.PackageManager');const Manifest = plus.android.importClass('android.Manifest');const ContextCompat = plus.android.importClass('androidx.core.content.ContextCompat');// 檢查是否已授權const hasFineLocation = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED;const hasCoarseLocation = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_COARSE_LOCATION) === PackageManager.PERMISSION_GRANTED;if (!hasFineLocation && !hasCoarseLocation) {// 如果完全沒有權限,檢查是否被永久拒絕console.log("Android 權限被拒絕")resolve(2);return;}// 如果有權限,檢查是否是"始終允許" (Android 10+)if (plus.os.version >= 10) {const AppOpsManager = plus.android.importClass('android.app.AppOpsManager');const appOps = main.getSystemService('appops');const mode = plus.android.invoke(appOps,'checkOpNoThrow',AppOpsManager.OPSTR_FINE_LOCATION,main.getApplicationInfo().uid,main.getPackageName());// 處理可能的null返回值if (mode === null) {console.warn('checkOpNoThrow返回null,降級檢查運行時權限');const hasPermission = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED;console.log("降級檢查運行hasPermission", hasPermission)resolve(hasPermission ? 1 : 2);return;}console.log("Android===mode", mode)switch (mode) {case 0: // MODE_ALLOWEDconsole.log('始終允許定位');resolve(1);break;case 4: // MODE_FOREGROUNDconsole.log('僅允許前臺定位');resolve(1);break;case 1: // MODE_IGNOREDconsole.log('已拒絕但可再次請求');resolve(1);break;case 2: // MODE_ERROREDconsole.log('已永久拒絕需手動設置');resolve(2);break;default:console.log('其他狀態', mode);}} else {// Android 9及以下無法區分"始終允許"和"僅在使用時允許"console.log("Android 權限始終允許")resolve(1);}});// #endif
}// iOS 檢測權限
export const checkIOSPermission = () => {console.log('iOS 檢測權限');return new Promise((resolve, reject) => {// #ifdef APP-PLUSconst cllocationManger = plus.ios.import('CLLocationManager');const status = cllocationManger.authorizationStatus();const enable = cllocationManger.locationServicesEnabled();// 0-引導 1-允許 2-設置// status 含義:// 0: 未決定(kCLAuthorizationStatusNotDetermined)// 2: 已拒絕(kCLAuthorizationStatusDenied)// 3: 始終允許(kCLAuthorizationStatusAuthorizedAlways)// 4: 僅使用時允許(kCLAuthorizationStatusAuthorizedWhenInUse)console.log('status', status);if (!enable) {resolve(2);} else if (status === 2) {// 拒絕resolve(2);} else if (status === 4) {// 僅使用時允許resolve(0);} else if (status === 3) {// 未決定resolve(1);} else {resolve(0);}plus.ios.deleteObject(cllocationManger);// #endif});
};// 權限請求
export const getAndroidLocation = () => {return new Promise((resolve, reject) => {plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION'],(result) => {console.log('android,', result);// 0-引導 1-允許 2-設置if (result.granted.length) {console.log('Android 已授予定位權限');resolve(1);} else if (result.deniedAlways.length) {// 拒絕,跳轉系統設置console.log('Android 已拒絕定位權限');resolve(2);} else {resolve(0);}},(error) => {console.log("Android 檢測權限---err", error)reject(error);});})
}

使用

		if (check) {// #ifdef APP-PLUScheckPermission().then(async code => {uni.setStorageSync("locationPermissions", true);console.log("code", code)// 0-引導 1-允許 2-設置if (code === 0) {console.log("權限引導")} else if (code === 1) {console.log("允許");} else if (code === 2) {console.log("跳轉權限設置")}}).catch((err) => {console.log("報錯", err)uni.showModal({content: '檢測權限失敗,請確認是否打開GPS,再重啟APP',showCancel: false,confirmText: "去開啟",success(res) {uni.openAppAuthorizeSetting()}})})}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913924.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913924.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913924.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解Java虛擬機(JVM):從內存管理到性能優化

深入理解Java虛擬機&#xff08;JVM&#xff09;&#xff1a;從內存管理到性能優化 目錄 引言JVM架構概述 1. 類加載器&#xff08;Class Loader&#xff09;2. 運行時數據區&#xff08;Runtime Data Areas&#xff09;3. 執行引擎&#xff08;Execution Engine&#xff09;…

PHP SimpleXML:深入理解與高效使用

PHP SimpleXML:深入理解與高效使用 引言 PHP SimpleXML 是一個用于解析和操作 XML 文檔的庫。它簡化了 XML 的處理過程,使得 PHP 開發者可以更加輕松地與 XML 數據交互。本文將深入探討 PHP SimpleXML 的基本概念、使用方法以及在實際開發中的應用。 SimpleXML 簡介 Simp…

雙模秒切,體驗躍遷!飛利浦EVNIA雙模游戲顯示器27M2N6801M王者降臨!

當沉浸式畫質與電競級流暢無法共存&#xff0c;EVNIA Mini LED雙模游戲顯示器27M2N6801M以破界之姿革新而來&#xff01;全新搭載 4K160Hz / FHD320Hz雙模顯示引擎&#xff0c;將視覺震撼與操作跟手性推向全新高度。心念所動間&#xff0c;即可在電影級3A世界與分秒必爭的電競戰…

Transformer:自注意力驅動的神經網絡革命引擎

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 從語言理解到多模態智能的通用架構基石 ?? 一、核心定義與歷史意義 …

汽車電子電氣架構中的關鍵計算單元解析

汽車電子電氣架構正經歷從分布式到集中式的重大變革&#xff0c;ECU、域控制器、中央計算單元等計算設備在這一演進過程中扮演著不同角色。這些設備按功能層級可分為傳統控制層、域集中層和中央計算層&#xff0c;各自承擔特定計算任務&#xff0c;共同構成智能汽車的"大腦…

Pandas 學習(數學建模篇)

今天學習數學建模2023年C篇&#xff08;228&#xff09;優秀論文 2023高教社杯全國大學生數學建模競賽C題論文展示&#xff08;C228&#xff09; - 2023C題論文 - 中國大學生在線 一.pd.DataFrame pd.DataFrame() 是 pandas 庫中用于創建二維表格數據結構&#xff08;DataFr…

第七講:C++中的string類

目錄 1、認識string類 2、標準庫中的string類 2.1、string類的常見接口 2.1.1、構造與賦值重載 2.1.2、迭代器 2.1.3、容量 2.1.4、訪問 2.1.5、修改 2.1.6、字符串操作 2.1.7、成員常量 2.1.8、非成員函數 2.1.9、轉換函數 2.2、vs和g下的string 2.2.1、vs下的s…

elementUI 前端表格table數據導出(一)

為啥前端導出不在贅述了第一步&#xff1a;安裝xlsxnpm install xlsx第二步&#xff1a;創建js文件html2excelimport * as XLSX from xlsx;const htmlToExcel {getExcel(dom, title temp){var excelTitle title;// const XLSX require("xlsx");var wb XLSX.util…

LabVIEW 波形圖表橫坐標顯示當前日期

LabVIEW 程序如何實現波形圖表橫坐標顯示當前日期一、XY Graph 時間關聯邏輯&#xff08;右上角分支&#xff09;功能本質實時采集當前系統時間&#xff08;秒數形式&#xff0c;基于 1904 基準&#xff09;&#xff0c;直接映射為 XY Graph 的 X 軸時間標識&#xff0c;實現動…

Android Soundtrigger喚醒相關時序學習梳理

本文所寫內容是在高通芯片平臺相關代碼基礎上學習整理匯總&#xff0c;如有描述不當之處&#xff0c;歡迎指正&#xff01;1、SoundTrigger注冊喚醒監聽事件回調流程&#xff08;SoundTrigger HAL層到ADSP層&#xff0c;不包括FWK層&#xff09;//(1)SoundTriggerSession 回調 …

OSPF實驗以及核心原理全解

OSPF&#xff08;Open Shortest Path First&#xff0c;開放式最短路徑優先&#xff09;是一種基于鏈路狀態的內部網關協議&#xff08;IGP&#xff09;&#xff0c;廣泛應用于中大型網絡中。它通過維護網絡拓撲信息&#xff0c;使用 SPF&#xff08;最短路徑優先&#xff09;算…

Using Spring for Apache Pulsar:Transactions

本節介紹Spring for Apache Pulsar如何支持事務。OverviewSpring for Apache Pulsar事務支持是基于Spring Framework提供的事務支持構建的。在高層&#xff0c;事務資源向事務管理器注冊&#xff0c;事務管理器反過來處理注冊資源的事務狀態&#xff08;提交、回滾等&#xff0…

在Ubuntu上從零開始編譯并運行Home Assistant源碼并集成HACS與小米開源的Ha Xiaomi Home

目錄1. 前言&&疊甲2. 使用的環境3. 相關鏈接4. 前期步驟4.1 安裝路徑提前說明4.2 Ubuntu 相關依賴安裝4.3 Python源碼編譯安裝4.3.1 編譯安裝4.3.2 換源4.3.3 環境變量5. 構建Home Assistant源碼5.1 clone源碼5.2 創建虛擬Python環境5.3 安裝項目依賴5.4 安裝項目5.5 運…

【實習篇】之Http頭部字段之Disposition介紹

Http頭部字段之DispositionDisposition頭部字段介紹RFC規范介紹RFC 6266與RFC 2047實習的時候公司將一個某個關于下載的Bug交給了我來修&#xff0c;看了代碼和日志后發現是Disposition字段的規范兼容性惹的鍋&#xff0c;因為有些協議使用的是老協議&#xff0c;我們的項目沒有…

VM文件管理與Vi/vim操作

[rootlocalhost /]# sudo mkdir /opt [rootlocalhost /]# sudo mkdir /opt/tmp [rootlocalhost /]# sudo touch /opt/tmp/a.txt [rootlocalhost /]# ls /opt/tmp/ a.txt [rootlocalhost /]# 3.步驟1&#xff1a;創建文件并插入日期時間vi /tmp/newfile在vi編輯器中輸入以下命令…

【Android】安卓四大組件之內容提供者(ContentProvider):從基礎到進階

你手機里的通訊錄&#xff0c;存儲了所有聯系人的信息。如果你想把這些聯系人信息分享給其他App&#xff0c;就可以通過ContentProvider來實現。。 一、什么是 ContentProvider ?ContentProvider? 是 Android 四大組件之一&#xff0c;負責實現?跨應用程序的數據共享與訪問…

Vue-19-前端框架Vue之應用基礎組件通信(二)

文章目錄 1 v-model(父子相傳)1.1 App.vue1.2 Father.vue1.2.1 v-model用在html標簽上1.2.2 v-model用在html標簽上(本質寫法)1.2.3 v-model用在組件標簽上1.2.4 v-model用在組件標簽上(本質寫法)1.3 MyInput(自定義的組件)1.4 修改modelValue1.4.1 Father.vue1.4.2 MyInput.vu…

寶塔下載pgsql適配spring ai

1.寶塔安裝pgvector 1.先去github下載pgvectorpgvector/pgvector: Open-source vector similarity search for Postgres 2.把壓縮包上傳到系統文件的/temp下解壓&#xff0c;重命名文件名為pgvector&#xff0c;之后命令操作 cd /tmp cd pgvector export PG_CONFIG/www/serv…

RK3568項目(八)--linux驅動開發之基礎外設(上)

目錄 一、引言 二、準備工作 ------>2.1、驅動加載/卸載命令 三、字符設備驅動開發 ------>3.1、驅動模塊的加載和卸載 ------>3.2、外部模塊編譯模板 Makefile ------>3.3、cdev 四、LED驅動 ------>4.1、原理圖 ------>4.2、驅動 五、設備樹 -…

BUUCTF在線評測-練習場-WebCTF習題[GXYCTF2019]BabySQli1-flag獲取、解析

解題思路打開靶場&#xff0c;題目提示是sql注入輸入數據&#xff0c;判斷下閉合11123報錯&#xff1a;Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 1 at line 1報錯提示…