在应用了几个解决方案后,我发现这个问题非常棘手.所以我想和大家分享,这就是为什么我问了这个问题,我回答了
在大多数操作系统上,权限不仅仅在安装时授予应用程序.相反,开发人员必须在应用程序运行时向用户询问权限.
处理权限的最佳方法是使用permission_handler
我们还可以打开设备的应用程序设置,以便用户可以授予权限.
在Android上,我们可以展示请求权限的理由.
将此代码添加到软件包的pubspec.yaml
文件中:
dependencies:
permission_handler: ^5.0.1+1
现在,在您的DART代码中,您可以使用:
import 'package:permission_handler/permission_handler.dart';
在运行时请求权限时,您仍然需要告诉操作系统您的应用可能会使用哪些权限.这需要向Android和iOS特定文件添加权限配置.
iOS
- 为你的信息添加权限.plist文件.Here是一个例子.列出所有可能权限的完整列表.
IMPORTANT:当你想提交应用程序时,你必须包括所有权限选项.这是因为permission_handler
插件涉及所有不同的SDK,而且静态代码分析器(在提交应用程序时由苹果运行)会检测到这一点,如果在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',
Android
将以下内容添加到"gradle.properties
"文件中:
android.useAndroidX=true
android.enableJetifier=true
一定要把你的"android/app/build.gradle
"文件中的前compileSdkVersion
位设为28:
android {
compileSdkVersion 30
...
}
确保你更换了所有的安卓系统.与AndroidX对应项的依赖关系(完整列表可在此处找到:https://developer.android.com/jetpack/androidx/migrate)
向您的AndroidManifest.xml
%文件添加权限.有Adebug
、Amain
和Aprofile
三个版本,根据你启动应用的方式而定.一般说来,只需在main
后版本中添加权限就足够了.下面是一个AndroidManifest.xml
版本的示例,其中包含所有可能的权限的完整列表.
Finally you can use like this个
有Permissions个.你可以得到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;
Full Example个
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(),
),
],
));
}
}),
],
),
)