From c6e503f9c7b46d9df78242222949dd7cb200cdc2 Mon Sep 17 00:00:00 2001
From: mac <user@users-MacBook-Pro.local>
Date: 星期四, 30 十一月 2023 14:45:45 +0800
Subject: [PATCH] 2023年11月30日14:45:39

---
 app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java                 |    2 
 app/src/main/java/com/hdl/photovoltaic/widget/ChangeAvatarDialog.java             |  198 +++++++++
 app/src/main/res/values/strings.xml                                               |   16 
 app/src/main/AndroidManifest.xml                                                  |    9 
 app/src/main/res/layout/dialog_change_avatar.xml                                  |   88 ++++
 app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java               |    2 
 app/src/main/java/com/hdl/photovoltaic/HDLApp.java                                |    3 
 app/src/main/res/values/colors.xml                                                |    1 
 app/src/main/java/com/hdl/photovoltaic/utils/SharedPreUtils.java                  |   47 +
 app/src/main/java/com/hdl/photovoltaic/widget/popupview/CameraAlbumPopWindow.java |  532 ++++++++++++++++++++++++
 app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java                      |   27 +
 app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java            |  148 ++++++
 app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java                 |   92 ++++
 app/src/main/java/com/hdl/photovoltaic/widget/popupview/BasePopView.java          |   68 +++
 app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java             |    4 
 app/build.gradle                                                                  |    4 
 app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java                  |    2 
 app/src/main/res/layout/view_camera_album.xml                                     |   53 ++
 18 files changed, 1,263 insertions(+), 33 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 12d0fbe..5f6271f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -128,12 +128,12 @@
     implementation 'com.android.support:multidex:1.0.3'
     implementation 'androidx.webkit:webkit:1.3.0'//3.6.15鐗堟湰涔嬪悗 蹇呴』闆嗘垚锛岀敤鏉ユ敮鎸佹殫榛戞ā寮�
     //********UniSDK蹇呴』娣诲姞鐨勪緷璧� end********
-
     //NanoHTTPD鎼缓鏈嶅姟鍣�
     implementation 'org.nanohttpd:nanohttpd:2.3.1'
-
     //Apache FileUtils 绗笁鏂瑰伐鍏风被
     implementation 'commons-io:commons-io:2.11.0'
+    //鏉冮檺璇锋眰妗嗘灦
+    implementation 'com.github.getActivity:XXPermissions:12.8'
 
 
 }
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3b5a519..6b25e14 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -68,13 +68,13 @@
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
+        android:requestLegacyExternalStorage="true"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/Theme.PhotovoltaicDebug">
         <activity
             android:name=".ui.me.PersonalDataActivity"
-            android:exported="false"
-             />
+            android:exported="false" />
 
         <service android:name=".widget.apkwgtupload.ApkDownLoadService" />
 
@@ -128,6 +128,11 @@
         <meta-data
             android:name="design_width_in_dp"
             android:value="375" />
+        <!--涓嶅姞杩欎釜浣滅敤鍩熶笂鍘绘墦寮�鐩稿唽鐨勬槸闂��-->
+        <meta-data
+            android:name="ScopedStorage"
+            android:value="true" />
+
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/HDLApp.java b/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
index 6a9387d..3a2a0d8 100644
--- a/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
+++ b/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
@@ -66,12 +66,13 @@
 
         super.onCreate();
         mHDLApp = this;
+        SharedPreUtils.init(this);
         getAppLanguage();
         initThirdSDK();
     }
 
     public void getAppLanguage() {
-        String language = SharedPreUtils.getSharedPreferencesKey("language", this);
+        String language = SharedPreUtils.getSharedPreferencesKey("language");
         if (TextUtils.isEmpty(language)) {
             //浠庡唴瀛橀噷闈㈣幏鍙栦笉鍒拌瑷�,鑾峰彇褰撳墠绯荤粺鐨�;
             String str = getResources().getConfiguration().locale.getCountry();
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
index 4a35115..046f812 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
@@ -564,7 +564,7 @@
 
     /**
      * 鑾峰彇閫嗗彉鍣ㄥ垪琛�(鏁村悎浜戠鍜屾湰鍦板垪琛�)
-     * 娉ㄦ剰:鏈夊缃戜互浜戠璁惧涓哄噯,鏈湴瀛樺湪锛屼簯绔病鏈夊垯鍒犻櫎锛涘唴缃戜互鏈湴涓轰富,鎼滅储澶氬皯涓澶囧氨鏄剧ず澶氬皯涓紱
+     * 娉ㄦ剰:鏈夊缃戯紝浠ヤ簯绔澶囦负鍑�,鏈湴瀛樺湪锛屼簯绔病鏈夊垯鍒犻櫎锛涘唴缃戯紝浠ユ湰鍦颁负涓�,鎼滅储澶氬皯涓澶囧氨鏄剧ず澶氬皯涓紱
      *
      * @param cloudCallBeak 杩斿洖閫嗗彉鍣ㄥ垪琛�
      */
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java
index 09e2a9b..b1dfead 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java
@@ -1,10 +1,12 @@
 package com.hdl.photovoltaic.ui;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.content.res.AppCompatResources;
 
 import android.Manifest;
 import android.content.ComponentName;
+import android.content.Intent;
 import android.content.ServiceConnection;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
@@ -324,6 +326,8 @@
     }
 
 
+
+
     /**
      * 鐐瑰嚮杩斿洖閿殑浜嬩欢
      */
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java
index 0e497c3..245df08 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java
@@ -27,7 +27,7 @@
 import com.hdl.photovoltaic.widget.UpdateConfirmationCancelDialog;
 
 /**
- * 鍏充簬鐣岄潰
+ * 鍏充簬鐣岄潰锛坅pp鏇存柊锛�
  */
 public class AsRegardsActivity extends CustomBaseActivity {
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java
index e857999..a1d776b 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java
@@ -5,6 +5,8 @@
 import android.view.View;
 
 
+import androidx.annotation.Nullable;
+
 import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
 import com.hdl.linkpm.sdk.core.exception.HDLException;
 import com.hdl.photovoltaic.R;
@@ -131,7 +133,7 @@
                 Intent intent = new Intent();
                 intent.setClass(_mActivity, PersonalDataActivity.class);
                 intent.putExtra("memberHeadIcon", mC_UserInfo.getMemberHeadIcon());
-                startActivity(intent);
+                startActivityForResult(intent, 10);
             }
         });
         viewBinding.fragmentMeLineSetIl.fragmentMeLineRightIconClickIv.setOnClickListener(new View.OnClickListener() {
@@ -176,7 +178,7 @@
         if (cUserInfo != null) {
             //C绔�
             userName = cUserInfo.getMemberName();
-            GlideUtils.getRoundedCornersImage(_mActivity, cUserInfo.getMemberHeadIcon(), viewBinding.fragmentMeIconIv, new RoundedCorners(4));
+            setMemberHeadIcon(cUserInfo.getMemberHeadIcon());
         }
         viewBinding.fragmentMeUserNameIv.setText(userName);
         UserConfigManage.getInstance().setUserName(userName);
@@ -222,4 +224,25 @@
 
     }
 
+    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == 10 && resultCode == 10) {
+            if (data != null) {
+                String url = data.getStringExtra("memberHeadIcon");
+                setMemberHeadIcon(url);
+
+            }
+        }
+    }
+
+    /**
+     * 鏄剧ず鐢ㄦ埛澶村儚
+     */
+    private void setMemberHeadIcon(String memberHeadIconUrl) {
+        if (mC_UserInfo != null) {
+            mC_UserInfo.setMemberHeadIcon(memberHeadIconUrl);
+        }
+        GlideUtils.getRoundedCornersImage(_mActivity, memberHeadIconUrl, viewBinding.fragmentMeIconIv, new RoundedCorners(4));
+
+    }
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java
index 1aa9e85..ab42849 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java
@@ -1,11 +1,19 @@
 package com.hdl.photovoltaic.ui.me;
 
-import android.app.AppComponentFactory;
+import android.Manifest;
+import android.content.Intent;
+import android.os.Build;
 import android.os.Bundle;
+import android.view.Gravity;
 import android.view.View;
 
 import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
+import com.google.gson.JsonObject;
+import com.hdl.linkpm.sdk.core.callback.IDefaultCallBack;
+import com.hdl.linkpm.sdk.core.callback.IResponseCallBack;
 import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.linkpm.sdk.user.HDLLinkPMUser;
+import com.hdl.linkpm.sdk.user.bean.ImageSubmitInfo;
 import com.hdl.photovoltaic.R;
 import com.hdl.photovoltaic.base.CustomBaseActivity;
 
@@ -13,9 +21,14 @@
 import com.hdl.photovoltaic.databinding.ActivityPersonalDataBinding;
 import com.hdl.photovoltaic.listener.CloudCallBeak;
 import com.hdl.photovoltaic.other.HdlAccountLogic;
+import com.hdl.photovoltaic.other.HdlLogLogic;
 import com.hdl.photovoltaic.other.HdlThreadLogic;
 import com.hdl.photovoltaic.utils.GlideUtils;
+import com.hdl.photovoltaic.utils.PermissionUtils;
 import com.hdl.photovoltaic.widget.ConfirmationInputDialog;
+import com.hdl.photovoltaic.widget.popupview.CameraAlbumPopWindow;
+
+import java.io.File;
 
 
 /**
@@ -23,8 +36,11 @@
  */
 public class PersonalDataActivity extends CustomBaseActivity {
     private ActivityPersonalDataBinding viewBinding;
+
+    private CameraAlbumPopWindow cameraAlbumPopWindow;
     //澶村儚鍦板潃
-    private String mMemberHeadIcon;
+    private String mMemberHeadIconUrl;
+
 
     @Override
     public Object getContentView() {
@@ -36,7 +52,7 @@
     public void onBindView(Bundle savedInstanceState) {
         setNotificationBarBackgroundColor(CustomColor.white);
         setStatusBarTextColor();
-        mMemberHeadIcon = getIntent().getStringExtra("memberHeadIcon");
+        mMemberHeadIconUrl = getIntent().getStringExtra("memberHeadIcon");
         //鍒濆鍖�
         initView();
         //鍒濆鍖栫晫闈㈢洃鍚櫒
@@ -46,16 +62,40 @@
     }
 
     private void initData() {
-        viewBinding.toolbarTopFragmentMeRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                finish();
-            }
-        });
+
     }
 
     private void initEvent() {
 
+        viewBinding.toolbarTopFragmentMeRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //鏁版嵁鏄娇鐢↖ntent杩斿洖
+                Intent intent = new Intent();
+                //鎶婅繑鍥炴暟鎹瓨鍏ntent
+                intent.putExtra("memberHeadIcon", mMemberHeadIconUrl);
+                //璁剧疆杩斿洖鏁版嵁
+                setResult(10, intent);
+                finish();
+            }
+        });
+        viewBinding.personalDataUserPortraitIl.getRoot().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //Manifest.permission.WRITE_EXTERNAL_STORAGE 璇诲啓璁惧涓婄殑鐓х墖浠ュ強鏂囦欢
+                PermissionUtils.applyForRight(_mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE, new PermissionUtils.PermissionState() {
+                    @Override
+                    public void Success(int value) {
+                        if (value == PermissionUtils.STATUS_REFUSE_PERMANENT) {
+                            HdlThreadLogic.toast(_mActivity, R.string.permission_open);
+                            return;
+                        }
+                        changedUserAvatar();
+                    }
+                });
+
+            }
+        });
 
         viewBinding.personalDataUserNameIl.getRoot().setOnClickListener(new View.OnClickListener() {
             @Override
@@ -63,6 +103,7 @@
                 changedNickname();
             }
         });
+
 
     }
 
@@ -74,9 +115,53 @@
         viewBinding.personalDataUserPortraitIl.sllLlRlNameTv.setText(R.string.me_personal_data_portrait);
         viewBinding.personalDataUserNameIl.sllLlRlNameTv.setText(R.string.me_personal_data_user_name);
         viewBinding.personalDataUserPortraitIl.sllLlRlRightContentIv.setVisibility(View.VISIBLE);
-        GlideUtils.getRoundedCornersImage(_mActivity, this.mMemberHeadIcon, viewBinding.personalDataUserPortraitIl.sllLlRlRightContentIv, new RoundedCorners(4));
         viewBinding.personalDataUserNameIl.sllLlRlRightContentTv.setVisibility(View.VISIBLE);
         viewBinding.personalDataUserNameIl.sllLlRlRightContentTv.setText(UserConfigManage.getInstance().getUserName());
+        setMemberHeadIcon();
+    }
+
+
+    /**
+     * 鏇存敼鐢ㄦ埛澶村儚;
+     */
+    private void changedUserAvatar() {
+        if (UserConfigManage.getInstance().isBAccount()) {
+            //todo B绔笉鏀寔鏇存敼鏄电О
+            HdlThreadLogic.toast(_mActivity, R.string.loading_not_supported);
+        } else {
+            cameraAlbumPopWindow = new CameraAlbumPopWindow(_mActivity, new CameraAlbumPopWindow.CameraAlbumListener() {
+                @Override
+                public void successCallBack(final File a) {
+                    HDLLinkPMUser.getInstance().uploadUserHeadImage(a, new IResponseCallBack<ImageSubmitInfo>() {
+                        @Override
+                        public void onSuccess(ImageSubmitInfo imageKey) {
+                            JsonObject imageInfo = new JsonObject();
+                            imageInfo.addProperty("memberHeadIcon", imageKey.getUrl());
+                            HDLLinkPMUser.getInstance().updateMemberInfo(imageInfo, new IDefaultCallBack() {
+                                @Override
+                                public void onSuccess() {
+                                    mMemberHeadIconUrl = imageKey.getUrl();
+                                    setMemberHeadIcon();
+                                }
+
+                                @Override
+                                public void onFailure(HDLException error) {
+                                    HdlLogLogic.print("uploadUserHeadImage error:" + error.getMsg());
+//                                    hideLoading();
+                                }
+                            });
+                        }
+
+                        @Override
+                        public void onFailure(HDLException error) {
+                            HdlLogLogic.print("uploadUserHeadImage error:" + error.getMsg());
+                        }
+                    });
+                }
+            });
+            cameraAlbumPopWindow.show(viewBinding.getRoot(), Gravity.BOTTOM, 0, 0);
+        }
+
     }
 
 
@@ -86,6 +171,7 @@
     private void changedNickname() {
         if (UserConfigManage.getInstance().isBAccount()) {
             //todo B绔笉鏀寔鏇存敼鏄电О
+            HdlThreadLogic.toast(_mActivity, R.string.loading_not_supported);
         } else {
             ConfirmationInputDialog confirmationInputDialog = new ConfirmationInputDialog(_mActivity);
             confirmationInputDialog.setTitle(getString(R.string.set_nickname_modification));
@@ -121,4 +207,46 @@
         }
 
     }
+
+    /**
+     * 鏄剧ず鐢ㄦ埛澶村儚
+     */
+    private void setMemberHeadIcon() {
+        GlideUtils.getRoundedCornersImage(_mActivity, mMemberHeadIconUrl, viewBinding.personalDataUserPortraitIl.sllLlRlRightContentIv, new RoundedCorners(4));
+    }
+
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == CameraAlbumPopWindow.TAKE_PHOTO || requestCode == CameraAlbumPopWindow.SELECT_PHOTO) {
+            if (cameraAlbumPopWindow == null) {
+                return;
+            }
+            switch (requestCode) {
+                //鎵撳紑鐩告満鍚庤繑鍥�
+                case CameraAlbumPopWindow.TAKE_PHOTO:
+                    if (resultCode == RESULT_OK) {
+                        //杩欑鏂规硶鏄�氳繃鍐呭瓨鍗$殑璺緞杩涜璇诲彇鍥剧墖锛屾墍浠ョ殑鍒扮殑鍥剧墖鏄媿鎽勭殑鍘熷浘
+                        cameraAlbumPopWindow.displayImage();
+                    }
+                    break;
+                //鎵撳紑鐩稿唽鍚庤繑鍥�
+                case CameraAlbumPopWindow.SELECT_PHOTO:
+                    if (resultCode == RESULT_OK) {
+                        //鍒ゆ柇鎵嬫満绯荤粺鐗堟湰鍙�
+                        if (Build.VERSION.SDK_INT > 19) {
+                            //4.4鍙婁互涓婄郴缁熶娇鐢ㄨ繖涓柟娉曞鐞嗗浘鐗�
+                            cameraAlbumPopWindow.handleImgeOnKitKat(data);
+                        } else {
+                            cameraAlbumPopWindow.handleImageBeforeKitKat(data);
+                        }
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java b/app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java
index 955fd3d..a4ec45b 100644
--- a/app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java
+++ b/app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java
@@ -125,7 +125,7 @@
      * @param context 涓婁笅鏂�
      */
     private static void setCurrLanguageMode(Context context) {
-        String language = SharedPreUtils.getSharedPreferencesKey("languege", context);
+        String language = SharedPreUtils.getSharedPreferencesKey("languege");
         Locale local = getLocale(language);
         Resources res = context.getResources();
         DisplayMetrics dm = res.getDisplayMetrics();
diff --git a/app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java b/app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java
index c970410..91a31dc 100644
--- a/app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java
+++ b/app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java
@@ -1,24 +1,40 @@
 package com.hdl.photovoltaic.utils;
 
+import android.Manifest;
 import android.app.Activity;
+import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.Build;
 
 import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
-import androidx.fragment.app.Fragment;
+
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hjq.permissions.OnPermissionCallback;
+import com.hjq.permissions.XXPermissions;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 
 public class PermissionUtils {
-
     /**
      * 鑾峰彇鏉冮檺鎴愬姛
      */
-    public static final int STATUS_SUCCESS = 1;
+    public static final int STATUS_SUCCESS = 0;
+    /**
+     * 鐢宠鏉冮檺鎷掔粷, 浣嗘槸涓嬫鐢宠鏉冮檺杩樹細寮圭獥
+     */
+    public static final int STATUS_REFUSE = 1;
+    /**
+     * 鐢宠鏉冮檺鎷掔粷锛屽苟涓旀槸姘镐箙锛屼笉浼氬啀寮圭獥
+     */
+    public static final int STATUS_REFUSE_PERMANENT = 2;
+    /**
+     * 榛樿鏈姹傛巿鏉冪姸鎬�
+     */
+    public static final int STATUS_DEFAULT = 3;
 
     /**
      * 鍙湁activity鎵嶅彲浠ョ敵璇�
@@ -74,5 +90,73 @@
         return new String[]{};
     }
 
+    /**
+     * 鑾峰彇鏉冮檺鐘舵��
+     */
+    public static int getAuthorizeStaus(Activity activity, String authorize) {
+        int flag = ActivityCompat.checkSelfPermission(activity, authorize);
+        Boolean isShould = ActivityCompat.shouldShowRequestPermissionRationale(activity, authorize);
+        if (isShould) {
+            return STATUS_REFUSE;
+        }
+        if (flag == PackageManager.PERMISSION_GRANTED) {
+            //鑾峰彇鍒版潈闄�
+            return STATUS_SUCCESS;
+        }
+        if (!SharedPreUtils.contains(authorize)) {
+            return STATUS_DEFAULT;
+        }
+        return STATUS_REFUSE_PERMANENT;
+    }
+
+    /**
+     * 鐢宠鏉冮檺鏈夊洖璋�
+     *
+     * @param activity                -
+     * @param permission              -
+     * @param permissionStateCallback -
+     */
+    public static void applyForRight(Activity activity, String permission, PermissionState permissionStateCallback) {
+//        String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+        int status = PermissionUtils.getAuthorizeStaus(activity, permission);
+        switch (status) {
+            case PermissionUtils.STATUS_SUCCESS:
+                if (permissionStateCallback != null) {
+                    permissionStateCallback.Success(STATUS_SUCCESS);
+                }
+                break;
+            case PermissionUtils.STATUS_REFUSE:
+            case PermissionUtils.STATUS_DEFAULT:
+                XXPermissions.with(activity)
+                        .permission(permission)
+                        .request(new OnPermissionCallback() {
+                            @Override
+                            public void onGranted(List<String> permissions, boolean all) {
+                                SharedPreUtils.putBoolean(permission, true);
+                                if (permissionStateCallback != null) {
+                                    permissionStateCallback.Success(STATUS_REFUSE);
+                                }
+                            }
+
+                            @Override
+                            public void onDenied(List<String> permissions, boolean never) {
+                                SharedPreUtils.putBoolean(permission, true);
+                            }
+                        });
+                break;
+            case PermissionUtils.STATUS_REFUSE_PERMANENT:
+                if (permissionStateCallback != null) {
+                    permissionStateCallback.Success(STATUS_REFUSE_PERMANENT);
+                }
+
+                break;
+        }
+    }
+
+    public interface PermissionState {
+        void Success(int value);
+
+    }
+
 
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/utils/SharedPreUtils.java b/app/src/main/java/com/hdl/photovoltaic/utils/SharedPreUtils.java
index 64522b8..c459b9a 100644
--- a/app/src/main/java/com/hdl/photovoltaic/utils/SharedPreUtils.java
+++ b/app/src/main/java/com/hdl/photovoltaic/utils/SharedPreUtils.java
@@ -3,21 +3,28 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 
+import com.hdl.photovoltaic.HDLApp;
+
 
 public class SharedPreUtils {
 
+    private static final String FILE_NAME = "MyData";
+    private static SharedPreferences sp;
+
+    public static void init(Context context) {
+        sp = context.getApplicationContext().getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
+    }
 
     /**
      * 鐢ㄦ埛鏁版嵁鐨勫瓨鍌�
      *
-     * @param key     閿悕
-     * @param value   閿��
-     * @param context 涓婁笅鏂�
+     * @param key   閿悕
+     * @param value 閿��
      * @return -
      */
-    public static boolean saveMyDataInfo(String key, String value, Context context) {
+    public static boolean putString(String key, String value) {
         // 鑾峰彇SharedPreferences瀵硅薄锛屽悓鏃舵寚瀹氭枃浠跺悕绉板拰璁块棶鏉冮檺
-        SharedPreferences sp = context.getSharedPreferences("MyData", Context.MODE_PRIVATE);
+//        SharedPreferences sp = context.getSharedPreferences("MyData", Context.MODE_PRIVATE);
         // 鑾峰彇鑾峰彇SharedPreferences鐨勭紪杈戝櫒瀵硅薄
         SharedPreferences.Editor edit = sp.edit();
         // 閫氳繃缂栬緫鍣ㄨ繘琛屾暟鎹殑瀛樺偍
@@ -29,13 +36,35 @@
     /**
      * 璇诲彇鐢ㄦ埛鏁版嵁
      *
-     * @param key     閿悕
-     * @param context 涓婁笅鏂�
+     * @param key 閿悕
      * @return -value
      */
-    public static String getSharedPreferencesKey(String key, Context context) {
+    public static String getSharedPreferencesKey(String key) {
         // 鑾峰彇SharedPreferences瀵硅薄锛屽悓鏃舵寚瀹氭枃浠跺悕绉板拰璁块棶鏉冮檺
-        SharedPreferences sp = context.getSharedPreferences("MyData", Context.MODE_PRIVATE);
         return sp.getString(key, "");
     }
+
+
+    /**
+     * 娣诲姞boolean鍊�
+     */
+    public static void putBoolean(String key, Boolean value) {
+        sp.edit().putBoolean(key, value).apply();
+    }
+
+    /**
+     * 鑾峰彇boolean鍊�
+     */
+    public static Boolean getBoolean(String key) {
+        // 鑾峰彇SharedPreferences瀵硅薄锛屽悓鏃舵寚瀹氭枃浠跺悕绉板拰璁块棶鏉冮檺
+        return sp.getBoolean(key, false);
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁瀛樺湪
+     */
+    public static Boolean contains(String key) {
+        // 鑾峰彇SharedPreferences瀵硅薄锛屽悓鏃舵寚瀹氭枃浠跺悕绉板拰璁块棶鏉冮檺
+        return sp.contains(key);
+    }
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/widget/ChangeAvatarDialog.java b/app/src/main/java/com/hdl/photovoltaic/widget/ChangeAvatarDialog.java
new file mode 100644
index 0000000..5faddaf
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/widget/ChangeAvatarDialog.java
@@ -0,0 +1,198 @@
+package com.hdl.photovoltaic.widget;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.databinding.DialogChangeAvatarBinding;
+
+/**
+ * 淇敼澶村儚涓撶敤寮圭獥
+ */
+public class ChangeAvatarDialog extends Dialog {
+
+    private final Context mContext;
+
+    private onCancelOnclickListener cancelOnclickListener;//鍙栨秷鎸夐挳琚偣鍑讳簡鐨勭洃鍚櫒
+    private onLine1OnclickListener line1OnclickListener;//
+    private onLine2OnclickListener line2OnclickListener;//
+    private DialogChangeAvatarBinding viewBinding;
+
+    private String line1Text, line2Text, cancelText;
+
+    public ChangeAvatarDialog(@NonNull Context context) {
+        super(context, R.style.Custom_Dialog);
+        this.mContext = context;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        viewBinding = DialogChangeAvatarBinding.inflate(getLayoutInflater());
+        setContentView(viewBinding.getRoot());
+        //绌虹櫧澶勪笉鑳藉彇娑堝姩鐢�
+        setCanceledOnTouchOutside(false);
+        //鍒濆鍖栫晫闈㈡帶浠�
+        initView();
+        //鍒濆鍖栫晫闈㈡暟鎹�
+        initData();
+        //鍒濆鍖栫晫闈㈡帶浠剁殑浜嬩欢
+        initEvent();
+
+    }
+
+    private void initView() {
+    }
+
+    /**
+     * 鑷畾涔�"绗竴琛�"鏂囨湰
+     *
+     * @param content 鍐呭
+     */
+    public void setLine1Text(String content) {
+        if (TextUtils.isEmpty(content)) {
+            return;
+        }
+        line1Text = content;
+
+
+        if (viewBinding != null) {
+            viewBinding.dialogChangePhotographTv.setText(content);
+        }
+
+
+    }
+
+    /**
+     * 鑷畾涔�"绗簩琛�"鏂囨湰
+     *
+     * @param content 鍐呭
+     */
+    public void setLine2Text(String content) {
+        if (TextUtils.isEmpty(content)) {
+            return;
+        }
+        line2Text = content;
+
+
+        if (viewBinding != null) {
+            viewBinding.dialogChangeAvatarSelectAlbumTv.setText(content);
+        }
+
+
+    }
+
+
+    /**
+     * 鑷畾涔�"鍙栨秷"鏂囨湰
+     *
+     * @param cancel 鍐呭
+     */
+    public void setCancel(String cancel) {
+        if (TextUtils.isEmpty(cancel)) {
+            return;
+        }
+        cancelText = cancel;
+        if (viewBinding != null) {
+            viewBinding.dialogChangeAvatarCancelTv.setText(cancel);
+        }
+
+    }
+
+    private void initEvent() {
+
+
+        viewBinding.dialogChangePhotograph.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (line1OnclickListener != null) {
+                    line1OnclickListener.Line1();
+                }
+            }
+        });
+        viewBinding.dialogChangeAvatarSelectAlbumLl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (line2OnclickListener != null) {
+                    line2OnclickListener.Line2();
+                }
+            }
+        });
+
+        viewBinding.dialogChangeAvatarCancelLl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (cancelOnclickListener != null) {
+                    cancelOnclickListener.Cancel();
+                }
+            }
+        });
+
+    }
+
+    private void initData() {
+        //濡傛灉璁剧疆鎸夐挳鏂囧瓧
+        if (!TextUtils.isEmpty(line1Text)) {
+            viewBinding.dialogChangePhotographTv.setText(line1Text);
+        }
+        if (!TextUtils.isEmpty(line2Text)) {
+            viewBinding.dialogChangeAvatarSelectAlbumTv.setText(line2Text);
+        }
+        if (!TextUtils.isEmpty(cancelText)) {
+            viewBinding.dialogChangeAvatarCancelTv.setText(cancelText);
+        }
+    }
+
+
+    /**
+     * 璁剧疆鍙栨秷鎸夐挳鐩戝惉
+     *
+     * @param onCancelOnclickListener -
+     */
+    public void setCancelOnclickListener(onCancelOnclickListener onCancelOnclickListener) {
+        if (onCancelOnclickListener != null) {
+            this.cancelOnclickListener = onCancelOnclickListener;
+        }
+    }
+
+
+    /**
+     * 璁剧疆鎸夐挳1鐩戝惉
+     *
+     * @param onLine1OnclickListener -
+     */
+    public void setLine1OnclickListener(onLine1OnclickListener onLine1OnclickListener) {
+        if (onLine1OnclickListener != null) {
+            this.line1OnclickListener = onLine1OnclickListener;
+        }
+    }
+
+    /**
+     * 璁剧疆鎸夐挳2鐩戝惉
+     *
+     * @param onLine2OnclickListener -
+     */
+    public void setLine2OnclickListener(onLine2OnclickListener onLine2OnclickListener) {
+        if (onLine2OnclickListener != null) {
+            this.line2OnclickListener = onLine2OnclickListener;
+        }
+    }
+
+    public interface onCancelOnclickListener {
+        void Cancel();
+
+    }
+
+    public interface onLine1OnclickListener {
+        void Line1();
+    }
+
+    public interface onLine2OnclickListener {
+        void Line2();
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/widget/popupview/BasePopView.java b/app/src/main/java/com/hdl/photovoltaic/widget/popupview/BasePopView.java
new file mode 100644
index 0000000..349f1f4
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/widget/popupview/BasePopView.java
@@ -0,0 +1,68 @@
+package com.hdl.photovoltaic.widget.popupview;
+
+import android.content.Context;
+import android.graphics.drawable.ColorDrawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.PopupWindow;
+
+/**
+ * Author: Zoro
+ * Date: 2018/11/23
+ * Description: This is BasePopView
+ */
+
+public abstract class BasePopView extends PopupWindow {
+    public View mView;
+    public Context mContext;
+
+    public BasePopView(Context context, int layout) {
+        super(context);
+        this.mContext = context;
+        initPopView(layout);
+    }
+
+    public BasePopView(Context context, int layout, int w, int h) {
+        super(context);
+        this.mContext = context;
+        initPopView(layout, w, h);
+    }
+
+
+    public void initPopView(int layout, int w, int h) {
+        mView = LayoutInflater.from(mContext).inflate(layout, null, false);
+        setContentView(mView);
+        setWidth(w);
+        setHeight(h);
+        this.setFocusable(true);
+        this.setTouchable(true);
+        this.setOutsideTouchable(true);
+        this.setBackgroundDrawable(new ColorDrawable(0));
+        initContentView(mView);
+    }
+
+    public void initPopView(int layout) {
+        initPopView(layout, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
+    }
+
+
+//    public void showPopView(View view) {
+//        showAsDropDown(view, 0, 0);
+//    }
+//
+//    public void showPopView(View view, int x, int y) {
+//        showPopView(view, x, y, Gravity.BOTTOM);
+//    }
+//
+//    public void showPopView(View view, int x, int y, int gravity) {
+//        if (this.isShowing()) {
+//            this.dismiss();
+//        } else {
+//            this.showPopView(view, x, y, gravity);
+//        }
+//    }
+
+    protected abstract void initContentView(View parent);
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/widget/popupview/CameraAlbumPopWindow.java b/app/src/main/java/com/hdl/photovoltaic/widget/popupview/CameraAlbumPopWindow.java
new file mode 100644
index 0000000..6bffa6b
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/widget/popupview/CameraAlbumPopWindow.java
@@ -0,0 +1,532 @@
+package com.hdl.photovoltaic.widget.popupview;
+
+import android.Manifest;
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.graphics.drawable.ColorDrawable;
+import android.media.ExifInterface;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.DocumentsContract;
+import android.provider.MediaStore;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.PopupWindow;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.utils.PermissionUtils;
+import com.hdl.photovoltaic.utils.SharedPreUtils;
+import com.hjq.permissions.OnPermissionCallback;
+import com.hjq.permissions.XXPermissions;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+
+/**
+ * @Author : Zoro.
+ * @Date : 2018/11/22.
+ * @Describe :杩欎釜View涓鐞嗕簡寰堝寮傚父鎹曡幏锛岀洿鎺ョ粨鏉熷氨鍙互浜嗭紝UI涓婇潰閮藉凡缁忓鐞嗗ソ浜�
+ */
+
+public class CameraAlbumPopWindow extends PopupWindow {
+
+    public static final int TAKE_PHOTO = 100;//鍚姩鐩告満鏍囪瘑
+    public static final int SELECT_PHOTO = 200;//鍚姩鐩稿唽鏍囪瘑
+
+    private View mView;
+    private Activity mContext;
+    private TextView tv_mCamera;
+    private TextView tv_Album;
+    private TextView tv_mCancel;
+    //榛樿鍥剧墖鏈�澶т负200k
+    private int photo_Size = 200;
+    private File hdl_Dir;
+    private File outputImagepath;//瀛樺偍鎷嶅畬鐓у悗鐨勫浘鐗�
+    private Bitmap orc_bitmap;//鎷嶇収鍜岀浉鍐岃幏鍙栧浘鐗囩殑Bitmap
+    private int MAX_WIDTH = 800, MAX_HEIGHT = 800;
+
+    //
+    private CameraAlbumListener cameraListener;
+
+    public CameraAlbumPopWindow(Activity context, CameraAlbumListener cameraListener) {
+        super(context);
+        this.cameraListener = cameraListener;
+        initView(context);
+    }
+
+    public CameraAlbumPopWindow(Activity context, int width, int height, CameraAlbumListener cameraListener) {
+        super(context);
+        this.cameraListener = cameraListener;
+        this.MAX_HEIGHT = height;
+        this.MAX_WIDTH = width;
+        initView(context);
+    }
+
+    public CameraAlbumPopWindow(Activity context, int photo_Size, CameraAlbumListener cameraListener) {
+        super(context);
+        this.photo_Size = photo_Size;
+        this.cameraListener = cameraListener;
+        initView(context);
+    }
+
+    /**
+     * @param context 涓婁笅鏂�
+     * @param tag     0锛氭媿鐓�  1锛氱浉鍐�
+     */
+    private void checkPermission_After(final Activity context, final int tag) {
+        String permission = Manifest.permission.CAMERA;
+        int status = PermissionUtils.getAuthorizeStaus(context, permission);
+
+        switch (status) {
+            case PermissionUtils.STATUS_SUCCESS:
+                dismiss();
+                if (0 == tag) {
+                    take_photo();
+                } else {
+                    select_photo();
+                }
+                break;
+            case PermissionUtils.STATUS_REFUSE:
+            case PermissionUtils.STATUS_DEFAULT:
+                XXPermissions.with(context)
+                        .permission(permission)
+                        .request(new OnPermissionCallback() {
+                            @Override
+                            public void onGranted(List<String> permissions, boolean all) {
+                                dismiss();
+                                SharedPreUtils.putBoolean(permission, true);
+                                if (0 == tag) {
+                                    take_photo();
+                                } else {
+                                    select_photo();
+                                }
+                            }
+
+                            @Override
+                            public void onDenied(List<String> permissions, boolean never) {
+                                dismiss();
+                                SharedPreUtils.putBoolean(permission, true);
+                            }
+                        });
+                break;
+            case PermissionUtils.STATUS_REFUSE_PERMANENT:
+                HdlThreadLogic.toast(mContext, R.string.permission_open);
+                break;
+        }
+    }
+
+
+    private void initView(Activity context) {
+        hdl_Dir = context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
+        System.out.println("===========" + hdl_Dir.getAbsolutePath());
+        if (!hdl_Dir.exists()) {
+            boolean mkdirs = hdl_Dir.mkdirs();
+            if (!mkdirs) {
+                HdlThreadLogic.toast(mContext, R.string.camera_album_file_create_fial);
+            }
+        }
+        mContext = context;
+        mView = LayoutInflater.from(mContext).inflate(R.layout.view_camera_album, null);
+        setContentView(mView);
+        tv_mCamera = mView.findViewById(R.id.tv_Camera);
+        tv_Album = mView.findViewById(R.id.tv_Album);
+        tv_mCancel = mView.findViewById(R.id.tv_Cancel);
+        this.setWidth(RelativeLayout.LayoutParams.MATCH_PARENT);
+        this.setHeight(RelativeLayout.LayoutParams.WRAP_CONTENT);
+        //鐐瑰嚮绌虹櫧鍦版柟鍏抽棴寮圭獥(3涓涓�璧烽殣钘�)
+        this.setFocusable(true);
+        this.setTouchable(true);
+        this.setOutsideTouchable(true);
+        this.setBackgroundDrawable(new ColorDrawable(0));
+
+        mView.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                int height = mView.findViewById(R.id.ll_Pop).getTop();
+                int y = (int) event.getY();
+                if (event.getAction() == MotionEvent.ACTION_UP) {
+                    if (y < height) {
+                        dismiss();
+                    }
+                }
+                return true;
+            }
+        });
+        tv_mCancel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dismiss();
+            }
+        });
+        tv_mCamera.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                checkPermission_After(mContext, 0);
+
+            }
+        });
+        tv_Album.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                checkPermission_After(mContext, 1);
+            }
+        });
+    }
+
+    /**
+     * 鎷嶇収鑾峰彇鍥剧墖
+     **/
+    private void take_photo() {
+        //鑾峰彇绯荤当鐗堟湰
+        int currentapiVersion = Build.VERSION.SDK_INT;
+        // 婵�娲荤浉鏈�
+        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+        // 鍒ゆ柇瀛樺偍鍗℃槸鍚﹀彲浠ョ敤锛屽彲鐢ㄨ繘琛屽瓨鍌�
+        SimpleDateFormat timeStampFormat = new SimpleDateFormat(
+                "yyyy_MM_dd_HH_mm_ss", Locale.ENGLISH);
+        String filename = timeStampFormat.format(new Date());
+        outputImagepath = new File(hdl_Dir,
+                filename + ".jpg");
+        if (currentapiVersion < 24) {
+            // 浠庢枃浠朵腑鍒涘缓uri
+            Uri uri = Uri.fromFile(outputImagepath);
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
+        } else {
+            //鍏煎android7.0 浣跨敤鍏变韩鏂囦欢鐨勫舰寮�
+            ContentValues contentValues = new ContentValues(1);
+            contentValues.put(MediaStore.Images.Media.DATA, outputImagepath.getAbsolutePath());
+            Uri uri = mContext.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
+//                Uri photoURI= FileProvider.getUriForFile(mContext,"com.hdl.debugtreasure.dc.fileprovider",outputImagepath);
+//                intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+//                intent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
+        }
+        // 寮�鍚竴涓甫鏈夎繑鍥炲�肩殑Activity锛岃姹傜爜涓篜HOTO_REQUEST_CAREMA
+        ((Activity) mContext).startActivityForResult(intent, TAKE_PHOTO);
+
+    }
+
+    /**
+     * 鎷嶇収鑾峰彇瀹屽浘鐗囪鎵ц鐨勬柟娉�(鏍规嵁鍥剧墖璺緞鏄剧ず鍥剧墖)
+     */
+    public void displayImage() {
+        if (null == outputImagepath) {
+            HdlThreadLogic.toast(mContext, R.string.camera_album_file_save_fial);
+        } else {
+            if (!TextUtils.isEmpty(outputImagepath.getAbsolutePath())) {
+                orc_bitmap = BitmapFactory.decodeFile(outputImagepath.getAbsolutePath());//鑾峰彇鍥剧墖
+                saveBitmap(comp(ImgUpdateDirection(outputImagepath.getAbsolutePath()))); //鍘嬬缉鍥剧墖
+            } else {
+                HdlThreadLogic.toast(mContext, R.string.camera_album_file_get_fial);
+            }
+        }
+    }
+
+    /**
+     * 鐩稿唽鑾峰彇瀹屽浘鐗囪鎵ц鐨勬柟娉�(鏍规嵁鍥剧墖璺緞鏄剧ず鍥剧墖)
+     */
+    private void displayImage(String imagePath) {
+        if (!TextUtils.isEmpty(imagePath)) {
+            orc_bitmap = BitmapFactory.decodeFile(imagePath);//鑾峰彇鍥剧墖
+            saveBitmap(comp(ImgUpdateDirection(imagePath))); //鍘嬬缉鍥剧墖
+        } else {
+            HdlThreadLogic.toast(mContext, R.string.camera_album_file_get_fial);
+        }
+    }
+
+    //姣斾緥鍘嬬缉
+    private Bitmap comp(Bitmap image) {
+        if (null == image) {
+            HdlThreadLogic.toast(mContext, R.string.camera_album_system_fial);
+            return null;
+        } else {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
+//            if (baos.toByteArray().length / 1024 > 1024) {//鍒ゆ柇濡傛灉鍥剧墖澶т簬1M,杩涜鍘嬬缉閬垮厤鍦ㄧ敓鎴愬浘鐗囷紙BitmapFactory.decodeStream锛夋椂婧㈠嚭
+//                baos.reset();//閲嶇疆baos鍗虫竻绌篵aos
+//                image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//杩欓噷鍘嬬缉50%锛屾妸鍘嬬缉鍚庣殑鏁版嵁瀛樻斁鍒癰aos涓�
+//            }
+            ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
+            BitmapFactory.Options newOpts = new BitmapFactory.Options();
+            //寮�濮嬭鍏ュ浘鐗囷紝姝ゆ椂鎶妎ptions.inJustDecodeBounds 璁惧洖true浜�
+            newOpts.inJustDecodeBounds = true;
+            Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
+            newOpts.inJustDecodeBounds = false;
+            int w = newOpts.outWidth;
+            int h = newOpts.outHeight;
+            //鐜板湪涓绘祦鎵嬫満姣旇緝澶氭槸800*480鍒嗚鲸鐜囷紝鎵�浠ラ珮鍜屽鎴戜滑璁剧疆涓�
+            //缂╂斁姣斻�傜敱浜庢槸鍥哄畾姣斾緥缂╂斁锛屽彧鐢ㄩ珮鎴栬�呭鍏朵腑涓�涓暟鎹繘琛岃绠楀嵆鍙�
+            int be = 1;//be=1琛ㄧず涓嶇缉鏀�
+            while (((int) w / be) > MAX_WIDTH || ((int) h / be) > MAX_HEIGHT) {
+                be++;
+            }
+            if (be <= 0)
+                be = 1;
+
+            newOpts.inSampleSize = be;//璁剧疆缂╂斁姣斾緥
+            System.out.println("--------newOpts.inSampleSize==" + newOpts.inSampleSize);
+            newOpts.inPreferredConfig = Bitmap.Config.RGB_565;//闄嶄綆鍥剧墖浠嶢RGB888鍒癛GB565
+            //閲嶆柊璇诲叆鍥剧墖锛屾敞鎰忔鏃跺凡缁忔妸options.inJustDecodeBounds 璁惧洖false浜�
+            isBm = new ByteArrayInputStream(baos.toByteArray());
+            bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
+            return bitmap;//鍘嬬缉濂芥瘮渚嬪ぇ灏忓悗鍐嶈繘琛岃川閲忓帇缂�
+        }
+    }
+
+    /**
+     * 璐ㄩ噺鍘嬬缉鏂规硶
+     *
+     * @param image
+     * @return
+     */
+    private Bitmap compressImage(Bitmap image) {
+        if (image != null) {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//璐ㄩ噺鍘嬬缉鏂规硶锛岃繖閲�100琛ㄧず涓嶅帇缂╋紝鎶婂帇缂╁悗鐨勬暟鎹瓨鏀惧埌baos涓�
+            int options = 100;
+            while (baos.toByteArray().length / 1024 > 100) { //寰幆鍒ゆ柇濡傛灉鍘嬬缉鍚庡浘鐗囨槸鍚﹀ぇ浜�100kb,澶т簬缁х画鍘嬬缉
+                baos.reset();//閲嶇疆baos鍗虫竻绌篵aos
+                options -= 10;//姣忔閮藉噺灏�10
+                image.compress(Bitmap.CompressFormat.JPEG, options, baos);//杩欓噷鍘嬬缉options%锛屾妸鍘嬬缉鍚庣殑鏁版嵁瀛樻斁鍒癰aos涓�
+            }
+            ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//鎶婂帇缂╁悗鐨勬暟鎹産aos瀛樻斁鍒癇yteArrayInputStream涓�
+            Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//鎶夿yteArrayInputStream鏁版嵁鐢熸垚鍥剧墖
+            return bitmap;
+        } else {
+            return null;
+        }
+
+    }
+
+    /**
+     * 淇濆瓨鏂规硶
+     */
+    private void saveBitmap(Bitmap bitmap) {
+        if (null == bitmap) {
+            HdlThreadLogic.toast(mContext, mContext.getResources().getString(R.string.camera_album_system_fial));
+        } else {
+            SimpleDateFormat timeStampFormat = new SimpleDateFormat(
+                    "yyyy_MM_dd_HH_mm_ss", Locale.CHINESE);
+            String filename = timeStampFormat.format(new Date());
+            File f = new File(hdl_Dir,
+                    filename + ".jpg");
+            if (f.exists()) {
+                f.delete();
+            }
+            try {
+                FileOutputStream out = new FileOutputStream(f);
+                bitmap.compress(Bitmap.CompressFormat.JPEG, 60, out);
+                //杩涜鏁版嵁鐨勫鐞�
+                out.flush();
+                out.close();
+                //淇濆瓨濂藉皬鍥句互鍚庡垹闄ゅぇ鍥�(鎷嶇収闇�瑕�)
+                deleteBigPhoto();
+                cameraListener.successCallBack(f);
+            } catch (FileNotFoundException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            } catch (IOException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 鍘嬬缉鍥剧墖淇濆瓨涔嬪悗闇�瑕佸垹闄ゅ師鍥�
+     */
+    private void deleteBigPhoto() {
+        if (null != outputImagepath) {
+            outputImagepath.delete();
+        }
+    }
+
+    //鏀瑰彉鎷嶅畬鐓у悗鍥剧墖鏂瑰悜涓嶆鐨勯棶棰�
+    private Bitmap ImgUpdateDirection(String filepath) {
+        int digree = 0;//鍥剧墖鏃嬭浆鐨勮搴�
+        //鏍规嵁鍥剧墖鐨刄RI鑾峰彇鍥剧墖鐨勭粷瀵硅矾寰�
+        //String filepath = ImgUriDoString.getRealFilePath(getApplicationContext(), uri);
+        //鏍规嵁鍥剧墖鐨刦ilepath鑾峰彇鍒颁竴涓狤xifInterface鐨勫璞�
+        ExifInterface exif = null;
+        try {
+            exif = new ExifInterface(filepath);
+            if (exif != null) {
+                // 璇诲彇鍥剧墖涓浉鏈烘柟鍚戜俊鎭�
+                int ori = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
+                // 璁$畻鏃嬭浆瑙掑害
+                switch (ori) {
+                    case ExifInterface.ORIENTATION_ROTATE_90:
+                        digree = 90;
+                        break;
+                    case ExifInterface.ORIENTATION_ROTATE_180:
+                        digree = 180;
+                        break;
+                    case ExifInterface.ORIENTATION_ROTATE_270:
+                        digree = 270;
+                        break;
+                    default:
+                        digree = 0;
+                        break;
+                }
+            }
+            //濡傛灉鍥剧墖涓嶄负0
+            if (digree != 0) {
+                // 鏃嬭浆鍥剧墖
+                Matrix m = new Matrix();
+                m.postRotate(digree);
+                orc_bitmap = Bitmap.createBitmap(orc_bitmap, 0, 0, orc_bitmap.getWidth(),
+                        orc_bitmap.getHeight(), m, true);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            exif = null;
+        }
+        return orc_bitmap;
+    }
+
+
+    /**
+     * 浠庣浉鍐屼腑鑾峰彇鍥剧墖
+     */
+    private void select_photo() {
+        String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+        int status = PermissionUtils.getAuthorizeStaus(mContext, permission);
+
+        switch (status) {
+            case PermissionUtils.STATUS_SUCCESS:
+                openAlbum();
+                break;
+            case PermissionUtils.STATUS_REFUSE:
+            case PermissionUtils.STATUS_DEFAULT:
+                XXPermissions.with(mContext)
+                        .permission(permission)
+                        .request(new OnPermissionCallback() {
+                            @Override
+                            public void onGranted(List<String> permissions, boolean all) {
+                                SharedPreUtils.putBoolean(permission, true);
+                                openAlbum();
+                            }
+
+                            @Override
+                            public void onDenied(List<String> permissions, boolean never) {
+                                SharedPreUtils.putBoolean(permission, true);
+                            }
+                        });
+                break;
+            case PermissionUtils.STATUS_REFUSE_PERMANENT:
+                HdlThreadLogic.toast(mContext, R.string.permission_open);
+                break;
+        }
+    }
+
+    /**
+     * 鎵撳紑鐩稿唽鐨勬柟娉�
+     */
+    private void openAlbum() {
+        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
+        ((Activity) mContext).startActivityForResult(intent, SELECT_PHOTO);
+    }
+
+
+    /**
+     * 4.4浠ヤ笅绯荤粺澶勭悊鍥剧墖鐨勬柟娉�
+     */
+    public void handleImageBeforeKitKat(Intent data) {
+        Uri uri = data.getData();
+        String imagePath = getImagePath(uri, null);
+        displayImage(imagePath);
+    }
+
+    /**
+     * 4.4鍙婁互涓婄郴缁熷鐞嗗浘鐗囩殑鏂规硶
+     */
+    @TargetApi(Build.VERSION_CODES.KITKAT)
+    public void handleImgeOnKitKat(Intent data) {
+        String imagePath = null;
+        Uri uri = data.getData();
+        if (DocumentsContract.isDocumentUri(mContext, uri)) {
+            String docId = DocumentsContract.getDocumentId(uri);        //鏁版嵁琛ㄩ噷鎸囧畾鐨勮
+            if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
+                String id = docId.split(":")[1];
+                String selection = MediaStore.Images.Media._ID + "=" + id;
+                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
+            } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
+                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
+                imagePath = getImagePath(contentUri, null);
+            }
+
+        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
+            imagePath = getImagePath(uri, null);
+        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
+            imagePath = uri.getPath();
+        }
+        displayImage(imagePath);
+    }
+
+    /**
+     * 閫氳繃uri鍜宻election鏉ヨ幏鍙栫湡瀹炵殑鍥剧墖璺緞,浠庣浉鍐岃幏鍙栧浘鐗囨椂瑕佺敤
+     */
+    private String getImagePath(Uri uri, String selection) {
+        String path = null;
+        Cursor cursor = mContext.getContentResolver().query(uri, null, selection, null, null);
+        if (cursor != null) {
+            if (cursor.moveToFirst()) {
+                int columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
+                path = cursor.getString(columnIndex);
+            }
+            cursor.close();
+        }
+        return path;
+    }
+
+    @Override
+    public void dismiss() {
+        super.dismiss();
+        backgroundAlpha(1f);
+    }
+
+
+    //鐢ㄤ簬popwindow鏄剧ず闅愯棌鏃跺�欒儗鏅殑棰滆壊鏇存崲
+    public void backgroundAlpha(float bgAlpha) {
+        WindowManager.LayoutParams lp = ((Activity) mContext).getWindow().getAttributes();
+        ((Activity) mContext).getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+        lp.alpha = bgAlpha; //0.0-1.0
+        ((Activity) mContext).getWindow().setAttributes(lp);
+    }
+
+    public void show(View view, int mode, int x, int y) {
+        showAtLocation(view, mode, x, y);
+        backgroundAlpha(0.5f);
+    }
+
+
+    public interface CameraAlbumListener {
+        void successCallBack(File a);
+    }
+
+
+}
diff --git a/app/src/main/res/layout/dialog_change_avatar.xml b/app/src/main/res/layout/dialog_change_avatar.xml
new file mode 100644
index 0000000..59d4ec7
--- /dev/null
+++ b/app/src/main/res/layout/dialog_change_avatar.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:id="@+id/dialog_change_photograph"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_54"
+        android:background="@color/text_FFFFFFFF"
+        android:gravity="center"
+        android:orientation="horizontal"
+        app:layout_constraintBottom_toTopOf="@+id/line"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <TextView
+            android:id="@+id/dialog_change_photograph_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/me_personal_data_photograph"
+            android:textColor="@color/text_222222"
+            android:textSize="16sp"
+
+            />
+
+
+    </LinearLayout>
+
+    <View
+        android:id="@+id/line"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/text_E1E1E1"
+        app:layout_constraintBottom_toTopOf="@+id/dialog_change_avatar_select_album_ll"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+    <LinearLayout
+        android:id="@+id/dialog_change_avatar_select_album_ll"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_54"
+        android:layout_marginBottom="8dp"
+        android:background="@color/text_FFFFFFFF"
+        android:gravity="center"
+        android:orientation="horizontal"
+        app:layout_constraintBottom_toTopOf="@+id/dialog_change_avatar_cancel_ll"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+
+        >
+
+        <TextView
+            android:id="@+id/dialog_change_avatar_select_album_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/me_personal_data_select_album"
+            android:textColor="@color/text_222222"
+            android:textSize="16sp"
+
+            />
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/dialog_change_avatar_cancel_ll"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_54"
+        android:background="@color/text_FFFFFFFF"
+        android:gravity="center"
+        android:orientation="horizontal"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <TextView
+            android:id="@+id/dialog_change_avatar_cancel_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/loading_cancel"
+            android:textColor="@color/text_FF5757"
+            android:textSize="16sp"
+
+            />
+    </LinearLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_camera_album.xml b/app/src/main/res/layout/view_camera_album.xml
new file mode 100644
index 0000000..8c91235
--- /dev/null
+++ b/app/src/main/res/layout/view_camera_album.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/ll_Pop"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tv_Camera"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_54"
+            android:background="@color/white"
+            android:gravity="center"
+            android:text="@string/me_personal_data_photograph"
+            android:textColor="@color/text_222222"
+            android:textSize="16sp" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_0_5"
+            android:background="@color/text_E1E1E1" />
+
+        <TextView
+            android:id="@+id/tv_Album"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_54"
+            android:background="@color/white"
+            android:gravity="center"
+            android:text="@string/me_personal_data_select_album"
+            android:textColor="@color/text_222222"
+            android:textSize="16sp" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_8" />
+
+        <TextView
+            android:id="@+id/tv_Cancel"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_54"
+            android:background="@color/white"
+            android:gravity="center"
+            android:text="@string/loading_cancel"
+            android:textColor="@color/text_FF5757"
+            android:textSize="16sp" />
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index ac52b88..6a18a38 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -39,6 +39,7 @@
     <color name="text_F5F7FA">#F5F7FA</color>
     <color name="text_FF5757">#FF5757</color>
     <color name="text_565758">#565758</color>
+    <color name="text_222222">#222222</color>
 
 
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f7ff99c..35b26cd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -112,6 +112,8 @@
     <string name="me_personal_data_user_name">鐢ㄦ埛鍚�</string>
     <string name="me_personal_data_role">瑙掕壊</string>
     <string name="me_personal_data_super_admin">瓒呯骇绠$悊鍛�</string>
+    <string name="me_personal_data_photograph">鎷嶇収</string>
+    <string name="me_personal_data_select_album">浠庣浉鍐屼腑閫夋嫨</string>
 
     <!--app鏇存柊-->
     <string name="app_version_number">鐗堟湰鍙�</string>
@@ -146,6 +148,20 @@
     <string name="loading_privacy">闅愮鏉冩斂绛栧強鏈嶅姟鏉℃</string>
     <string name="loading_privacy_server">涓轰簡鏇村ソ鐨勪繚闅滄偍鐨勫悎娉曟潈鐩婏紝璇锋偍闃呰骞跺悓鎰忎互涓嬪崗璁�婇殣绉佹潈鏀跨瓥銆嬪拰銆婃湇鍔℃潯娆俱��</string>
     <string name="kill_app">鍐嶆寜涓�娆¢��鍑哄簲鐢�</string>
+    <string name="loading_not_supported">鎶辨瓑,鏆備笉鏀寔.</string>
+
+
+    <!--    鏉冮檺       -->
+    <string name="camera_album_file_create_fial">鏂囦欢鍒涘缓澶辫触</string>
+    <string name="camera_album_file_save_fial">淇濆瓨璺緞寮傚父锛岃閲嶈瘯</string>
+    <!--    鏉冮檺       -->
+
+    <!--    鍥剧墖涓婁紶       -->
+    <string name="camera_album_file_get_fial">鍥剧墖鑾峰彇澶辫触</string>
+    <string name="camera_album_system_fial">绯荤粺澶勭悊鍥剧墖澶辫触锛岃閲嶈瘯</string>
+    <string name="apk_update_content">涓轰簡姝e父鍗囩骇娌充笢APP锛岃鐐瑰嚮璁剧疆鎸夐挳锛屽厑璁稿畨瑁呮湭鐭ユ潵婧愬簲鐢紝鏈姛鑳藉彧闄愮敤浜庢渤涓淎PP鐗堟湰鍗囩骇锛孉ndroid 11鐗堟湰鍙婁互涓婇渶瑕佸湪鎺堟潈涔嬪悗閲嶆柊涓嬭浇瀹夎銆�</string>
+    <string name="apk_update_sure">璁剧疆</string>
+    <string name="permission_open">璇峰埌璁剧疆涓墦寮�鏉冮檺</string>
 
 
 </resources>
\ No newline at end of file

--
Gitblit v1.8.0