Xamarin Essentials 权限未能授予权限
Xamarin Essentials Permissions failing to grant permission
我目前正在编写一个需要使用相机的 Xamarin Forms 应用程序,在下面的代码中,我请求使用 Xamarin Essentials Permissions 的权限,返回为 "Granted";紧接着我要求使用相机拍照,这会引发以下错误。
ex = {Plugin.Media.Abstractions.MediaPermissionException:需要相机许可。
权限码
public static async Task<bool> GetPermission<TPermission>() where TPermission : BasePermission, new()
{
var hasPermission = await Permissions.CheckStatusAsync<TPermission>();
if (hasPermission == PermissionStatus.Granted)
return true;
else if (hasPermission == PermissionStatus.Disabled)
return false;
var result = await Permissions.RequestAsync<TPermission>();
if (result != PermissionStatus.Granted)
return false;
return true;
}
照片管理器代码
if(!await PermissionHelpers.GetPermission<Permissions.Camera>())
{
await new ErrorAlert().Show("App can't take a picture without permission to use the camera");
return string.Empty;
}
var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
PhotoSize = PhotoSize.Small,
SaveToAlbum = false
});
如前所述,GetPermission方法returns正确,但仍然会抛出错误。
我目前在 Android 上 运行。
我的 AndroidManifest.xml 有这些权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
我现在制作了一个示例项目来展示我的问题
GitHub Repo for the issue
您必须将相机权限添加到您的 Android 清单文件中!
在 Visual Studio 中右键单击您的 android 项目。
转到选项 -> 构建 -> Android 应用程序并勾选显示相机所需权限的框。
注意:如果您要录音,您可能还需要启用麦克风和音频权限。
您还必须添加:
<uses-feature android:name="android.hardware.camera" />
到您的 android 清单。
别忘了
Android
protected override void OnCreate(Bundle savedInstanceState) {
//...
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState); // add this line to your code, it may also be called: bundle
//...
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
首先,我注意到你使用了Xam.Plugin.Media
,这个插件在Android中需要WRITE_EXTERNAL_STORAGE
、READ_EXTERNAL_STORAGE
和android.permission.CAMERA
,你应该要求这些运行时权限。
您可以在 MainActivity
中使用以下代码
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != (int)Permission.Granted)
{
RequestPermissions(new string[] { Manifest.Permission.Camera, Manifest.Permission.WriteExternalStorage, Manifest.Permission.ReadExternalStorage }, 0);
}
}
这是运行 gif。
更新
如果您使用此 CrossMedia
,您需要授予存储和相机 permission.Please 打开您的 PhotoManager.cs
添加请求存储代码,如以下代码。
public class PhotoManager
{
public async Task<string> TakeNewPhoto()
{
try
{
if (!CrossMedia.IsSupported || !CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
return string.Empty;
}
if (!await PermissionHelpers.GetPermission<Permissions.Camera>())
{
return string.Empty;
}
//=====================================add above line==================================================
if (!await PermissionHelpers.GetPermission<Permissions.StorageWrite>())
{
return string.Empty;
}
var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
PhotoSize = PhotoSize.Small,
SaveToAlbum = false
});
if (photo != null)
{
return "photo taken successfully";
}
return string.Empty;
}
catch (Exception ex)
{
return ex.Message;
}
}
}
这是您的 issueProjects 的 运行 GIF。
感谢您抽出宝贵时间帮助我解决此问题。
事实证明,如果您使用的是 Xamarin essentials 版本 1.5.0,则需要将 CurrentActivity NuGet 插件安装到您的 android 项目中。
或者,更好的解决方案是更新到 1.5.1,从而完全解决问题。
我目前正在编写一个需要使用相机的 Xamarin Forms 应用程序,在下面的代码中,我请求使用 Xamarin Essentials Permissions 的权限,返回为 "Granted";紧接着我要求使用相机拍照,这会引发以下错误。
ex = {Plugin.Media.Abstractions.MediaPermissionException:需要相机许可。
权限码
public static async Task<bool> GetPermission<TPermission>() where TPermission : BasePermission, new()
{
var hasPermission = await Permissions.CheckStatusAsync<TPermission>();
if (hasPermission == PermissionStatus.Granted)
return true;
else if (hasPermission == PermissionStatus.Disabled)
return false;
var result = await Permissions.RequestAsync<TPermission>();
if (result != PermissionStatus.Granted)
return false;
return true;
}
照片管理器代码
if(!await PermissionHelpers.GetPermission<Permissions.Camera>())
{
await new ErrorAlert().Show("App can't take a picture without permission to use the camera");
return string.Empty;
}
var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
PhotoSize = PhotoSize.Small,
SaveToAlbum = false
});
如前所述,GetPermission方法returns正确,但仍然会抛出错误。
我目前在 Android 上 运行。 我的 AndroidManifest.xml 有这些权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
我现在制作了一个示例项目来展示我的问题 GitHub Repo for the issue
您必须将相机权限添加到您的 Android 清单文件中!
在 Visual Studio 中右键单击您的 android 项目。
转到选项 -> 构建 -> Android 应用程序并勾选显示相机所需权限的框。
注意:如果您要录音,您可能还需要启用麦克风和音频权限。
您还必须添加:
<uses-feature android:name="android.hardware.camera" />
到您的 android 清单。
别忘了
Android
protected override void OnCreate(Bundle savedInstanceState) {
//...
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState); // add this line to your code, it may also be called: bundle
//...
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
首先,我注意到你使用了Xam.Plugin.Media
,这个插件在Android中需要WRITE_EXTERNAL_STORAGE
、READ_EXTERNAL_STORAGE
和android.permission.CAMERA
,你应该要求这些运行时权限。
您可以在 MainActivity
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != (int)Permission.Granted)
{
RequestPermissions(new string[] { Manifest.Permission.Camera, Manifest.Permission.WriteExternalStorage, Manifest.Permission.ReadExternalStorage }, 0);
}
}
这是运行 gif。
更新
如果您使用此 CrossMedia
,您需要授予存储和相机 permission.Please 打开您的 PhotoManager.cs
添加请求存储代码,如以下代码。
public class PhotoManager
{
public async Task<string> TakeNewPhoto()
{
try
{
if (!CrossMedia.IsSupported || !CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
return string.Empty;
}
if (!await PermissionHelpers.GetPermission<Permissions.Camera>())
{
return string.Empty;
}
//=====================================add above line==================================================
if (!await PermissionHelpers.GetPermission<Permissions.StorageWrite>())
{
return string.Empty;
}
var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
PhotoSize = PhotoSize.Small,
SaveToAlbum = false
});
if (photo != null)
{
return "photo taken successfully";
}
return string.Empty;
}
catch (Exception ex)
{
return ex.Message;
}
}
}
这是您的 issueProjects 的 运行 GIF。
感谢您抽出宝贵时间帮助我解决此问题。 事实证明,如果您使用的是 Xamarin essentials 版本 1.5.0,则需要将 CurrentActivity NuGet 插件安装到您的 android 项目中。
或者,更好的解决方案是更新到 1.5.1,从而完全解决问题。