【问题标题】:Request camera permissions xamarin forms请求相机权限 xamarin 表单
【发布时间】:2020-03-04 13:49:32
【问题描述】:

我有一个需要相机权限的应用程序,这很好实现,但在主屏幕上请求权限(启动画面)。我希望在登录后或特定页面上出现(这可能吗?)。因为我可以为 IOS 实现相同的功能,非常感谢您的帮助,祝您度过愉快的一天。

感谢您的帮助。

这是我的代码

MainActivity.cs

    const int requestCameraId = 0;
    const int requestStorageId = 1;
    const int requestId = 2;
    readonly string[] permissions =
    {
        Android.Manifest.Permission.Camera,
        Android.Manifest.Permission.ReadExternalStorage,
        Android.Manifest.Permission.WriteExternalStorage,
        Android.Manifest.Permission.Internet,
        Android.Manifest.Permission.ForegroundService,
        Android.Manifest.Permission.RequestCompanionUseDataInBackground,
        Android.Manifest.Permission.RequestCompanionRunInBackground,
        Android.Manifest.Permission.StatusBar,
        Android.Manifest.Permission.Vibrate,
        Android.Manifest.Permission.Flashlight
    };

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        switch (requestCode)
        {
            case requestCameraId:
                {
                    if (grantResults[0] == (int)Android.Content.PM.Permission.Granted)
                    {
                        Toast.MakeText(this, "Permiso concedido para la camara", ToastLength.Short).Show();

                    }
                    else
                    {
                        //Permission Denied :(
                        Toast.MakeText(this, "Permiso denegado para la camara", ToastLength.Short).Show();

                    }
                }
                break;
            case requestStorageId:
                {
                    if (grantResults[0] == (int)Android.Content.PM.Permission.Granted)
                    {
                        Toast.MakeText(this, "Permiso concedido para el almacenamiento", ToastLength.Short).Show();

                    }
                    else
                    {
                        //Permission Denied :(
                        Toast.MakeText(this, "Permiso denegado para el almacenamiento", ToastLength.Short).Show();

                    }
                }
                break;
        }
    }
    async Task GetCameraPermissionAsync()
    {
        const string permission = Manifest.Permission.Camera;

        if (CheckSelfPermission(permission) == (int)Android.Content.PM.Permission.Granted)
        {
            //TODO change the message to show the permissions name
            Toast.MakeText(this, "Permisos para la camara listos", ToastLength.Short).Show();
            return;
        }

        if (ShouldShowRequestPermissionRationale(permission))
        {
            //set alert for executing the task
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.SetTitle("Permisos necesarios");
            alert.SetMessage("La aplicación necesita acceder a la camara para tomar una fotografía del trabajo terminado");
            alert.SetPositiveButton("Conceder permiso", (senderAlert, args) =>
            {
                RequestPermissions(permissions, requestCameraId);
            });

            alert.SetNegativeButton("Cancelar", (senderAlert, args) =>
            {
                Toast.MakeText(this, "Cancelado", ToastLength.Short).Show();
            });

            Dialog dialog = alert.Create();
            dialog.Show();
            return;
        }
    }
    async Task GetStoragePermissionAsync()
    {
        const string permission = Manifest.Permission.ReadExternalStorage;

        if (CheckSelfPermission(permission) == (int)Android.Content.PM.Permission.Granted)
        {
            //TODO change the message to show the permissions name
            Toast.MakeText(this, "Permisos para leer carpetas listos", ToastLength.Short).Show();
            return;
        }

        if (ShouldShowRequestPermissionRationale(permission))
        {
            //set alert for executing the task
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.SetTitle("Permisos necesarios");
            alert.SetMessage("La aplicación necesita acceder a sus archivos para subir una imagen con el trabajo terminado");
            alert.SetPositiveButton("Conceder permiso", (senderAlert, args) =>
            {
                RequestPermissions(permissions, requestStorageId);
            });

            alert.SetNegativeButton("Cancelar", (senderAlert, args) =>
            {
                Toast.MakeText(this, "Cancelado", ToastLength.Short).Show();
            });

            Dialog dialog = alert.Create();
            dialog.Show();
            return;
        }
    }

    async Task GetPermissionsAsync()
    {
        await GetCameraPermissionAsync();
        await GetStoragePermissionAsync();
        RequestPermissions(permissions, requestId);

    }
    async Task TryToGetPermissions()
    {
        if ((int)Build.VERSION.SdkInt >= 23)
        {
            await GetPermissionsAsync();
            return;
        }
    }
    protected async  override void OnCreate(Bundle savedInstanceState)
    {
        await TryToGetPermissions();
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // RequestPermissions(permissions, requestId);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());
        Xamarin.Forms.Application.Current.On<Xamarin.Forms.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);
        CreateNotificationFromIntent(Intent);

        //notificationServiceIntent = new Intent(this.BaseContext, typeof(PDANotificationService));
        //StartService(notificationServiceIntent);
        WireUpLongRunningTask();
        var message = new StartLongRunningTaskMessage();
        MessagingCenter.Send(message, "StartLongRunningTaskMessage");
    }

【问题讨论】:

  • 我建议您在用户第一次打开相机或图库时执行相机权限请求,也建议您使用James Montemagno Permission Plugin,阅读那里的说明。您也可以按照James Montemagno Media Plugin 上的说明进行操作
  • 您在应用程序启动时请求权限,因此它完全按照您的指示进行操作。将权限请求移至代码中的其他位置

标签: xamarin.forms xamarin.android


【解决方案1】:

正如@Jason 所说,您的代码请求主 Activity 创建的权限,因此一旦您打开应用程序,它就会请求您列出的所有权限。您需要单独申请权限。

说相机权限:

if (CheckSelfPermission(Manifest.Permission.Camera) != (int)Permission.Granted)
{
    //request permission
}else
{
    //call camera
}

OnRequestPermissionsResult 将在用户授予/拒绝权限请求后被调用,您可以查看结果并在权限被授予时调用相机。

有关权限的详细工作流程请参考this

【讨论】:

    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2012-11-14
    相关资源
    最近更新 更多