为什么在调试模式下颤振显示权限状态"denied"其实际"permanentlyDenied"的位置?



我真的有点困惑,为了测试我的应用程序,我拒绝了照片和相机的权限,但是应用程序在使用图像选择器包时没有再次询问权限,而是允许我自由上传图像!? 任何关于应用程序的行为在调试模式的想法?为什么权限状态不能正确显示,你知道永久拒绝它的正确步骤是什么吗?

_getFromGallery() async {
if (await Permission.photos.request().isGranted) {
PickedFile? image = await ImagePicker.platform.pickImage(
source: ImageSource.gallery);
if (image != null) {
/// For storing image in local memory:
// final File file = File(image.path);
// final Directory directory = await getApplicationDocumentsDirectory();
// final imagepath = directory.path;
// final String fileName = path.basename(image.path);
// File newImage = await file.copy('$imagepath/$fileName');
setState(() {
_imagelocal = File(image.path);
_uploadimage();
});
}
}
else if (await Permission.photos.request().isPermanentlyDenied) {
openAppSettings();
PickedFile? image = await ImagePicker.platform.pickImage(
source: ImageSource.gallery);
if (image != null) {

/// For storing image in local memory:
// final File file = File(image.path);
// final Directory directory = await getApplicationDocumentsDirectory();
// final imagepath = directory.path;
// final String fileName = path.basename(image.path);
// File newImage = await file.copy('$imagepath/$fileName');
setState(() {
_imagelocal = File(image.path);
_uploadimage();
});
}
}
}

我想你只检查了一个权限的照片,尝试检查所有权限的相机,存储,照片

的例子:

void _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) {
_openPickImage(context);
}
bool isPermanentlyDenied =
statusCamera == PermissionStatus.permanentlyDenied ||
statusStorage == PermissionStatus.permanentlyDenied ||
statusPhotos == PermissionStatus.permanentlyDenied;
if (isPermanentlyDenied) {
_showSettingsDialog();
}
}

经过长时间的调查,我注意到以下几点:

1-如主题PermissionStatus返回总是拒绝所述即使它的实际状态是永久拒绝不知道为什么?

2-照片权限是不可用的,至少在我的测试android设备上,相反,它只有存储权限,IOS有照片,没有存储权限,所以为了在一个语句中测试android和IOS的照片/存储权限,你需要测试他们两个的权限,android上的照片权限总是为真,不知道IOS是否表现相同,并返回为真权限存储?

更新代码:

Future<void> _showMyDialogStorage() async {
return showDialog<void>(
context: context,
barrierDismissible: false, // user must tap button!
builder: (BuildContext context) {
return AlertDialog(
title: Text(AppLocalizations.of(context)!.permissionToStorage),
content: Text(AppLocalizations.of(context)!.applicationneedsThispermissiontoworkproperly),
actions: <Widget>[
TextButton(
onPressed: () => {
openAppSettings(),
Navigator.pushReplacement(
context,
MaterialPageRoute(
settings: const RouteSettings(
name: "/PostLoad",),
builder: (
BuildContext context) =>
PostLoad(mobile_number: widget.mobile_number,))),
},
child: Text(AppLocalizations.of(context)!.ok),
),
TextButton(
onPressed: () => Navigator.pushReplacement(
context,
MaterialPageRoute(
settings: const RouteSettings(
name: "/PsotLoad",),
builder: (
BuildContext context) =>
PostLoad())),
child: Text(AppLocalizations.of(context)!.cancel),
),
],
);
},
);
}
// Get image from gallery and store it locally
Future<void> _getFromGallery() async {
var status_storage = await Permission.storage.status;
var status_photo = await Permission.photos.status;
if (status_storage == PermissionStatus.granted && status_photo == PermissionStatus.granted) {
PickedFile? image = await ImagePicker.platform.pickImage(
source: ImageSource.gallery);
if (image != null) {
/// For storing image in local memory:
// final File file = File(image.path);
// final Directory directory = await getApplicationDocumentsDirectory();
// final imagepath = directory.path;
// final String fileName = path.basename(image.path);
// File newImage = await file.copy('$imagepath/$fileName');
setState(() {
_imagelocal = File(image.path);
_uploadimage();
});
}
}
else if (status_storage == PermissionStatus.denied || status_photo == PermissionStatus.denied) {
// Permission.storage.request();
_showMyDialogStorage();
}
else if (status_storage == PermissionStatus.permanentlyDenied || status_photo == PermissionStatus.permanentlyDenied) {
_showMyDialogStorage();
}
}

相关内容

最新更新