我的应用程序允许用户使用相机或图库更改其个人资料图片,图片会上传到 Firebase 存储,然后图像链接会在用户的 Firestore 信息中更新,
在 Android 设备中,会出现请求许可的对话框并且其工作正常,但在 ios 中没有显示对话框,相机或图库根本无法打开,代码如下:
uploadImageCamera() async {
final _firebaseStorage = FirebaseStorage.instance;
final _userStorage =
FirebaseFirestore.instance.collection("Users").doc(user!.uid);
final _imagePicker = ImagePicker();
PickedFile? image;
//Check Permissions
await Permission.camera.request();
var permissionStatus = await Permission.camera.status;
if (permissionStatus.isGranted) {
//Select Image
image = await _imagePicker.getImage(source: ImageSource.camera);
var file = File(image!.path);
if (image != null) {
//Upload to Firebase
var snapshot = await _firebaseStorage
.ref()
.child('users_images/${loggedInUser.name}.jpg')
.putFile(file);
var downloadUrl = await snapshot.ref.getDownloadURL();
setState(() {
imageUrl = downloadUrl;
loggedInUser.profileImage = imageUrl;
_userStorage.update({'profileImage': imageUrl});
});
} else {
print('No Image Path Received');
}
} else {
print("Nothing....!");
}
}
我已将相机和图库权限添加到 info.plist 文件中:
<key>NSPhotoLibraryUsageDescription</key>
<string>App needs access to photo lib for profile images</string>
<key>NSCameraUsageDescription</key>
<string>To capture profile photo please grant camera access</string>
现在,当我在 iOS 设备上测试时,对话框不会打开以要求访问权限,所以我不确定我缺少什么,我将不胜感激。谢谢
在 Podfile.lock 中
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end
替换为以下
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=1',
## dart: PermissionGroup.reminders
#'PERMISSION_REMINDERS=0',
## dart: PermissionGroup.contacts
# 'PERMISSION_CONTACTS=0',
## dart: PermissionGroup.camera
'PERMISSION_CAMERA=1',
## dart: PermissionGroup.microphone
# 'PERMISSION_MICROPHONE=0',
## dart: PermissionGroup.speech
#'PERMISSION_SPEECH_RECOGNIZER=0'
## dart: PermissionGroup.photos
'PERMISSION_PHOTOS=1',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
#'PERMISSION_LOCATION=0',
## dart: PermissionGroup.notification
#'PERMISSION_NOTIFICATIONS=0',
## dart: PermissionGroup.appTrackingTransparency
##'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
## dart: PermissionGroup.mediaLibrary
##'PERMISSION_MEDIA_LIBRARY=1'
## dart: PermissionGroup.sensors
#'PERMISSION_SENSORS=0'
]
end
end
end
我的权限功能
Future<bool?> _checkPermission(BuildContext context) async {
Map<Permission, PermissionStatus> statues = await [Permission.camera, Permission.storage, Permission.photos].request();
PermissionStatus? statusCamera = statues[Permission.camera];
PermissionStatus? statusStorage = statues[Permission.storage];
PermissionStatus? statusPhotos = statues[Permission.photos];
bool isGranted = statusCamera == PermissionStatus.granted && statusStorage == PermissionStatus.granted && statusPhotos == PermissionStatus.granted;
if (isGranted) {
return true;
}
bool isPermanentlyDenied = statusCamera == PermissionStatus.permanentlyDenied || statusStorage == PermissionStatus.permanentlyDenied || statusPhotos == PermissionStatus.permanentlyDenied;
if (isPermanentlyDenied) {
return false;
}
return null;
}
及使用方法
bool? isCheck = await _checkPermission(context);
if (isCheck == true) {
await getImage(ImageSource.gallery);
} else {
errorDialog(context, "image_screen.check_permission_app".tr()).whenComplete(() => openAppSettings());
}
您可以使用像permissionHandler这样的flutter包来让您更轻松地处理flutter中的权限。
示例:
var status = await Permission.camera.status;
if (status.isDenied) {
// We didn't ask for permission yet or the permission has been denied before but not permanently.
}
// 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.
}
如果你在 void 或其他函数中编写代码,不要忘记添加 async
permissionChecker() async {
//your code here
}
如果您想添加联系人,请按照文档进行操作,但一定要添加
## dart: PermissionGroup.contacts
'PERMISSION_CONTACTS=1',
在 IOS 的 POD 文件中
即
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: PermissionGroup.photos
'PERMISSION_PHOTOS=1',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
'PERMISSION_LOCATION=1',
## dart: PermissionGroup.notification
'PERMISSION_NOTIFICATIONS=1',
## dart: PermissionGroup.contacts
'PERMISSION_CONTACTS=1',
## dart: PermissionGroup.mediaLibrary
# 'PERMISSION_MEDIA_LIBRARY=1',
]