uni-app app端安卓和ios如何申請麥克風權限,喚起提醒彈框

代碼包含功能如下:
1、判斷推送權限是否開啟
2、判斷定位權限是否開啟
3、判斷麥克風權限是否開啟
4、判斷相機權限是否開啟
5、判斷相冊權限是否開啟
6、判斷通訊錄權限是否開啟
7、判斷日歷權限是否開啟
8、判斷備忘錄權限是否開啟
9、Android權限查詢
10、檢查系統的設備服務是否開啟
廢話不多說上代碼

/*** 本模塊封裝了Android、iOS的應用權限判斷、打開應用權限設置界面、以及位置系統服務是否開啟*/var isIos
// #ifdef APP-PLUS
isIos = (plus.os.name == "iOS")
// #endif// 判斷推送權限是否開啟
export function judgeIosPermissionPush() {var result = false;var UIApplication = plus.ios.import("UIApplication");var app = UIApplication.sharedApplication();var enabledTypes = 0;if (app.currentUserNotificationSettings) {var settings = app.currentUserNotificationSettings();enabledTypes = settings.plusGetAttribute("types");console.log("enabledTypes1:" + enabledTypes);if (enabledTypes == 0) {console.log("推送權限沒有開啟");} else {result = true;console.log("已經開啟推送功能!")}plus.ios.deleteObject(settings);} else {enabledTypes = app.enabledRemoteNotificationTypes();if (enabledTypes == 0) {console.log("推送權限沒有開啟!");} else {result = true;console.log("已經開啟推送功能!")}console.log("enabledTypes2:" + enabledTypes);}plus.ios.deleteObject(app);plus.ios.deleteObject(UIApplication);return result;
}// 判斷定位權限是否開啟
export function judgeIosPermissionLocation() {var result = false;var cllocationManger = plus.ios.import("CLLocationManager");var status = cllocationManger.authorizationStatus();result = (status != 2)console.log("定位權限開啟:" + result);// 以下代碼判斷了手機設備的定位是否關閉,推薦另行使用方法 checkSystemEnableLocation/* var enable = cllocationManger.locationServicesEnabled();var status = cllocationManger.authorizationStatus();console.log("enable:" + enable);console.log("status:" + status);if (enable && status != 2) {result = true;console.log("手機定位服務已開啟且已授予定位權限");} else {console.log("手機系統的定位沒有打開或未給予定位權限");} */plus.ios.deleteObject(cllocationManger);return result;
}// 判斷麥克風權限是否開啟
export function judgeIosPermissionRecord() {var result = false;// ios 判斷if (isIos) {var avaudiosession = plus.ios.import("AVAudioSession");var avaudio = avaudiosession.sharedInstance();var permissionStatus = avaudio.recordPermission();console.log("permissionStatus:" + permissionStatus);if (permissionStatus == 1970168948) {console.log("麥克風權限沒有開啟");/**    * 申請麥克風權限 requestRecordPermission    * 調用入參:handler回調函數(無回調結果)   *   * 當權限狀態為:1970168948用戶未作出選擇時,調用此方法系統會彈出提示框讓用戶確認授權    * 當權限狀態非:1970168948時,只能跳轉到系統設置界面,讓用戶手動開啟,使用plus.runtime.openURL("app-settings://");跳轉,或者gotoAppPermissionSetting(參考插件https://ext.dcloud.net.cn/plugin?id=594)    */    avaudio.requestRecordPermission(()=>{  console.error('回調完成');});// plus.device.beep(1);result = false;} else if(permissionStatus == 1684369017){uni.showModal({title: '提示',content: '需要麥克風權限才能使用錄音功能,是否去設置開啟?',success: function(res) {if (res.confirm) {// gotoAppPermissionSetting();plus.runtime.openURL("app-settings://");}}});result = false;} else {result = true;console.error("麥克風權限已經開啟");}plus.ios.deleteObject(avaudiosession);} else {var PackageManager = plus.android.importClass("android.content.pm.PackageManager");var main = plus.android.runtimeMainActivity();var checkPermission = main.checkSelfPermission("android.permission.RECORD_AUDIO");if(checkPermission == PackageManager.PERMISSION_GRANTED) {console.log("麥克風權限已經開啟");result = true;} else {console.log("麥克風權限沒有開啟");plus.android.requestPermissions(['android.permission.RECORD_AUDIO'], function(e) {if (e.deniedAlways.length > 0) {  // 權限被永久拒絕  //用戶沒有選擇竟然也是跟永久拒絕返回的參數一樣(暫時無解),微信也是這樣做的console.log('永久拒絕!' + e.deniedAlways.toString());uni.showModal({title: '提示',content: '需要麥克風權限才能使用錄音功能,是否去設置開啟?',success: function(res) {if (res.confirm) {gotoAppPermissionSetting();}}});result = false;} else if (e.deniedPresent.length > 0) {  // 權限被臨時拒絕console.log('臨時拒絕!' + e.deniedPresent.toString());result = false;} else if (e.granted.length > 0) {  // 權限被允許console.log('已授權!' + e.granted.toString());result = false;} else { console.log('未做選擇');result = false;}}, function(e) {console.log('請求權限錯誤:' + JSON.stringify(e));result = false;});}}console.error("語音授權結果-----------", result);return result;
}// 判斷相機權限是否開啟
export function judgeIosPermissionCamera() {var result = false;var AVCaptureDevice = plus.ios.import("AVCaptureDevice");var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');console.log("authStatus:" + authStatus);if (authStatus == 3) {result = true;console.log("相機權限已經開啟");} else {console.log("相機權限沒有開啟");}plus.ios.deleteObject(AVCaptureDevice);return result;
}// 判斷相冊權限是否開啟
export function judgeIosPermissionPhotoLibrary() {var result = false;var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");var authStatus = PHPhotoLibrary.authorizationStatus();console.log("authStatus:" + authStatus);if (authStatus == 3) {result = true;console.log("相冊權限已經開啟");} else {console.log("相冊權限沒有開啟");}plus.ios.deleteObject(PHPhotoLibrary);return result;
}// 判斷通訊錄權限是否開啟
export function judgeIosPermissionContact() {var result = false;var CNContactStore = plus.ios.import("CNContactStore");var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);if (cnAuthStatus == 3) {result = true;console.log("通訊錄權限已經開啟");} else {console.log("通訊錄權限沒有開啟");}plus.ios.deleteObject(CNContactStore);return result;
}// 判斷日歷權限是否開啟
export function judgeIosPermissionCalendar() {var result = false;var EKEventStore = plus.ios.import("EKEventStore");var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);if (ekAuthStatus == 3) {result = true;console.log("日歷權限已經開啟");} else {console.log("日歷權限沒有開啟");}plus.ios.deleteObject(EKEventStore);return result;
}// 判斷備忘錄權限是否開啟
export function judgeIosPermissionMemo() {var result = false;var EKEventStore = plus.ios.import("EKEventStore");var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);if (ekAuthStatus == 3) {result = true;console.log("備忘錄權限已經開啟");} else {console.log("備忘錄權限沒有開啟");}plus.ios.deleteObject(EKEventStore);return result;
}// Android權限查詢
export function requestAndroidPermission(permissionID) {return new Promise((resolve, reject) => {plus.android.requestPermissions([permissionID], // 理論上支持多個權限同時查詢,但實際上本函數封裝只處理了一個權限的情況。有需要的可自行擴展封裝function(resultObj) {var result = 0;for (var i = 0; i < resultObj.granted.length; i++) {var grantedPermission = resultObj.granted[i];console.log('已獲取的權限:' + grantedPermission);result = 1}for (var i = 0; i < resultObj.deniedPresent.length; i++) {var deniedPresentPermission = resultObj.deniedPresent[i];console.log('拒絕本次申請的權限:' + deniedPresentPermission);result = 0}for (var i = 0; i < resultObj.deniedAlways.length; i++) {var deniedAlwaysPermission = resultObj.deniedAlways[i];console.log('永久拒絕申請的權限:' + deniedAlwaysPermission);result = -1}resolve(result);// 若所需權限被拒絕,則打開APP設置界面,可以在APP設置界面打開相應權限// if (result != 1) {// gotoAppPermissionSetting()// }},function(error) {console.log('申請權限錯誤:' + error.code + " = " + error.message);resolve({code: error.code,message: error.message});});});
}// 使用一個方法,根據參數判斷權限
export function judgeIosPermission(permissionID) {if (permissionID == "location") {return judgeIosPermissionLocation()} else if (permissionID == "camera") {return judgeIosPermissionCamera()} else if (permissionID == "photoLibrary") {return judgeIosPermissionPhotoLibrary()} else if (permissionID == "record") {return judgeIosPermissionRecord()} else if (permissionID == "push") {return judgeIosPermissionPush()} else if (permissionID == "contact") {return judgeIosPermissionContact()} else if (permissionID == "calendar") {return judgeIosPermissionCalendar()} else if (permissionID == "memo") {return judgeIosPermissionMemo()}return false;
}// 跳轉設置 跳轉到**應用**的權限頁面
export function gotoAppPermissionSetting() {if (isIos) {var UIApplication = plus.ios.import('UIApplication')var application2 = UIApplication.sharedApplication()var NSURL2 = plus.ios.import('NSURL')// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");var setting2 = NSURL2.URLWithString('app-settings:')application2.openURL(setting2)plus.ios.deleteObject(setting2)plus.ios.deleteObject(NSURL2)plus.ios.deleteObject(application2)} else {// console.log(plus.device.vendor);var Intent = plus.android.importClass('android.content.Intent')var Settings = plus.android.importClass('android.provider.Settings')var Uri = plus.android.importClass('android.net.Uri')var mainActivity = plus.android.runtimeMainActivity()var intent = new Intent()intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)var uri = Uri.fromParts('package', mainActivity.getPackageName(), null)intent.setData(uri)mainActivity.startActivity(intent)}
}// 檢查系統的設備服務是否開啟
// var checkSystemEnableLocation = async function () {
export function checkSystemEnableLocation() {if (isIos) {var result = false;var cllocationManger = plus.ios.import("CLLocationManager");var result = cllocationManger.locationServicesEnabled();console.log("系統定位開啟:" + result);plus.ios.deleteObject(cllocationManger);return result;} else {var context = plus.android.importClass("android.content.Context");var locationManager = plus.android.importClass("android.location.LocationManager");var main = plus.android.runtimeMainActivity();var mainSvr = main.getSystemService(context.LOCATION_SERVICE);var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);console.log("系統定位開啟:" + result);return result}
}

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

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

相關文章

關于 Rust 異步(無棧協程)的相關疑問

這是一個記錄問題求助的文章。關于 waker 與運行時的合作方式我膚淺地學習了 Rust 異步底層實現原理&#xff0c;關于 Future、waker 和運行時等。關于 waker 我有三點猜測&#xff1a;waker 是由實現執行器的人提供的在執行器中會調用 epoll_wait&#xff0c;epoll 返回 fd&am…

stm32項目(25)——基于stm32的植物生長箱環境監測系統

1.實現功能 測 環境溫濕度、光照強度、土壤濕度、水箱水位 手機APP顯示 溫度過低-->打開加熱板 濕度過低-->打開水泵 土壤濕度低-->開水泵 --->只要有指標低于閾值時 就蜂鳴器報警 光強弱-->補光 水位低-->抽水 OLED屏幕實時顯示各種信息 分…

golang 基礎案例_02

1.鎖有時候我們的代碼中可能會存在多個 goroutine 同時操作一個資源&#xff08;臨界區&#xff09;的情況&#xff0c;這種情況下就會發生競態問題&#xff08;數據競態&#xff09;。(1)、互斥鎖&#xff1b;(2)、讀寫互斥鎖&#xff1b;(3)、sync.WaitGroup&#xff1b;(4)、…

C++算法·前綴和

前綴和(Prefix(Prefix(Prefix Sum)Sum)Sum)的定義 前綴和是一種高效處理區間求和問題的算法技巧 其核心思想是通過預處理構建一個前綴和數組 使得后續的區間和查詢可以在常數時間O(1)O(1)O(1)內完成 核心概念 定義 給定一個數組a[1...n]a[1...n]a[1...n],其前綴和數組s[1...…

JavaEE 初階第十七期:文件 IO 的 “管道藝術”(下)

專欄&#xff1a;JavaEE初階起飛計劃 個人主頁&#xff1a;手握風云 目錄 一、Java文件內容寫入 1.1. OutputStream 二、字符流讀取和寫入 2.1. Reader 2.2. Writer 三、示例練習 3.1. 查找文件功能 一、Java文件內容寫入 1.1. OutputStream OutputStream同樣只是?個抽…

【liunx】web高可用---nginx

NGINX簡介Nginx&#xff08;發音為 “engine x”&#xff09;是一款由俄羅斯程序員 Igor Sysoev 開發的 輕量級、高性能的 HTTP 和反向代理服務器&#xff0c;同時也是一個 IMAP/POP3/SMTP 代理服務器。自 2004 年首次發布以來&#xff0c;Nginx 憑借其 高并發處理能力、低內存…

FPGA+護理:跨學科發展的探索(二)

FPGA護理&#xff1a;跨學科發展的探索&#xff08;二&#xff09; 系列文章目錄 FPGA護理&#xff1a;跨學科發展的探索&#xff08;一&#xff09; 文章目錄FPGA護理&#xff1a;跨學科發展的探索&#xff08;二&#xff09;系列文章目錄引言三、FPGA 在精神醫學護理中的應用…

localforage的數據倉庫、實例、storeName和name的概念和區別

在 localForage 中&#xff0c;數據倉庫、實例、storeName 和 name 是核心概念&#xff0c;用于管理底層存儲&#xff08;IndexedDB/WebSQL/localStorage&#xff09;。以下是詳細解釋和區別&#xff1a; 1. 數據倉庫 (Database) 定義&#xff1a;指底層的物理數據庫&#xff…

使用MAS(Microsoft Activation Scripts)永久獲得win10專業版和office全套

文章目錄Microsoft Activation Scripts簡介下載地址使用方法Microsoft Activation Scripts簡介 MAS是Microsoft Activation Scripts縮寫。 主要提供如下功能&#xff1a; 使用該腳本可以永久獲得win10專業版和office全套&#xff08;可選&#xff09; 下載地址 https://pan…

零 shot 語義+在線閉環:深度學習讓機器人學會“主動”

來gongzhonghao【圖靈學術計算機論文輔導】&#xff0c;快速拿捏更多計算機SCI/CCF發文資訊&#xff5e;在當下&#xff0c;機器人與深度學習的融合正成為AI領域的核心發展趨勢&#xff0c;相關研究在頂會頂刊上熱度居高不下。從ICLR到CoRL&#xff0c;諸多前沿成果不斷涌現&am…

Nginx學習筆記(三)——在 CentOS 7 中配置阿里云鏡像源

&#x1f4da; Nginx學習筆記&#xff08;三&#xff09;——在 CentOS 7 中配置阿里云鏡像源 在 CentOS 7 中配置阿里云鏡像源可顯著提升軟件安裝和更新的速度&#xff0c;以下是詳細操作步驟&#xff1a; &#x1f527; 配置阿里云鏡像源步驟 1?? 備份原有源配置 sudo mv /…

WebSocket--簡單介紹

一、什么是 WebSocket&#xff1f;定義&#xff1a;WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。作用&#xff1a;實現客戶端&#xff08;瀏覽器&#xff09;和服務器之間的實時、雙向通信。優勢&#xff1a;連接保持&#xff0c;通信實時性強&#xff08;不像 HT…

【STM32 LWIP配置】STM32H723ZG + Ethernet +LWIP 配置 cubemx

STM32H723ZG LAN8742 Ethernet LWIP 配置 cubemx &#x1f31e;這邊記錄一下這塊mcu 配置以太網的過程&#xff0c;IDE是KEIL MDK&#xff0c;其實就是在下面多次提到的blog的基礎上 在scatter file進行配置 首先&#xff0c;如果想要簡單一點 直接去cubemx 那邊獲取相關的例…

EI檢索-學術會議 | 人工智能、虛擬現實、可視化

第五屆人工智能、虛擬現實與可視化國際學術會議&#xff08;AIVRV 2025&#xff09;定于2025年9月5-7日在中國 成都召開。人工智能正驅動各行業智能化轉型&#xff0c;提升效率與質量&#xff1b;虛擬現實技術以其沉浸感重塑教育、娛樂、醫療等領域體驗&#xff1b;可視化技術…

力扣(H指數)

一、題目分析 &#xff08;一&#xff09;問題描述 給定一個整數數組 citations&#xff0c;其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。我們需要計算并返回該研究者的 H 指數。根據維基百科定義&#xff1a;H 指數代表“高引用次數”&#xff0c;一名科研人員的…

標準io(1)

標準I/O基礎概念標準I/O&#xff08;Standard Input/Output&#xff09;是C語言提供的一組高級文件操作函數&#xff0c;位于<stdio.h>頭文件中。與低級I/O&#xff08;如Unix的系統調用read/write&#xff09;相比&#xff0c;標準I/O引入了緩沖機制&#xff0c;能顯著提…

線性代數1000題學習筆記

1000題線代基礎第一章1-101000題線代基礎第二章1-171000題線代基礎第三章1-11

LeetCode算法日記 - Day 8: 串聯所有單詞的子串、最小覆蓋子串

目錄 1.串聯所有單詞的子串 1.2 解法 1.3 代碼實現 2. 最小覆蓋子串 2.1 題目解析 2.2 解法 2.3 代碼實現 1.串聯所有單詞的子串 30. 串聯所有單詞的子串 - 力扣&#xff08;LeetCode&#xff09; 給定一個字符串 s 和一個字符串數組 words。 words 中所有字符串 長度…

linux實戰:基于Ubuntu的專業相機

核心組件就是QTimerOpenCV的組合方案攝像頭啟停控制用QPushButton實現&#xff0c;幀顯示必須用QLabel而不能用普通控件&#xff0c;視頻流刷新用QTimer比多線程更簡單想快速實現攝像頭控制功能&#xff0c;核心組件就是QTimerOpenCV的組合方案。攝像頭啟停控制用QPushButton實…

《深度剖析前端框架中錯誤邊界:異常處理的基石與進階》

錯誤邊界作為一種特殊的組件機制&#xff0c;正悄然重塑著應用應對異常的底層邏輯。它并非簡單的代碼片段組合&#xff0c;而是一套貫穿組件生命周期的防護體系&#xff0c;其核心價值在于將局部錯誤的影響牢牢鎖定在可控范圍內&#xff0c;避免整個應用陷入不可挽回的崩潰狀態…