我对这个问题非常困扰在应用了几个解决方案后,我找到了这个解决方案。所以我想和大家分享一下,所以我问了这个问题,我回答了
在大多数操作系统上,权限不仅仅在安装时授予应用程序。相反,开发人员必须在应用运行时向用户请求权限。
处理权限的最佳方式是使用permission_handler
插入。此插件提供跨平台(iOS、Android)API 来请求权限并检查其状态。
我们还可以打开设备的应用设置,以便用户授予权限。
在 Android 上,我们可以展示请求权限的理由。
-
将此添加到您的包的pubspec.yaml 文件中:
dependencies:
permission_handler: ^5.0.1+1
-
现在在你的 Dart 代码中,你可以使用:
import 'package:permission_handler/permission_handler.dart';
-
虽然在运行时请求权限,但您仍需要告诉操作系统您的应用可能使用哪些权限。这需要向特定于 Android 和 iOS 的文件添加权限配置。
iOS
- 为您的 Info.plist 文件添加权限。 Here 是一个示例 Info.plist,其中包含所有可能权限的完整列表。
重要提示:当您想提交您的应用程序时,您必须包含所有权限选项。这是因为permission_handler 插件涉及所有不同的 SDK,并且静态代码分析器(由 Apple 在应用程序提交时运行)检测到这一点,如果在 Info.plist 中找不到匹配的权限选项,它将断言。更多相关信息请见here。
-
将以下内容添加到您的 Podfile 文件中:
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: PermissionGroup.calendar
'PERMISSION_EVENTS=0',
## dart: PermissionGroup.reminders
'PERMISSION_REMINDERS=0',
## dart: PermissionGroup.contacts
# 'PERMISSION_CONTACTS=0',
## dart: PermissionGroup.camera
# 'PERMISSION_CAMERA=0',
## dart: PermissionGroup.microphone
# 'PERMISSION_MICROPHONE=0',
## dart: PermissionGroup.speech
'PERMISSION_SPEECH_RECOGNIZER=0',
## dart: PermissionGroup.photos
# 'PERMISSION_PHOTOS=0',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
'PERMISSION_LOCATION=0',
## dart: PermissionGroup.notification
# 'PERMISSION_NOTIFICATIONS=0',
## dart: PermissionGroup.mediaLibrary
'PERMISSION_MEDIA_LIBRARY=0',
## dart: PermissionGroup.sensors
'PERMISSION_SENSORS=0'
]
end
end
end
-
删除您确实要使用的权限前面的# 字符。例如,如果您确实需要访问日历,请确保代码如下所示:
## dart: PermissionGroup.calendar
'PERMISSION_EVENTS=0',
安卓
-
将以下内容添加到您的“gradle.properties”文件中:
android.useAndroidX=true
android.enableJetifier=true
-
确保将“android/app/build.gradle”文件中的compileSdkVersion 设置为28:
android {
compileSdkVersion 30
...
}
-
确保替换所有的 android。对其 AndroidX 对应项的依赖项(完整列表可在此处找到:https://developer.android.com/jetpack/androidx/migrate)
为您的AndroidManifest.xml 文件添加权限。有debug、main 和profile 版本可供选择,具体取决于您启动应用的方式。通常,仅向main 版本添加权限就足够了。这是一个示例 AndroidManifest.xml ,其中包含所有可能权限的完整列表。
终于可以这样使用了
有许多权限。您可以获得Permission 的status,即granted、denied、restricted 或permanentlyDenied。
var status = await Permission.photos.status;
if (status.isDenied) {
// We didn't ask for permission yet.
}
// You can can also directly ask the permission about its status.
if (await Permission.location.isRestricted) {
// The OS restricts access, for example because of parental controls.
}
Call `request()` on a `Permission` to request it. If it has already been granted before, nothing happens.
request() 返回Permission 的新状态。
if (await Permission.contacts.request().isGranted) {
// Either the permission was already granted before or the user just granted it.
}
// You can request multiple permissions at once.
Map<Permission, PermissionStatus> statuses = await [
Permission.location,
Permission.storage,
].request();
print(statuses[Permission.location]);
On Android, you can show a rationale for using permission:
bool isShown = await Permission.contacts.shouldShowRequestRationale;
完整示例
Container(
child: Wrap(
children: <Widget>[
ListTile(
leading: Icon(Icons.camera_enhance),
title: Text(getTranslated(context, "Camera")),
onTap: () async {
var status = await Permission.photos.status;
if (status.isGranted) {
final pickedFile =
await _picker.getImage(source: ImageSource.camera);
final File file = File(pickedFile.path);
imageSelected(file);
} else if (status.isDenied) {
final pickedFile =
await _picker.getImage(source: ImageSource.camera);
final File file = File(pickedFile.path);
imageSelected(file);
} else {
showDialog(
context: context,
builder: (BuildContext context) => CupertinoAlertDialog(
title: Text('Camera Permission'),
content: Text(
'This app needs camera access to take pictures for upload user profile photo'),
actions: <Widget>[
CupertinoDialogAction(
child: Text('Deny'),
onPressed: () => Navigator.of(context).pop(),
),
CupertinoDialogAction(
child: Text('Settings'),
onPressed: () => openAppSettings(),
),
],
));
}
}),
],
),
)