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