我目前正在编写一个需要使用相机的Xamarin Forms应用程序,在下面的代码中,我使用Xamarin Essentials Permissions(它以“已授予”的形式出现)来请求该权限;在我要求使用相机拍照后,立即引发以下错误。
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方法返回true,但仍然会引发错误。
我目前正在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" />
我现在已经制作了一个示例项目来展示我的问题 this thread
答案 0 :(得分:1)
不要忘记
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);
}
答案 1 :(得分:1)
首先,我注意到您使用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
,则需要授予存储和照相机权限。请打开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。
答案 2 :(得分:0)
您必须将相机的权限添加到Android清单文件中!
在Visual Studio中,右键单击您的android项目。
转到“选项”->“构建”->“ Android应用程序”,然后在要求的权限中勾选“摄像头”。
注意::如果要进行录制,则可能还需要启用麦克风和音频权限。
您还必须添加:
<uses-feature android:name="android.hardware.camera" />
显示到您的android清单。
答案 3 :(得分:0)
感谢您一直以来的努力,帮助我解决了这个问题。 原来,如果您使用的是Xamarin Essentials版本1.5.0,则需要将CurrentActivity NuGet插件安装到您的android项目中。
或者,更好的解决方案是将其更新为1.5.1,从而完全解决该问题。