请求相机权限xamarin形式

问题描述 投票:0回答:1

我有一个需要摄像头许可的应用程序,实现得很好,但是需要在主屏幕上获得许可(启动画面)。我想在登录后或在特定页面上出现(这可能吗?)。由于我可以为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");
    }
xamarin.forms xamarin.android
1个回答
0
投票

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

说摄像机权限:

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

并且在用户授予/拒绝权限请求后,将调用OnRequestPermissionsResult,您可以检查结果并致电相机(如果授予了权限。)>

有关许可的详细工作流程,请参阅this

© www.soinside.com 2019 - 2024. All rights reserved.