日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Flutter Android权限问题

發(fā)布時間:2023/12/14 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flutter Android权限问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如何在Flutter管理好Android的權限

前言

從Android 6.0開始,權限不再是只是寫在AndroidManifest.xml中申請,部分權限需要通過運行時申請,這可能相對于前端開發(fā)者來說,比較陌生,所以要尤其注意這個問題。所幸Flutter有相關的插件供我們使用,本次筆者將通過公司的真實項目來實現(xiàn)Flutter在Android中的權限適配問題。

效果預覽

AndroidManifest的權限申請

permission的安裝時的動態(tài)權限申請

permission_handler的動態(tài)權限申請

環(huán)境

開發(fā)環(huán)境

Flutter1.22.0.stable
Android SDKminSdkVersion:21 compileSdkVersion:29
Gradle6.5
測試機型華為榮耀 Play4T 系統(tǒng)Android 10

插件

在pubspec.yaml文件中添加如下插件,作用分別為 運行時權限插件,安裝時權限插件,加載進度條toast的UI插件

permission_handler: 5.1.0+2
permission: 0.1.7
oktoast: 2.3.2

代碼實現(xiàn)

Android配置

在android文件夾的AndroidManifest.xml文件中加入相對應的配置,以下只是示例,具體情況具體分析

<!--允許程序打開網(wǎng)絡套接字--><uses-permission android:name="android.permission.INTERNET" /><!--允許程序設置內(nèi)置sd卡的讀寫權限--><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--允許程序獲取網(wǎng)絡狀態(tài)--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--允許程序訪問CellID或WiFi熱點來獲取粗略的位置--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--允許程序打開相機--><uses-permission android:name="android.permission.CAMERA" />

注意事項:最好要在main debug profile三個文件里面的AndroidManifest.xml都要加上

代碼封裝

在main函數(shù)入口,先申請一些權限。
注意一個問題,就是一定要在runApp()方法調(diào)用之前使用,因為這是在安裝APP時,先申請一些運行時權限

void main() => startup(); Future<void> startup() async {List<PermissionName> permissionNames = [];permissionNames.add(PermissionName.Location);permissionNames.add(PermissionName.Camera);permissionNames.add(PermissionName.Storage);List<Permissions> permissions = await Permission.requestPermissions(permissionNames);runApp(MyApp()); }

至于OkToast的配置請參考 pub.dev
這里面使用到的是permission插件,這個插件最多只能同時申請到3個(一般要先把重要的權限在這里先申請到),而且有一個很致命的問題:那就是在PermissionName枚舉中定義了很多關于權限的枚舉變量。如果Android系統(tǒng)的版本比較低,有些權限并沒有在這個版本的系統(tǒng)需要申請,會出現(xiàn)閃退拋異常的現(xiàn)象。筆者就接到用戶投訴在Android 6.0的中興手機上出現(xiàn)閃退的情況,但是筆者公司并沒有Android 7.0以下的測試機型,所以這種問題非常難以在自測階段捕捉原因,所以這點尤其注意。大體上來說,試過的地理位置、相機、還有存儲權限這個是沒什么問題,且在App中非常重要的,于是優(yōu)先在安裝階段就要盡可能獲取到授權。
首先封裝一個消息提示組件 base_tip.dart,這個組件的效果類似Android 原生的Toast

import 'package:flutter/material.dart'; import 'package:oktoast/oktoast.dart';ToastFuture showToastCommon(String msg, {ToastPosition position,}) {position ??= ToastPosition.center;return showToast(msg,position: position,); }// ignore: must_be_immutable class CustomErrorWidget extends StatefulWidget {String msg;CustomErrorWidget({Key key, this.msg = "Error"}) : super(key: key);@override_CustomErrorState createState() => _CustomErrorState(); }class _CustomErrorState extends State<CustomErrorWidget> {@overrideWidget build(BuildContext context) {return Container(child: Center(child: Text(widget.msg),),);} }

封裝權限工具類 permission_helper.dart 這個組件用來檢查權限與申請權限、申請權限成功跟失敗的接口回調(diào),及結果返回等。

import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:water_app/widget/base/base_tip.dart';class PermissionHelper {static VoidCallback defErr = () {};static VoidCallback defSuc = () {};static Future<bool> check(PermissionType type, {VoidCallback onSuc, VoidCallback onErr, String errMsg}) async {bool flag = false;Permission permission = convertType(type);PermissionStatus status = await permission.status;if (status.isGranted) {onSuc != null ? onSuc() : defSuc();flag = true;}else if (status.isUndetermined) {PermissionStatus p = await permission.request();if (p.isGranted) {onSuc != null ? onSuc() : defSuc();flag = true;}else {showErr(onErr: onErr, errMsg: errMsg);}}else if (status.isDenied || status.isPermanentlyDenied) {PermissionStatus p = await permission.request();if (p.isGranted) {onSuc != null ? onSuc() : defSuc();flag = true;}else {showErr(onErr: onErr, errMsg: errMsg);}}else {showErr(onErr: onErr, errMsg: errMsg);}return flag;}static void showErr({VoidCallback onErr, String errMsg}) {showToastCommon(errMsg ?? '請授予該權限,否則將影響一些功能的使用');onErr ?? defErr();}static Permission convertType(PermissionType type) {Permission p;switch (type) {case PermissionType.calendar:p = Permission.calendar;break;case PermissionType.camera:p = Permission.camera;break;case PermissionType.contacts:p = Permission.contacts;break;case PermissionType.location:p = Permission.location;break;case PermissionType.locationAlways:p = Permission.locationAlways;break;case PermissionType.locationWhenInUse:p = Permission.locationWhenInUse;break;case PermissionType.mediaLibrary:p = Permission.mediaLibrary;break;case PermissionType.microphone:p = Permission.microphone;break;case PermissionType.phone:p = Permission.phone;break;case PermissionType.photos:p = Permission.photos;break;case PermissionType.photosAddOnly:p = Permission.photosAddOnly;break;case PermissionType.reminders:p = Permission.reminders;break;case PermissionType.sensors:p = Permission.sensors;break;case PermissionType.sms:p = Permission.sms;break;case PermissionType.speech:p = Permission.speech;break;case PermissionType.storage:p = Permission.storage;break;case PermissionType.ignoreBatteryOptimizations:p = Permission.ignoreBatteryOptimizations;break;case PermissionType.notification:p = Permission.notification;break;case PermissionType.accessMediaLocation:p = Permission.accessMediaLocation;break;case PermissionType.activityRecognition:p = Permission.activityRecognition;break;default:p = Permission.unknown;}return p;} }enum PermissionType {calendar,camera,contacts,location,locationAlways,locationWhenInUse,mediaLibrary,microphone,phone,photos,photosAddOnly,reminders,sensors,sms,speech,storage,ignoreBatteryOptimizations,notification,accessMediaLocation,activityRecognition,unknown }

工具類使用

申請運行時相冊權限

bool allow = await PermissionHelper.check(PermissionType.storage,errMsg: '請授予相冊權限',onErr: () {debugPrint('錯誤回調(diào)');},onSuc: () {debugPrint('成功回調(diào)');} );

申請相機的權限

bool allow = await PermissionHelper.check(PermissionType.camera,errMsg: '請授予相機權限',onErr: () {debugPrint('錯誤回調(diào)');},onSuc: () {debugPrint('成功回調(diào)');});

總結

日常的程序設計要盡可能考慮到各種情況,用戶是(不講武德 )最好的測試,經(jīng)常不按常理出牌,應該要預判到用戶的各種操作(騷操作 ),從而讓應用變得更加健壯
最近筆者在公司使用Flutter技術獨自開發(fā)一款企業(yè)級的物聯(lián)網(wǎng)應用,如果對筆者感興趣,歡迎關注筆者。讀者有好的建議,也歡迎在下面留言。碼字不易,請給👍

總結

以上是生活随笔為你收集整理的Flutter Android权限问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。