我对这个问题非常困扰在应用了几个解决方案后,我找到了这个解决方案。所以我想和大家分享,这就是为什么我问这个问题,我回答了
在大多数操作系统上,权限不仅仅在安装时授予应用程序。相反,开发人员必须在应用程序运行时向用户询问权限。
处理权限的最佳方法是使用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 文件添加权限。这是一个示例 Info.plist,其中包含所有可能权限的完整列表。
重要提示:当您要提交您的应用程序时,您必须包括所有权限选项。这是因为permission_handler
插件涉及所有不同的 SDK,并且静态代码分析器(由 Apple 在应用程序提交时运行)检测到这一点,如果在Info.plist
. 可以在此处找到有关此的更多信息。
将以下内容添加到您的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
确保 compileSdkVersion
将“ android/app/build.gradle
”文件中的设置为 28:
android {
compileSdkVersion 30
...
}
确保你更换了所有的android。对其 AndroidX 对应物的依赖项(完整列表可在此处找到:https://developer.android.com/jetpack/androidx/migrate)
AndroidManifest.xml
为您的文件添加权限 。 根据您启动应用程序的方式选择, debug
和 main
版本 。profile
通常,仅向 main
版本添加权限就足够了。AndroidManifest.xml
这是一个包含所有可能权限的完整列表的示例 。
最后你可以像这样使用
有许多 权限。您可以得到一个 Permission
's , 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(),
),
],
));
}
}),
],
),
)