簡體   English   中英

Android權限對話框未在Xamarin.Forms中顯示

[英]Android permission dialog not showing in Xamarin.Forms

我正在使用麥克風開發一個Xamarin.Forms應用程序。 我的應用程序在華為P9手機上使用Android 7.1(Nougat)。 我的android清單包括:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

如果我嘗試使用麥克風,仍然沒有顯示權限對話框。 我可以在手機設置中手動設置權限(如果我這樣做,該應用程序可以正常工作)。

訪問麥克風的代碼是:

this.recorder = new MediaRecorder();

this.recorder.SetAudioSource(AudioSource.Mic);
this.recorder.SetOutputFormat(OutputFormat.AmrWb);
this.recorder.SetAudioEncoder(AudioEncoder.AmrWb);
this.recorder.SetAudioSamplingRate(16000);

var directoryName = Configuration.RecordDirectory;

if (!Directory.Exists(directoryName))
{
    Directory.CreateDirectory(directoryName);
}

var fileName = Configuration.RecordName + Configuration.RecordExtension;
string path = Path.Combine(Configuration.RecordDirectory, fileName);

this.recorder.SetOutputFile(path);
this.recorder.Prepare();
this.recorder.Start();

我錯過了什么?

我可以在運行時強制應用程序顯示對話框嗎?

解決了

閱讀這篇博客文章 ,開發人員必須自android marshmellow手動實現權限請求。

從Android 6.0(Marshmallow,SDK> = 23)開始,您必須在運行時請求權限。 這是為了防止用戶在安裝應用程序期間必須接受所有權限。

本文介紹了更新的權限工作流程: https//blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/

(作為社區維基添加,因為問題中已經提供了答案)

在MainActivity.cs文件中,在OnCreate現有方法中添加以下代碼

string[] PermissionsArray = null;

protected override void OnCreate(Bundle bundle)
        {
                TabLayoutResource = Resource.Layout.Tabbar;
                ToolbarResource = Resource.Layout.Toolbar;

                base.OnCreate(bundle);

                global::Xamarin.Forms.Forms.Init(this, bundle);

                LoadApplication(new App());

                Initializer.Initialize();
                updateNonGrantedPermissions();

                try
                {
                    if (PermissionsArray != null && PermissionsArray.Length > 0)
                    {
                        if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
                        {
                            ActivityCompat.RequestPermissions(this, PermissionsArray, 0);
                        }
                    }
                }
                catch(Exception oExp)
                {

                }
}

 private void updateNonGrantedPermissions()
        {
            try
            {
                List<string> PermissionList = new List<string>();
                PermissionList.Add(Manifest.Permission.MediaContentControl);
                if (ContextCompat.CheckSelfPermission(Forms.Context, Manifest.Permission.RecordAudio) != (int)Android.Content.PM.Permission.Granted)
                {
                    PermissionList.Add(Manifest.Permission.RecordAudio);
                }
                if (ContextCompat.CheckSelfPermission(Forms.Context, Manifest.Permission.WriteExternalStorage) != (int)Android.Content.PM.Permission.Granted)
                {
                    PermissionList.Add(Manifest.Permission.WriteExternalStorage);
                }
                if (ContextCompat.CheckSelfPermission(Forms.Context, Manifest.Permission.ReadPhoneState) != (int)Android.Content.PM.Permission.Granted)
                {
                    PermissionList.Add(Manifest.Permission.ReadPhoneState);
                }
                PermissionsArray = new string[PermissionList.Count];
                for (int index = 0; index < PermissionList.Count; index++)
                {
                    PermissionsArray.SetValue(PermissionList[index], index);
                }
            }
            catch(Exception oExp)
            {

            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM