wxr
2023-03-15 8cf6ab121d1cca81973de1a4cbe387c1a4a8308a
人脸管理完成,缺个更新人脸返回
1个文件已添加
15个文件已修改
1407 ■■■■■ 已修改文件
HDL-ON_Android/Assets/Language.ini 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/ImageUtlis.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/R.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/HttpServerRequest.cs 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/HttpUtil.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/NewAPI.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/NewApiRes.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/ResponseEntity/ResidenceMemberInfo.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/HDL_ON.projitems 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/AddMemberScanPage.cs 150 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/AddMemberScanPageBLL.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/MemberFaceManagementPage.cs 610 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/MemberManagementPage.cs 448 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/MemberManagementPageBLL.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/MemberPermissionPage.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SiriIntents/Server/HttpUtil.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Language.ini
@@ -578,6 +578,8 @@
591=*Member name
592=Member account
593=Face photo
594=Please enter member name
595=Delete
2532=Visitor Invitation Record
@@ -1826,6 +1828,8 @@
591=*成员名称
592=成员账号
593=人脸照片
594=请输入成员名称
595=删除人脸数据
@@ -3051,6 +3055,8 @@
591=*Member name
592=Member account
593=Face photo
594=Please enter member name
595=Delete
@@ -4279,6 +4285,8 @@
591=*Member name
592=Member account
593=Face photo
594=Please enter member name
595=Delete
@@ -5492,6 +5500,8 @@
591=*Member name
592=Member account
593=Face photo
594=Please enter member name
595=Delete
1000=Влажност в стаята
HDL_ON/Common/ImageUtlis.cs
@@ -281,7 +281,6 @@
                                    if (imageView != null)
                                    {
                                        imageView.ImageBytes = imageBytes;
                                        //Utlis.WriteLine("imageKey 加载云端下载图片成功");
                                    }
                                });
                            }
HDL_ON/Common/R.cs
@@ -4,7 +4,14 @@
{
    public static class StringId
    {
        /// <summary>
        /// 删除人脸数据
        /// </summary>
        public const int DeleteMemberFace = 595;
        /// <summary>
        /// 请输入成员备注
        /// </summary>
        public const int PlsEntrySubAccountRemark = 594;
        /// <summary>
        /// 人脸照片
        /// </summary>
HDL_ON/DAL/Server/HttpServerRequest.cs
@@ -726,7 +726,7 @@
        {
            var requestObj = new ChildDeleteObj()
            {
                childAccountId = subaccount.childAccountId,
                childId = subaccount.id,
                homeId = subaccount.homeId
            };
            var requestJson = HttpUtil.GetSignRequestJson(requestObj);
@@ -741,12 +741,11 @@
        /// <returns></returns>
        public ResponsePackNew EditSubAccountNickName(string nickName, string childAccountId)
        {
            var requestJson = HttpUtil.GetSignRequestJson(new UpdateChildNickNameObj()
            {
                homeId = DB_ResidenceData.Instance.CurrentRegion.id,
                childAccountId = childAccountId,
                nickName = nickName,
            });
            var d = new Dictionary<string, string>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("childId", childAccountId);
            d.Add("nickName", nickName);
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_Update, requestJson);
        }
@@ -761,7 +760,7 @@
            var requestJson = HttpUtil.GetSignRequestJson(new UpdateChildAllowCreateSceneObj()
            {
                homeId = DB_ResidenceData.Instance.CurrentRegion.id,
                childAccountId = childAccountId,
                childId = childAccountId,
                isAllowCreateScene = isAllow,
            });
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_Update, requestJson);
@@ -977,10 +976,60 @@
        public ResponsePackNew BindResidenceMemberAccount(string subAccount, string nickName)
        {
            //添加子账号
            var requestObj = new ChildAddObj() { homeId = DB_ResidenceData.Instance.CurrentRegion.id, account = subAccount, nickName = nickName };
            var requestObj = new ChildAddObj()
            {
                homeId = DB_ResidenceData.Instance.CurrentRegion.id,
                account = subAccount,
                nickName = nickName
            };
            var requestJson = HttpUtil.GetSignRequestJson(requestObj);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_Add, requestJson);
        }
        //v1.7更新接口
        public ResponsePackNew BindResidenceMemberAccount(string subAccount, string nickName,string faceUrl)
        {
            //添加子账号
            Dictionary<string, object> d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("nickName", nickName);
            if (!string.IsNullOrEmpty(subAccount))
            {
                d.Add("account", subAccount);
            }
            if (!string.IsNullOrEmpty(faceUrl))
            {
                d.Add("faceUrl", @"data:image/jpg;base64," + faceUrl);
            }
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_Add, requestJson);
        }
        /// <summary>
        /// 删除成员账号人脸数据
        /// </summary>
        /// <param name="subAccount"></param>
        /// <param name="nickName"></param>
        /// <param name="faceUrl"></param>
        /// <returns></returns>
        public ResponsePackNew DeleteMemberFace( string childId)
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("childId", childId);
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_RemoveFace, requestJson);
        }
        /// <summary>
        /// 更新成员账号人脸数据
        /// </summary>
        public ResponsePackNew UpdataMemberFace(string childId, string faceUrl)
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("childId", childId);
            d.Add("userFace", @"data:image/jpg;base64," + faceUrl);
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_UpdateFace, requestJson);
        }
        /// <summary>
HDL_ON/DAL/Server/HttpUtil.cs
@@ -17,8 +17,13 @@
        /// 固定域名,正式环境
        /// 公共域名就近解析
        /// </summary>
        public const string GlobalRequestHttpsHost = "https://nearest.hdlcontrol.com";
        //public const string GlobalRequestHttpsHost = "https://test-gz.hdlcontrol.com";//mmmm
        //public const string GlobalRequestHttpsHost = "https://nearest.hdlcontrol.com";
        //public const string GlobalRequestHttpsHost = "https://test-gz.hdlcontrol.com";
        //const string APP_KEY = "HDL-HOME-APP-TEST";
        //const string SECRET_KEY = "WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss";
        public const string GlobalRequestHttpsHost = "http://59.41.255.150:7777";//mmmm
        const string APP_KEY = "CPEVRLRT";
        const string SECRET_KEY = "CPEVRLSJCPEVRLSZ";
        /// <summary>
        /// RegionMark
        /// </summary>
@@ -230,7 +235,7 @@
                }
                else
                {
                    HDL_ON.Utlis.WriteLine(response.Content);
                    HDL_ON.Utlis.WriteLine($"接口异常:{requestFullUrl} \r\n"+response.ErrorMessage);
                    return new ResponsePackNew() { Code = StateCode.NETWORK_ERROR };
                }
@@ -521,14 +526,6 @@
        #endregion
        #region **********签名校验**********
        /// <summary>
        ///
        /// </summary>
        const string APP_KEY = "HDL-HOME-APP-TEST";
        /// <summary>
        ///
        /// </summary>
        const string SECRET_KEY = "WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss";
        /// <summary>
        /// 获取当前时间戳值
HDL_ON/DAL/Server/NewAPI.cs
@@ -155,6 +155,14 @@
        /// </summary>
        public const string API_POST_Child_Update = "/home-wisdom/app/child/account/update";
        /// <summary>
        /// 更新成员账号人脸信息
        /// </summary>
        public const string API_POST_Child_UpdateFace = "/home-wisdom/app/child/account/updateFace";
        /// <summary>
        /// 删除成员账号人脸信息
        /// </summary>
        public const string API_POST_Child_RemoveFace = "/home-wisdom/app/child/account/removeFace";
        /// <summary>
        /// 子账号管理员获取主账号授权Token
        /// </summary>
        public const string API_POST_Child_GetMasterToken = "/home-wisdom/app/child/account/masterToken/get";
HDL_ON/DAL/Server/NewApiRes.cs
@@ -885,7 +885,7 @@
        /// <summary>
        /// 子账号ID childAccountId
        /// </summary>
        public string childAccountId;
        public string childId;
        /// <summary>
        /// 住宅
        /// </summary>
@@ -908,7 +908,7 @@
        /// <summary>
        /// 子账户类型 ORDINARY、DEBUG、ADMIN
        /// </summary>
        public string childAccountType;
        //public string childAccountType;
        ///// <summary>
        ///// 是否允许远程控制 0:允许 1:不允许
        ///// </summary>
HDL_ON/Entity/ResponseEntity/ResidenceMemberInfo.cs
@@ -13,6 +13,16 @@
        public ResidenceMemberInfo()
        {
        }
        /// <summary>
        /// 是否虚拟账号
        /// </summary>
        public bool isVirtualAccount
        {
            get
            {
                return string.IsNullOrEmpty(childAccountId);
            }
        }
        //public string Account = "";
        //public string UserName = "";
@@ -101,6 +111,10 @@
        /// </summary>
        public string memberHeadIcon;
        /// <summary>
        /// 人脸照片
        /// </summary>
        public string userFaceUrl;
        /// <summary>
        /// 用户账号
        /// 优先显示手机号,如果手机号为空则显示邮箱地址
        /// </summary>
HDL_ON/HDL_ON.projitems
@@ -531,6 +531,7 @@
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\OrderFunctionPage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\Face\FaceManagementPage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\RoomListManage\DeliveryQrCodePage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\MemberManagement\MemberFaceManagementPage.cs" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="$(MSBuildThisFileDirectory)Entity\Device\" />
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/AddMemberScanPage.cs
@@ -16,6 +16,11 @@
        Button btnAddMember;
        Button btnScan;
        EditText etMemberAccount;
        EditText etMemberName;
        /// <summary>
        /// 人脸照片数据
        /// </summary>
        string base64string;
        Action backAction;
@@ -31,7 +36,6 @@
            bodyView.BackgroundColor = CSS_Color.MainBackgroundColor;
            new TopViewDiv(bodyView, Language.StringByID(StringId.AddMember)).LoadTopView();
            if (Entity.DB_ResidenceData.Instance.SupportFacePass)
            {
                var btnMemberName = new Button()
@@ -46,7 +50,7 @@
                };
                bodyView.AddChidren(btnMemberName);
                var etMemberName = new EditText()
                etMemberName = new EditText()
                {
                    Y = btnMemberName.Bottom,
                    X = Application.GetRealWidth(16),
@@ -120,8 +124,6 @@
                };
                bodyView.AddChidren(btnMemberFaceTitle);
                var btnAddFace = new Button()
                {
                    Gravity = Gravity.CenterHorizontal,
@@ -141,11 +143,12 @@
                EventHandler<MouseEventArgs> eFaceHandler = (sender, e) =>
                {
                    Application.HideSoftInput();
                    if (OnAppConfig.Instance.FaceManagementTip)
                    {
                        OnAppConfig.Instance.FaceManagementTip = true;
                        OnAppConfig.Instance.SaveConfig();
                        LoadPictureOptionView();
                        LoadPictureOptionView(btnAddFace);
                        return;
                    }
@@ -281,7 +284,7 @@
                        dialog.Close();
                        OnAppConfig.Instance.FaceManagementTip = true;
                        OnAppConfig.Instance.SaveConfig();
                        LoadPictureOptionView();
                        LoadPictureOptionView(btnAddFace);
                    };
                };
@@ -303,7 +306,7 @@
                    TextSize = CSS_FontSize.SubheadingFontSize,
                    IsBold = true,
                    TextAlignment = TextAlignment.Center,
                    TextID = StringId.ConfirmInvitation,
                    TextID = StringId.Confirm,
                };
                bodyView.AddChidren(btnAddMember);
@@ -371,7 +374,7 @@
                    TextSize = CSS_FontSize.SubheadingFontSize,
                    IsBold = true,
                    TextAlignment = TextAlignment.Center,
                    TextID = StringId.ConfirmInvitation,
                    TextID = StringId.Confirm,
                };
                bodyView.AddChidren(btnAddMember);
@@ -435,7 +438,7 @@
        /// <summary>
        /// 加载图标选择选项
        /// </summary>
        void LoadPictureOptionView()
        void LoadPictureOptionView(Button btnAddFace)
        {
            var pView = new FrameLayout()
            {
@@ -527,8 +530,14 @@
                var imageName = Guid.NewGuid().ToString();
                CropImage.TakePicture((imagePath) =>
                {
                    CropImageCallBack(imagePath, 1, imageName);
                }, imageName, 4, 6, imageHeight);
                    if (imagePath != null)
                    {
                        var imageBytes = getFaceImageBytes(imagePath);
                        btnAddFace.ImageBytes = imageBytes;
                        base64string = Convert.ToBase64String(imageBytes);
                    }
                }, imageName, 6, 6, imageHeight);
                pictureOptionView.Parent.RemoveFromParent();
            };
@@ -545,120 +554,29 @@
                //var imageName = scene.sid;
                CropImage.SelectPicture((imagePath) =>
                {
                    CropImageCallBack(imagePath, 2, imageName);
                }, imageName, 4, 6, imageHeight);
                    if (imagePath != null)
                    {
                        var imageBytes = getFaceImageBytes(imagePath);
                        btnAddFace.ImageBytes = imageBytes;
                        base64string = Convert.ToBase64String(imageBytes);
                    }
                }, imageName, 6, 6, imageHeight);
                pictureOptionView.Parent.RemoveFromParent();
            };
        }
        /// <summary>
        /// 裁剪完照片回调,统一处理
        /// 获取本地选取的人脸数据
        /// </summary>
        /// <param name="imagePath">裁剪后的真实路径</param>
        /// <param name="imageSource">照片来源;1:拍照;2:图库</param>
        void CropImageCallBack(string selectImagePath, int imageSource, string imageName)
        /// <param name="selectImagePath"></param>
        /// <returns></returns>
        byte[] getFaceImageBytes(string selectImagePath)
        {
            if (string.IsNullOrEmpty(selectImagePath) == true)
            {
                return;
            }
            //上传成功到回调
            Action<bool> uploadSuccessAction = (isSuccess) =>
            {
                //点击重新录入事件
                Action action = () =>
                {
                    if (!isSuccess)
                    {
                        if (imageSource == 1)
                        {
                            CropImage.TakePicture((imagePath) =>
                            {
                                CropImageCallBack(imagePath, 2, imageName);
                            }, imageName, 4, 6, imageHeight);
                        }
                        else
                        {
                            CropImage.SelectPicture((imagePath) =>
                            {
                                CropImageCallBack(imagePath, 1, imageName);
                            }, imageName, 4, 6, imageHeight);
                        }
                    }
                };
                if (isSuccess)
                {
                    //ReadFaceInfo(false);
                }
                Application.RunOnMainThread(() =>
                {
                    var page = new FaceSettingResultPage(action);
                    MainPage.BasePageView.AddChidren(page);
                    page.LoadPage(isSuccess);
                    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                });
            };
            //上传图片到云端
            UploadImage(selectImagePath, uploadSuccessAction);
        }
        /// <summary>
        /// 上传图片方法
        /// </summary>
        /// <param name="selectImagePath">裁剪后的图片路径</param>
        /// <param name="imageView"></param>
        /// <param name="uploadResultAction"></param>
        void UploadImage(string selectImagePath, Action<bool> uploadResultAction)
        {
            try
            {
                //1.读取裁剪后的图片,然后删除
                var imageBytes = Shared.IO.FileUtils.ReadFile(selectImagePath);
                System.IO.File.Delete(selectImagePath);
                var waitPage = new Loading();
                bodyView.AddChidren(waitPage);
                waitPage.Start(Language.StringByID(StringId.PleaseWait));
                //开始上传
                new Thread(() =>
                {
                    try
                    {
                        string base64string = Convert.ToBase64String(imageBytes);
                        //Utlis.WriteLine("上传图片Length:" + imageBytes.Length + " base64:" + base64string);
                        var pack = new HttpServerRequest().FaceSetting(base64string);
                        if (pack != null)
                        {
                            Utlis.WriteLine("上传结果:" + pack.message);
                            uploadResultAction?.Invoke(pack.Code == StateCode.SUCCESS);
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        Application.RunOnMainThread(() =>
                        {
                            if (waitPage != null)
                            {
                                waitPage.RemoveFromParent();
                                waitPage = null;
                            }
                        });
                    }
                })
                { IsBackground = true }.Start();
            }
            catch (Exception ex)
            {
                MainPage.Log(ex.Message);
            }
            var imageBytes = Shared.IO.FileUtils.ReadFile(selectImagePath);
            System.IO.File.Delete(selectImagePath);
            return imageBytes;
        }
    }
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/AddMemberScanPageBLL.cs
@@ -22,12 +22,14 @@
        {
            btnAddMember.MouseUpEventHandler = (sender, e) => {
                var memberAccount = etMemberAccount.Text.Trim();
                if(string.IsNullOrEmpty(memberAccount))
                var name = etMemberName.Text.Trim();
                if(string.IsNullOrEmpty(name))
                {
                    TipDivMsg(Language.StringByID(StringId.PlsEntryAccount));
                    TipDivMsg(Language.StringByID(StringId.PlsEntrySubAccountRemark));
                    return;
                }
                BindMember(memberAccount);
                BindMember(memberAccount, name, base64string);
            };
        }
@@ -35,7 +37,7 @@
        /// 绑定账号
        /// </summary>
        /// <param name="memberAccount"></param>
        void BindMember(string memberAccount)
        void BindMember(string memberAccount,string nickName,string faceUrl)
        {
            var waitPage = new Loading();
            bodyView.AddChidren(waitPage);
@@ -45,7 +47,7 @@
            {
                try
                {
                    var result = new HttpServerRequest().BindResidenceMemberAccount(memberAccount, memberAccount);
                    var result = new HttpServerRequest().BindResidenceMemberAccount(memberAccount, nickName,faceUrl);
                    if (result.Code == StateCode.SUCCESS)
                    {
                        Application.RunOnMainThread(() =>
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/MemberFaceManagementPage.cs
New file
@@ -0,0 +1,610 @@
using System;
using System.Threading;
using HDL_ON.DAL.Server;
using HDL_ON.Entity;
using HDL_ON.UI.CSS;
using Shared;
namespace HDL_ON.UI
{
    /// <summary>
    /// 增加子账号界面
    /// </summary>
    public partial class MemberFaceManagementPage : FrameLayout
    {
        FrameLayout bodyView;
        /// <summary>
        /// 人脸照片数据
        /// </summary>
        string base64string;
        ResidenceMemberInfo memberInfo;
        public MemberFaceManagementPage(ResidenceMemberInfo memberInfo)
        {
            bodyView = this;
            this.memberInfo = memberInfo;
        }
        public void LoadPage()
        {
            bodyView.BackgroundColor = CSS_Color.MainBackgroundColor;
            new TopViewDiv(bodyView, memberInfo.nickName).LoadTopView();
            #region 人脸管理
            var btnMemberFaceTitle = new Button()
            {
                Y = Application.GetRealHeight(80),
                X = Application.GetRealWidth(16),
                Height = Application.GetRealHeight(32),
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.TextFontSize,
                TextAlignment = TextAlignment.CenterLeft,
                TextID = StringId.MemberFace,
            };
            bodyView.AddChidren(btnMemberFaceTitle);
            var btnAddFace = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = btnMemberFaceTitle.Bottom,
                Width = Application.GetRealWidth(230),
                Height = Application.GetRealWidth(230),
                Radius = (uint)Application.GetRealWidth(22),
                BorderWidth = 0,
                UnSelectedImagePath = "PersonalCenter/FacePassage/FaceIcon.png",
                TextColor = CSS_Color.MainBackgroundColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                IsBold = true,
                TextAlignment = TextAlignment.Center,
            };
            bodyView.AddChidren(btnAddFace);
            EventHandler<MouseEventArgs> eFaceHandler = (sender, e) =>
            {
                if (OnAppConfig.Instance.FaceManagementTip)
                {
                    OnAppConfig.Instance.FaceManagementTip = true;
                    OnAppConfig.Instance.SaveConfig();
                    LoadPictureOptionView(btnAddFace);
                    return;
                }
                Dialog dialog = new Dialog()
                {
                    BackgroundColor = CSS_Color.DialogTransparentColor1,
                };
                FrameLayout contentView = new FrameLayout()
                {
                    Gravity = Gravity.Center,
                    Width = Application.GetRealWidth(270),
                    Height = Application.GetRealHeight(192),
                    BackgroundColor = CSS.CSS_Color.MainBackgroundColor,
                    BorderColor = 0x00000000,
                    BorderWidth = 0,
                    Radius = (uint)Application.GetMinRealAverage(10),
                };
                dialog.AddChidren(contentView);
                Button btnTitle = new Button()
                {
                    Y = Application.GetRealHeight(16),
                    Height = Application.GetRealHeight(30),
                    TextColor = CSS_Color.MainColor,
                    TextSize = CSS_FontSize.SubheadingFontSize,
                    TextAlignment = TextAlignment.Center,
                    IsBold = true,
                    TextID = StringId.FaceProtocolPrompt,
                };
                contentView.AddChidren(btnTitle);
                Button btnMsg = new Button()
                {
                    Gravity = Gravity.CenterHorizontal,
                    Height = Application.GetRealHeight(35),
                    Y = btnTitle.Bottom,
                    Width = Application.GetRealHeight(200),
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = CSS_Color.TextualColor,
                    TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                    Text = "    为保护您的个人隐私权益,特向您通知并申请明确同意授权。请你仔细阅读",
                    IsMoreLines = true,
                };
                contentView.AddChidren(btnMsg);
                Button btnMsg1 = new Button()
                {
                    Gravity = Gravity.CenterHorizontal,
                    Height = Application.GetRealHeight(15),
                    Y = btnMsg.Bottom,
                    Width = Application.GetRealHeight(200),
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = CSS_Color.MainColor,
                    TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                    Text = "    《On Pro人脸信息采集协议》",
                    IsMoreLines = true,
                };
                contentView.AddChidren(btnMsg1);
                Button btnMsg2 = new Button()
                {
                    Gravity = Gravity.CenterHorizontal,
                    Height = Application.GetRealHeight(35),
                    Y = btnMsg1.Bottom,
                    Width = Application.GetRealHeight(200),
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = CSS_Color.TextualColor,
                    TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                    Text = "    若同意该协议,请点击【同意】按键,表示您已经理解并同意人脸信息采集协议。",
                    IsMoreLines = true,
                };
                contentView.AddChidren(btnMsg2);
                Button btnLine = new Button()
                {
                    Y = Application.GetRealHeight(149),
                    Height = Application.GetRealHeight(1),
                    Width = Application.GetRealWidth(270 / 2),
                    BackgroundColor = CSS.CSS_Color.DividingLineColor,
                };
                contentView.AddChidren(btnLine);
                Button btnCancel = new Button()
                {
                    Y = btnLine.Bottom,
                    Width = Application.GetRealWidth(135),
                    Height = Application.GetRealHeight(43),
                    TextAlignment = TextAlignment.Center,
                    TextColor = CSS_Color.TextualColor,
                    TextSize = CSS_FontSize.SubheadingFontSize,
                        //SelectedTextColor = CSS_Color.MainBackgroundColor,
                        //SelectedBackgroundColor = CSS_Color.MainColor,
                        TextID = StringId.Disagree,
                };
                contentView.AddChidren(btnCancel);
                Button btnConfirm = new Button()
                {
                    X = btnCancel.Right,
                    Y = btnLine.Y,
                    Width = Application.GetRealWidth(135),
                    Height = Application.GetRealHeight(45),
                    TextAlignment = TextAlignment.Center,
                        //TextColor = CSS_Color.TextualColor,
                        TextSize = CSS_FontSize.SubheadingFontSize,
                    TextColor = CSS_Color.MainBackgroundColor,
                    BackgroundColor = CSS_Color.MainColor,
                    TextID = StringId.Agree,
                };
                contentView.AddChidren(btnConfirm);
                    //例:右下圆角 大小为50
                    int mRectCornerID = HDLUtils.RectCornerBottomRight;
                btnConfirm.SetCornerWithSameRadius((uint)Application.GetMinRealAverage(10), mRectCornerID);
                dialog.Show();
                btnCancel.MouseUpEventHandler += (sender, e) =>
                {
                    dialog.Close();
                };
                btnMsg1.MouseUpEventHandler += (sender, e) =>
                {
                    string url = "https://developer.hdlcontrol.com/人脸信息采集协议.html";
                    if (Language.CurrentLanguage != "Chinese")
                    {
                        url = "https://developer.hdlcontrol.com/Face information collection protocol.html";
                    }
                    new WebViewDialog().LoadPage("人脸信息采集协议", url);
                    dialog.Close();
                };
                btnConfirm.MouseUpEventHandler = (sender, e) =>
                {
                    dialog.Close();
                    OnAppConfig.Instance.FaceManagementTip = true;
                    OnAppConfig.Instance.SaveConfig();
                    LoadPictureOptionView(btnAddFace);
                };
            };
            btnAddFace.MouseUpEventHandler = eFaceHandler;
            #endregion
            var btnDeleteFaceDate = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = btnAddFace.Bottom + Application.GetRealHeight(30),
                Width = Application.GetRealWidth(220),
                Height = Application.GetRealWidth(44),
                Radius = (uint)Application.GetRealWidth(22),
                BorderWidth = 0,
                BorderColor = 0x00000000,
                BackgroundColor = CSS_Color.WarningColor,
                TextColor = CSS_Color.MainBackgroundColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                IsBold = true,
                TextAlignment = TextAlignment.Center,
                TextID = StringId.DeleteMemberFace,
            };
            bodyView.AddChidren(btnDeleteFaceDate);
            btnDeleteFaceDate.MouseUpEventHandler = (sender, e) => {
                var waitPage = new Loading();
                waitPage.Start("");
                new Thread(() =>
                {
                    try
                    {
                        var pack = new HttpServerRequest().DeleteMemberFace(memberInfo.id);
                        if (pack != null)
                        {
                            if(pack.Code == StateCode.SUCCESS)
                            {
                                Application.RunOnMainThread(() =>
                                {
                                    btnAddFace.ImageBytes = null;
                                    btnAddFace.UnSelectedImagePath = "PersonalCenter/FacePassage/FaceIcon.png";
                                    btnDeleteFaceDate.Enable = btnDeleteFaceDate.Visible = false;
                                });
                            }
                        }
                        else
                        {
                            Application.RunOnMainThread(() =>
                            {
                                TipDivMsg(Language.StringByID(StringId.delFail));
                            });
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        Application.RunOnMainThread(() =>
                        {
                            if (waitPage != null)
                            {
                                waitPage.RemoveFromParent();
                                waitPage = null;
                            }
                        });
                    }
                })
                { IsBackground = true }.Start();
            };
            if (!string.IsNullOrEmpty(memberInfo.userFaceUrl))
            {
                var waitPage = new Loading();
                waitPage.Start("");
                new Thread(() =>
                {
                    try
                    {
                        var bytes = downloadImageBytes(memberInfo.userFaceUrl);
                        if (bytes != null)
                        {
                            Application.RunOnMainThread(() =>
                            {
                                btnAddFace.ImageBytes = bytes;
                            });
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        Application.RunOnMainThread(() =>
                        {
                            if (waitPage != null)
                            {
                                waitPage.RemoveFromParent();
                                waitPage = null;
                            }
                        });
                    }
                })
                { IsBackground = true }.Start();
            }
            else
            {
                btnDeleteFaceDate.Enable = btnDeleteFaceDate.Visible = false;
            }
        }
        void TipDivMsg(string msg)
        {
            var tipBodyView = new FrameLayout();
            bodyView.AddChidren(tipBodyView);
            var msgView = new FrameLayout()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight(167),
                Width = Application.GetRealWidth(210),
                Height = Application.GetRealHeight(62),
                Radius = (uint)Application.GetRealWidth(8),
                BorderWidth = 0,
                BorderColor = 0x00000000,
                BackgroundColor = 0xFF333333,
            };
            tipBodyView.AddChidren(msgView);
            var btnMsg = new Button()
            {
                Gravity = Gravity.Center,
                Width = Application.GetRealWidth(186),
                Height = Application.GetRealHeight(42),
                TextColor = CSS_Color.MainBackgroundColor,
                TextSize = CSS_FontSize.TextFontSize,
                TextAlignment = TextAlignment.Center,
                Text = msg,
                IsMoreLines = true,
            };
            msgView.AddChidren(btnMsg);
            new System.Threading.Thread(() => {
                System.Threading.Thread.Sleep(1200);
                Application.RunOnMainThread(() => {
                    tipBodyView.RemoveAll();
                    tipBodyView.RemoveFromParent();
                });
            })
            { IsBackground = true }.Start();
        }
        const int imageHeight = 400;
        /// <summary>
        /// 加载图标选择选项
        /// </summary>
        void LoadPictureOptionView(Button btnAddFace)
        {
            var pView = new FrameLayout()
            {
                BackgroundColor = CSS_Color.DialogTransparentColor1,
            };
            bodyView.AddChidren(pView);
            var pictureOptionView = new FrameLayout()
            {
                Y = Application.GetRealHeight(445 + 50),
                Height = Application.GetRealHeight(250),
                AnimateSpeed = 0.3f,
                Animate = Animate.DownToUp,
            };
            pView.AddChidren(pictureOptionView);
            var optionView = new VerticalScrolViewLayout()
            {
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(100),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
            };
            pictureOptionView.AddChidren(optionView);
            var btnTakePicture = new Button()
            {
                Height = Application.GetRealHeight(50),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.TakePicture,
            };
            optionView.AddChidren(btnTakePicture);
            optionView.AddChidren(new Button() { Height = Application.GetRealHeight(1), Width = Application.GetRealWidth(343), BackgroundColor = CSS_Color.DividingLineColor });
            var btnAlbum = new Button()
            {
                Height = Application.GetRealHeight(50),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.Album,
            };
            optionView.AddChidren(btnAlbum);
            optionView.AddChidren(new Button() { Height = Application.GetRealHeight(1), Width = Application.GetRealWidth(343), BackgroundColor = CSS_Color.DividingLineColor });
            var btnCancel = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight(8) + optionView.Bottom,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(50),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
                TextID = StringId.Cancel,
                TextColor = CSS_Color.WarningColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
            };
            pictureOptionView.AddChidren(btnCancel);
            pictureOptionView.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            pView.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnCancel.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnTakePicture.MouseDownEventHandler = (sender, e) =>
            {
                btnTakePicture.IsSelected = true;
            };
            btnTakePicture.MouseUpEventHandler = (sender, e) =>
            {
                btnTakePicture.IsSelected = false;
                var imageName = Guid.NewGuid().ToString();
                CropImage.TakePicture((imagePath) =>
                {
                    CropImageCallBack(imagePath, 1, imageName);
                }, imageName, 6, 6, imageHeight);
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnAlbum.MouseDownEventHandler = (sender, e) =>
            {
                btnAlbum.IsSelected = true;
            };
            btnAlbum.MouseUpEventHandler = (sender, e) =>
            {
                btnAlbum.IsSelected = false;
                //从相册选择图片裁剪
                var imageName = Guid.NewGuid().ToString();
                //var imageName = scene.sid;
                CropImage.SelectPicture((imagePath) =>
                {
                    CropImageCallBack(imagePath, 2, imageName);
                }, imageName, 6, 6, imageHeight);
                pictureOptionView.Parent.RemoveFromParent();
            };
        }
        /// <summary>
        /// 下载云端人脸图片
        /// </summary>
        /// <param name="imageUrl"></param>
        /// <returns></returns>
        byte[] downloadImageBytes(string imageUrl)
        {
            var imageBytes = ImageUtlis.Current.GetImageDownloadUrl(imageUrl);
            return imageBytes;
        }
        /// <summary>
        /// 裁剪完照片回调,统一处理
        /// </summary>
        /// <param name="imagePath">裁剪后的真实路径</param>
        /// <param name="imageSource">照片来源;1:拍照;2:图库</param>
        void CropImageCallBack(string selectImagePath, int imageSource, string imageName)
        {
            if (string.IsNullOrEmpty(selectImagePath) == true)
            {
                return;
            }
            //上传成功到回调
            Action<bool> uploadSuccessAction = (isSuccess) =>
            {
                //点击重新录入事件
                Action action = () =>
                {
                    if (!isSuccess)
                    {
                        if (imageSource == 1)
                        {
                            CropImage.TakePicture((imagePath) =>
                            {
                                CropImageCallBack(imagePath, 1, imageName);
                            }, imageName, 6, 6, imageHeight);
                        }
                        else
                        {
                            CropImage.SelectPicture((imagePath) =>
                            {
                                CropImageCallBack(imagePath, 2, imageName);
                            }, imageName, 6, 6, imageHeight);
                        }
                    }
                };
                //if (isSuccess)
                //{
                //}
                Application.RunOnMainThread(() =>
                {
                    var page = new FaceSettingResultPage(action);
                    MainPage.BasePageView.AddChidren(page);
                    page.LoadPage(isSuccess);
                    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                });
            };
            //上传图片到云端
            UploadImage(selectImagePath, uploadSuccessAction);
        }
        /// <summary>
        /// 上传图片方法
        /// </summary>
        /// <param name="selectImagePath">裁剪后的图片路径</param>
        /// <param name="imageView"></param>
        /// <param name="uploadResultAction"></param>
        void UploadImage(string selectImagePath, Action<bool> uploadResultAction)
        {
            try
            {
                //1.读取裁剪后的图片,然后删除
                var imageBytes = Shared.IO.FileUtils.ReadFile(selectImagePath);
                System.IO.File.Delete(selectImagePath);
                var waitPage = new Loading();
                bodyView.AddChidren(waitPage);
                waitPage.Start(Language.StringByID(StringId.PleaseWait));
                //开始上传
                new Thread(() =>
                {
                    try
                    {
                        string base64string = Convert.ToBase64String(imageBytes);
                        var pack = new HttpServerRequest().UpdataMemberFace(memberInfo.id, base64string);
                        if (pack != null)
                        {
                            Utlis.WriteLine("上传结果:" + pack.message);
                            if(pack.Code == StateCode.SUCCESS)
                            {
                                Application.RunOnMainThread(() =>
                                {
                                    this.RemoveFromParent();
                                });
                            }
                            uploadResultAction?.Invoke(pack.Code == StateCode.SUCCESS);
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        Application.RunOnMainThread(() =>
                        {
                            if (waitPage != null)
                            {
                                waitPage.RemoveFromParent();
                                waitPage = null;
                            }
                        });
                    }
                })
                { IsBackground = true }.Start();
            }
            catch (Exception ex)
            {
                MainPage.Log(ex.Message);
            }
        }
    }
}
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/MemberManagementPage.cs
@@ -29,6 +29,9 @@
        public void LoadPage()
        {
#if DEBUG
            Entity.DB_ResidenceData.Instance.SupportFacePass = true;
#endif
            bodyView.BackgroundColor = CSS_Color.BackgroundColor;
            //创建读取成员账号线程
            var thread = LoadThread_GetResidenceMemberAccount();
@@ -79,7 +82,6 @@
                {
                    Gravity = Gravity.CenterHorizontal,
                    Width = Application.GetRealWidth(343),
                    //Height = Application.GetRealWidth(230),
                    Height = Application.GetRealWidth(180),
                    BackgroundColor = CSS_Color.MainBackgroundColor,
                    Radius = (uint)Application.GetRealWidth(12),
@@ -151,7 +153,11 @@
                    Text = HDLCommon.Current.GetUserName(memberInfo.memberName)
                };
                view1.AddChidren(btnMemberName);
                if (memberInfo.isVirtualAccount)
                {
                    btnMemberName.Text = memberInfo.nickName;
                }
                var btnMemberEmail = new Button()
                {
                    X = Application.GetRealWidth(88),
@@ -219,7 +225,7 @@
                    Width = Application.GetRealWidth(311),
                    BackgroundColor = CSS_Color.DividingLineColor,
                });
                LoadView_EidtNickname(btnNickname, btnNicknameRight, memberInfo);
                LoadView_EidtNickname(btnNickname, btnNicknameRight, memberInfo, memberInfo.isVirtualAccount ? btnMemberName : null);
                #endregion
                #region 使用权限
@@ -250,13 +256,7 @@
                };
                view3.AddChidren(btnPermissionRight);
                sView.AddChidren(new Button()
                {
                    Gravity = Gravity.CenterHorizontal,
                    Height = Application.GetRealWidth(1),
                    Width = Application.GetRealWidth(311),
                    BackgroundColor = CSS_Color.DividingLineColor,
                });
                EventHandler<MouseEventArgs> eHandler = (sender, e) =>
                {
@@ -280,6 +280,14 @@
                #region 人脸管理
                if (Entity.DB_ResidenceData.Instance.SupportFacePass)
                {
                    sView.AddChidren(new Button()
                    {
                        Gravity = Gravity.CenterHorizontal,
                        Height = Application.GetRealWidth(1),
                        Width = Application.GetRealWidth(311),
                        BackgroundColor = CSS_Color.DividingLineColor,
                    });
                    var view4 = new FrameLayout()
                    {
                        Height = Application.GetRealWidth(49),
@@ -307,431 +315,21 @@
                    };
                    view4.AddChidren(btnFaceManagementRight);
                    //sView.AddChidren(new Button()
                    //{
                    //    Gravity = Gravity.CenterHorizontal,
                    //    Height = Application.GetRealWidth(1),
                    //    Width = Application.GetRealWidth(311),
                    //    BackgroundColor = CSS_Color.DividingLineColor,
                    //});
                    EventHandler<MouseEventArgs> eFaceHandler = (sender, e) =>
                    {
                        if (OnAppConfig.Instance.FaceManagementTip)
                        {
                            LoadPictureOptionView();
                            return;
                        }
                        Dialog dialog = new Dialog()
                        {
                            BackgroundColor = CSS_Color.DialogTransparentColor1,
                        };
                        FrameLayout contentView = new FrameLayout()
                        {
                            Gravity = Gravity.Center,
                            Width = Application.GetRealWidth(270),
                            Height = Application.GetRealHeight(192),
                            BackgroundColor = CSS.CSS_Color.MainBackgroundColor,
                            BorderColor = 0x00000000,
                            BorderWidth = 0,
                            Radius = (uint)Application.GetMinRealAverage(10),
                        };
                        dialog.AddChidren(contentView);
                        Button btnTitle = new Button()
                        {
                            Y = Application.GetRealHeight(16),
                            Height = Application.GetRealHeight(30),
                            TextColor = CSS_Color.MainColor,
                            TextSize = CSS_FontSize.SubheadingFontSize,
                            TextAlignment = TextAlignment.Center,
                            IsBold = true,
                            TextID = StringId.FaceProtocolPrompt,
                        };
                        contentView.AddChidren(btnTitle);
                        Button btnMsg = new Button()
                        {
                            Gravity = Gravity.CenterHorizontal,
                            Height = Application.GetRealHeight(35),
                            Y = btnTitle.Bottom,
                            Width = Application.GetRealHeight(200),
                            TextAlignment = TextAlignment.CenterLeft,
                            TextColor = CSS_Color.TextualColor,
                            TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                            Text = "    为保护您的个人隐私权益,特向您通知并申请明确同意授权。请你仔细阅读",
                            IsMoreLines = true,
                        };
                        contentView.AddChidren(btnMsg);
                        Button btnMsg1 = new Button()
                        {
                            Gravity = Gravity.CenterHorizontal,
                            Height = Application.GetRealHeight(15),
                            Y = btnMsg.Bottom,
                            Width = Application.GetRealHeight(200),
                            TextAlignment = TextAlignment.CenterLeft,
                            TextColor = CSS_Color.MainColor,
                            TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                            Text = "    《On Pro人脸信息采集协议》",
                            IsMoreLines = true,
                        };
                        contentView.AddChidren(btnMsg1);
                        Button btnMsg2 = new Button()
                        {
                            Gravity = Gravity.CenterHorizontal,
                            Height = Application.GetRealHeight(35),
                            Y = btnMsg1.Bottom,
                            Width = Application.GetRealHeight(200),
                            TextAlignment = TextAlignment.CenterLeft,
                            TextColor = CSS_Color.TextualColor,
                            TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                            Text = "    若同意该协议,请点击【同意】按键,表示您已经理解并同意人脸信息采集协议。",
                            IsMoreLines = true,
                        };
                        contentView.AddChidren(btnMsg2);
                        Button btnLine = new Button()
                        {
                            Y = Application.GetRealHeight(149),
                            Height = Application.GetRealHeight(1),
                            Width = Application.GetRealWidth(270 / 2),
                            BackgroundColor = CSS.CSS_Color.DividingLineColor,
                        };
                        contentView.AddChidren(btnLine);
                        Button btnCancel = new Button()
                        {
                            Y = btnLine.Bottom,
                            Width = Application.GetRealWidth(135),
                            Height = Application.GetRealHeight(43),
                            TextAlignment = TextAlignment.Center,
                            TextColor = CSS_Color.TextualColor,
                            TextSize = CSS_FontSize.SubheadingFontSize,
                            //SelectedTextColor = CSS_Color.MainBackgroundColor,
                            //SelectedBackgroundColor = CSS_Color.MainColor,
                            TextID = StringId.Disagree,
                        };
                        contentView.AddChidren(btnCancel);
                        Button btnConfirm = new Button()
                        {
                            X = btnCancel.Right,
                            Y = btnLine.Y,
                            Width = Application.GetRealWidth(135),
                            Height = Application.GetRealHeight(45),
                            TextAlignment = TextAlignment.Center,
                            //TextColor = CSS_Color.TextualColor,
                            TextSize = CSS_FontSize.SubheadingFontSize,
                            TextColor = CSS_Color.MainBackgroundColor,
                            BackgroundColor = CSS_Color.MainColor,
                            TextID = StringId.Agree,
                        };
                        contentView.AddChidren(btnConfirm);
                        //例:右下圆角 大小为50
                        int mRectCornerID = HDLUtils.RectCornerBottomRight;
                        btnConfirm.SetCornerWithSameRadius((uint)Application.GetMinRealAverage(10), mRectCornerID);
                        dialog.Show();
                        btnCancel.MouseUpEventHandler += (sender, e) =>
                        {
                            dialog.Close();
                        };
                        btnMsg1.MouseUpEventHandler += (sender, e) =>
                        {
                            string url = "https://developer.hdlcontrol.com/人脸信息采集协议.html";
                            if (Language.CurrentLanguage != "Chinese")
                            {
                                url = "https://developer.hdlcontrol.com/Face information collection protocol.html";
                            }
                            new WebViewDialog().LoadPage("人脸信息采集协议", url);
                            dialog.Close();
                        };
                        btnConfirm.MouseUpEventHandler = (sender, e) =>
                        {
                            dialog.Close();
                            OnAppConfig.Instance.FaceManagementTip = true;
                            OnAppConfig.Instance.SaveConfig();
                            LoadPictureOptionView();
                        };
                        var page = new MemberFaceManagementPage(memberInfo);
                        MainPage.BasePageView.AddChidren(page);
                        page.LoadPage();
                        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                    };
                    view4.MouseUpEventHandler = eHandler;
                    btnFaceManagementTitle.MouseUpEventHandler = eFaceHandler;
                    view4.MouseUpEventHandler = eFaceHandler;
                    btnFaceManagementRight.MouseUpEventHandler = eFaceHandler;
                    btnFaceManagementTitle.MouseUpEventHandler = eFaceHandler;
                }
                #endregion
                //#region 创建场景 2020-12-23 隐藏创建场景按钮
                //var view4 = new FrameLayout()
                //{
                //    Height = Application.GetRealWidth(50),
                //};
                //sView.AddChidren(view4);
                //var btnCreateSceneTitle = new Button()
                //{
                //    X = Application.GetRealWidth(16),
                //    Width = Application.GetRealWidth(200),
                //    TextAlignment = TextAlignment.CenterLeft,
                //    TextColor = CSS_Color.FirstLevelTitleColor,
                //    TextSize = CSS_FontSize.TextFontSize,
                //    TextID = StringId.CreateScene,
                //};
                //view4.AddChidren(btnCreateSceneTitle);
                //var btnCreateSceneRight = new Button()
                //{
                //    X = Application.GetRealWidth(287),
                //    Y = Application.GetRealHeight(4),
                //    Width = Application.GetMinRealAverage(38),
                //    Height = Application.GetMinRealAverage(38),
                //    UnSelectedImagePath = "Public/Switch_2.png",
                //    SelectedImagePath = "Public/SwitchOn_2.png",
                //    IsSelected = memberInfo.isAllowCreateScene
                //};
                //view4.AddChidren(btnCreateSceneRight);
                //LoadView_ChangeCreateSceneState(btnCreateSceneRight, btnCreateSceneTitle, memberInfo);
                //#endregion
            }
        }
        const int imageHeight = 400;
        /// <summary>
        /// 加载图标选择选项
        /// </summary>
        void LoadPictureOptionView()
        {
            var pView = new FrameLayout()
            {
                BackgroundColor = CSS_Color.DialogTransparentColor1,
            };
            bodyView.AddChidren(pView);
            var pictureOptionView = new FrameLayout()
            {
                Y = Application.GetRealHeight(445 + 50),
                Height = Application.GetRealHeight(250),
                AnimateSpeed = 0.3f,
                Animate = Animate.DownToUp,
            };
            pView.AddChidren(pictureOptionView);
            var optionView = new VerticalScrolViewLayout()
            {
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(100),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
            };
            pictureOptionView.AddChidren(optionView);
            var btnTakePicture = new Button()
            {
                Height = Application.GetRealHeight(50),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.TakePicture,
            };
            optionView.AddChidren(btnTakePicture);
            optionView.AddChidren(new Button() { Height = Application.GetRealHeight(1), Width = Application.GetRealWidth(343), BackgroundColor = CSS_Color.DividingLineColor });
            var btnAlbum = new Button()
            {
                Height = Application.GetRealHeight(50),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.Album,
            };
            optionView.AddChidren(btnAlbum);
            optionView.AddChidren(new Button() { Height = Application.GetRealHeight(1), Width = Application.GetRealWidth(343), BackgroundColor = CSS_Color.DividingLineColor });
            var btnCancel = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight(8) + optionView.Bottom,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(50),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
                TextID = StringId.Cancel,
                TextColor = CSS_Color.WarningColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
            };
            pictureOptionView.AddChidren(btnCancel);
            pictureOptionView.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            pView.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnCancel.MouseUpEventHandler = (sender, e) =>
            {
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnTakePicture.MouseDownEventHandler = (sender, e) =>
            {
                btnTakePicture.IsSelected = true;
            };
            btnTakePicture.MouseUpEventHandler = (sender, e) =>
            {
                btnTakePicture.IsSelected = false;
                var imageName = Guid.NewGuid().ToString();
                CropImage.TakePicture((imagePath) =>
                {
                    CropImageCallBack(imagePath, 1, imageName);
                }, imageName, 4, 6, imageHeight);
                pictureOptionView.Parent.RemoveFromParent();
            };
            btnAlbum.MouseDownEventHandler = (sender, e) =>
            {
                btnAlbum.IsSelected = true;
            };
            btnAlbum.MouseUpEventHandler = (sender, e) =>
            {
                btnAlbum.IsSelected = false;
            //从相册选择图片裁剪
            var imageName = Guid.NewGuid().ToString();
            //var imageName = scene.sid;
            CropImage.SelectPicture((imagePath) =>
                {
                    CropImageCallBack(imagePath, 2, imageName);
                }, imageName, 4, 6, imageHeight);
                pictureOptionView.Parent.RemoveFromParent();
            };
        }
        /// <summary>
        /// 裁剪完照片回调,统一处理
        /// </summary>
        /// <param name="imagePath">裁剪后的真实路径</param>
        /// <param name="imageSource">照片来源;1:拍照;2:图库</param>
        void CropImageCallBack(string selectImagePath, int imageSource, string imageName)
        {
            if (string.IsNullOrEmpty(selectImagePath) == true)
            {
                return;
            }
            //上传成功到回调
            Action<bool> uploadSuccessAction = (isSuccess) =>
            {
            //点击重新录入事件
            Action action = () =>
                {
                    if (!isSuccess)
                    {
                        if (imageSource == 1)
                        {
                            CropImage.TakePicture((imagePath) =>
                            {
                                CropImageCallBack(imagePath, 2, imageName);
                            }, imageName, 4, 6, imageHeight);
                        }
                        else
                        {
                            CropImage.SelectPicture((imagePath) =>
                            {
                                CropImageCallBack(imagePath, 1, imageName);
                            }, imageName, 4, 6, imageHeight);
                        }
                    }
                };
                if (isSuccess)
                {
                    //ReadFaceInfo(false);
                }
                Application.RunOnMainThread(() =>
                {
                    var page = new FaceSettingResultPage(action);
                    MainPage.BasePageView.AddChidren(page);
                    page.LoadPage(isSuccess);
                    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                });
            };
            //上传图片到云端
            UploadImage(selectImagePath, uploadSuccessAction);
        }
        /// <summary>
        /// 上传图片方法
        /// </summary>
        /// <param name="selectImagePath">裁剪后的图片路径</param>
        /// <param name="imageView"></param>
        /// <param name="uploadResultAction"></param>
        void UploadImage(string selectImagePath, Action<bool> uploadResultAction)
        {
            try
            {
                //1.读取裁剪后的图片,然后删除
                var imageBytes = Shared.IO.FileUtils.ReadFile(selectImagePath);
                System.IO.File.Delete(selectImagePath);
                var waitPage = new Loading();
                bodyView.AddChidren(waitPage);
                waitPage.Start(Language.StringByID(StringId.PleaseWait));
                //开始上传
                new Thread(() =>
                {
                    try
                    {
                        string base64string = Convert.ToBase64String(imageBytes);
                    //Utlis.WriteLine("上传图片Length:" + imageBytes.Length + " base64:" + base64string);
                    var pack = new HttpServerRequest().FaceSetting(base64string);
                        if (pack != null)
                        {
                            Utlis.WriteLine("上传结果:" + pack.message);
                            uploadResultAction?.Invoke(pack.Code == StateCode.SUCCESS);
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        Application.RunOnMainThread(() =>
                        {
                            if (waitPage != null)
                            {
                                waitPage.RemoveFromParent();
                                waitPage = null;
                            }
                        });
                    }
                })
                { IsBackground = true }.Start();
            }
            catch (Exception ex)
            {
                MainPage.Log(ex.Message);
            }
        }
    }
}
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/MemberManagementPageBLL.cs
@@ -161,7 +161,7 @@
        /// <summary>
        /// 修改昵称窗口
        /// </summary>
        void LoadView_EidtNickname(Button btn1, Button btn2, ResidenceMemberInfo mInfo)
        void LoadView_EidtNickname(Button btn1, Button btn2, ResidenceMemberInfo mInfo,Button btnMemberName)
        {
            EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
            {
@@ -185,12 +185,16 @@
                    {
                        try
                        {
                            var responsePack = new HttpServerRequest().EditSubAccountNickName(str, mInfo.childAccountId);
                            var responsePack = new HttpServerRequest().EditSubAccountNickName(str, mInfo.id);
                            if (responsePack.Code.ToUpper() == StateCode.SUCCESS)
                            {
                                Application.RunOnMainThread(() =>
                                {
                                    btn1.Text = str;
                                    if (btnMemberName != null)
                                    {
                                        btnMemberName.Text = str;
                                    }
                                });
                                mInfo.nickName = str;
                            }
HDL_ON/UI/UI2/4-PersonalCenter/MemberManagement/MemberPermissionPage.cs
@@ -63,18 +63,21 @@
            };
            headPortraitView.AddChidren(btnMemberName);
            string username = HDLCommon.Current.GetUserName(memberInfo.memberName);
            btnMemberName.Text = memberInfo.nickName + "(" + username + ")";
            btnMemberName.Text = memberInfo.nickName;
            #region RoomList
            roomListView = new VerticalScrolViewLayout()
            if (!memberInfo.isVirtualAccount)
            {
                Y = Application.GetRealHeight(138),
                Height = Application.GetRealHeight(471),
                //BackgroundColor = CSS_Color.MainBackgroundColor,
            };
            bodyView.AddChidren(roomListView);
            #endregion
                btnMemberName.Text = memberInfo.nickName + "(" + username + ")";
                #region RoomList
                roomListView = new VerticalScrolViewLayout()
                {
                    Y = Application.GetRealHeight(138),
                    Height = Application.GetRealHeight(471),
                    //BackgroundColor = CSS_Color.MainBackgroundColor,
                };
                bodyView.AddChidren(roomListView);
                #endregion
            }
            btnDelMember = new Button()
            {
                Y = Application.GetRealHeight(617),
@@ -89,8 +92,10 @@
            bodyView.AddChidren(btnDelMember);
            LoadEventList();
            GetShareDataByAccount();
            if (!memberInfo.isVirtualAccount)
            {
                GetShareDataByAccount();
            }
        }
        /// <summary>
SiriIntents/Server/HttpUtil.cs
@@ -16,8 +16,13 @@
        /// 固定域名,正式环境
        /// 公共域名就近解析
        /// </summary>
        public const string GlobalRequestHttpsHost = "https://nearest.hdlcontrol.com";
        //public const string GlobalRequestHttpsHost = "https://test-gz.hdlcontrol.com";//mmmm
        //public const string GlobalRequestHttpsHost = "https://nearest.hdlcontrol.com";
        //public const string GlobalRequestHttpsHost = "https://test-gz.hdlcontrol.com";
        //const string APP_KEY = "HDL-HOME-APP-TEST";
        //const string SECRET_KEY = "WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss";
        public const string GlobalRequestHttpsHost = "http://59.41.255.150:7777";//mmmm
        const string APP_KEY = "CPEVRLRT";
        const string SECRET_KEY = "CPEVRLSJCPEVRLSZ";
        /// <summary>
        /// RegionMark
        /// </summary>
@@ -248,14 +253,6 @@
        #endregion
        #region **********签名校验**********
        /// <summary>
        ///
        /// </summary>
        const string APP_KEY = "HDL-HOME-APP-TEST";
        /// <summary>
        ///
        /// </summary>
        const string SECRET_KEY = "WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss";
        /// <summary>
        /// 获取当前时间戳值