应各大应用市场上架要求,增加权限索取行为用户交互弹窗
详细: https://developer.huawei.com/consumer/cn/doc/app/FAQ-faq-05#h1-1698326401789-0
- flutter端使用permission_handler申请权限
- 注册一个MethodChannel,增加一个函数,提供安卓webview相机/麦克风等权限被触发时回调用到flutter端
bash
static const platform = MethodChannel('webview_permission');
bash
platform.setMethodCallHandler((MethodCall call) async {
// 处理回调
switch (call.method) {
case 'requestCameraPermission':
...略
// 回调showPermissionDialog
}
}
- 增加一个通用权限交互弹窗
dart
/// 通用权限弹窗
/// @permission
/// @title
/// @desc
void showPermissionDialog(Permission permission) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.0),
),
title: Text(title),
content: Text(desc),
actions: <Widget>[
TextButton(
child: Text('去授权'),
onPressed: () {
Navigator.of(context).pop();
// 处理权限授予逻辑
permission.request().then((status) {
print(status.isGranted);
});
},
),
TextButton(
child: Text('不'),
onPressed: () {
// 处理权限拒绝逻辑
Navigator.of(context).pop();
},
),
],
);
},
);
}
- 安卓端同样注册MethodChannel
bash
import android.content.pm.PackageManager;
import androidx.core.content.ContextCompat;
...略
//
methodChannel4Premission = new MethodChannel(messenger, "webview_permission");
methodChannel4Premission.setMethodCallHandler(this);
- webview发起申请权限索取时,判断是否已授权,未授权时通过methodChannel调用flutter弹窗向用户说明权限用途
判断是否已授权麦克风权限
bash
if (ContextCompat.checkSelfPermission(WebViewFlutterPlugin.activity, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
methodChannel4Premission.invokeMethod("requestMicroPhonePermission", null);
}
判断是否已授权相机权限
bash
if (ContextCompat.checkSelfPermission(WebViewFlutterPlugin.activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
methodChannel4Premission.invokeMethod("requestCameraPermission", null);
}
- flutter端批量索取权限
bash
// 列出需要请求的权限
Map<Permission, PermissionStatus> statuses = {
Permission.camera: await Permission.camera.status,
Permission.location: await Permission.location.status,
Permission.microphone: await Permission.microphone.status,
};
bool allPermissionsGranted = true;
for (final entry in statuses.entries) {
if (entry.value != PermissionStatus.granted) {
allPermissionsGranted = false;
break;
}
}
if (allPermissionsGranted) {
// 所有权限都已授权,调用成功的回调函数
onSuccess();
} else {
// 批量索取权限
await [
Permission.camera,
Permission.location,
Permission.microphone,
].request();
}