app/build.gradle
@@ -90,7 +90,7 @@ */ android.applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "photovoltaic_v${versionName}_${generateTime()}_${getEnvironmentVersion(2)}.apk" outputFileName = "photovoltaic_v${versionName}_${generateTime()}_${getEnvironmentVersion(4)}.apk" } } app/src/main/AndroidManifest.xml
@@ -8,10 +8,10 @@ tools:ignore="ProtectedPermissions" /> <!--Android13 照片--> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!--Android13 视频--> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- <!–Android13 照片–>--> <!-- <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />--> <!-- <!–Android13 视频–>--> <!-- <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />--> <!--Android13 音频--> <!-- <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />--> <uses-permission android:name="android.permission.VIBRATE" /> app/src/main/java/com/hdl/photovoltaic/ui/me/CPersonalDataActivity.java
@@ -114,29 +114,29 @@ //Manifest.permission.WRITE_EXTERNAL_STORAGE 读写设备上的照片以及文件 //generalPermission.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}); //Android 13以上用别的权限 if (Build.VERSION.SDK_INT >= 33) { PermissionUtils.requestPermissionsResultCallback(_mActivity, Manifest.permission.READ_MEDIA_IMAGES, new PermissionUtils.PermissionState() { @Override public void Success(int value) { if (value == PermissionUtils.STATUS_REFUSE_PERMANENT) { // HdlThreadLogic.toast(_mActivity, R.string.permission_open); return; } changedUserAvatar(); } }, true); } else { // if (Build.VERSION.SDK_INT >= 33) { // PermissionUtils.requestPermissionsResultCallback(_mActivity, Manifest.permission.READ_MEDIA_IMAGES, new PermissionUtils.PermissionState() { // @Override // public void Success(int value) { // if (value == PermissionUtils.STATUS_REFUSE_PERMANENT) { //// HdlThreadLogic.toast(_mActivity, R.string.permission_open); // return; // } // changedUserAvatar(); // } // }, true); // } else { PermissionUtils.requestPermissionsResultCallback(_mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE, new PermissionUtils.PermissionState() { @Override public void Success(int value) { if (value == PermissionUtils.STATUS_REFUSE_PERMANENT) { if (value == PermissionUtils.STATUS_REFUSE_PERMANENT | value == PermissionUtils.STATUS_REFUSE) { // HdlThreadLogic.toast(_mActivity, R.string.permission_open); return; } changedUserAvatar(); } }, true); } // } } }); app/src/main/java/com/hdl/photovoltaic/ui/newC/PowerStationsListEdit.java
@@ -31,6 +31,7 @@ import com.hdl.photovoltaic.utils.LocalManageUtil; import com.hdl.photovoltaic.utils.PermissionUtils; import com.hdl.photovoltaic.widget.ConfirmationCancelDialog; import com.hdl.photovoltaic.widget.PermissionExplanationDialog; import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus; import org.greenrobot.eventbus.Subscribe; @@ -123,10 +124,13 @@ viewBinding.addPowerStationTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 未授权 如果应用程序没有所需的权限,则显示解释说明 PermissionExplanationDialog.getInstance().showPortConflictPdDialog(_mActivity, getString(R.string.camera_storage_instructions), getString(R.string.camera_storage_purpose)); PermissionUtils.requestPermissionsResultCallback(_mActivity, Manifest.permission.CAMERA, new PermissionUtils.PermissionState() { @Override public void Success(int value) { if (value == PermissionUtils.STATUS_REFUSE_PERMANENT) { PermissionExplanationDialog.getInstance().dismiss(); if (value == PermissionUtils.STATUS_REFUSE_PERMANENT | value == PermissionUtils.STATUS_REFUSE) { // HdlThreadLogic.toast(_mActivity, R.string.permission_open); return; } app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java
@@ -139,12 +139,15 @@ public void onGranted(List<String> permissions, boolean all) { SharedPreUtils.putBoolean(permission, true); if (permissionStateCallback != null) { permissionStateCallback.Success(STATUS_REFUSE); permissionStateCallback.Success(STATUS_SUCCESS); } } @Override public void onDenied(List<String> permissions, boolean never) { if (permissionStateCallback != null) { permissionStateCallback.Success(STATUS_REFUSE); } if (is_skip) { SharedPreUtils.putBoolean(permission, true); } @@ -155,6 +158,9 @@ // if (permissionStateCallback != null) { // permissionStateCallback.Success(STATUS_REFUSE_PERMANENT); // } if (permissionStateCallback != null) { permissionStateCallback.Success(STATUS_REFUSE_PERMANENT); } if (is_skip) { HdlDialogLogic.getInstance().showSettingPermissionDialog(activity); } app/src/main/java/com/hdl/photovoltaic/widget/PermissionExplanationDialog.java
New file @@ -0,0 +1,82 @@ package com.hdl.photovoltaic.widget; import android.app.Dialog; import android.content.Context; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.TextView; import com.hdl.photovoltaic.R; import com.hdl.photovoltaic.other.HdlCommonLogic; import com.hdl.photovoltaic.utils.UnitConversionUtils; import java.util.Objects; public class PermissionExplanationDialog { private Dialog portConflictPd; private volatile static PermissionExplanationDialog mInstance; public PermissionExplanationDialog() { } public static PermissionExplanationDialog getInstance() { if (mInstance == null) { synchronized (PermissionExplanationDialog.class) { if (mInstance == null) { mInstance = new PermissionExplanationDialog(); } } } return mInstance; } public void showPortConflictPdDialog(Context context, String description, String purpose) { if (portConflictPd != null) { try { portConflictPd.show(); } catch (Exception e) { } } else { Dialog dialog = new Dialog(context, R.style.video_dialog); View view = LayoutInflater.from(context).inflate(R.layout.dialog_permission_explanation, null); dialog.setContentView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); WindowManager windowManager = Objects.requireNonNull(dialog.getWindow()).getWindowManager(); Display display = windowManager.getDefaultDisplay(); WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); lp.width = (int) (display.getWidth() * 0.9); //设置宽度 dialog.getWindow().setGravity(Gravity.TOP); lp.y = (int) UnitConversionUtils.dpToPx(context, 44); dialog.getWindow().setAttributes(lp); TextView tvDescription = view.findViewById(R.id.tv_description); tvDescription.setText(description); TextView tvPurpose = view.findViewById(R.id.tv_purpose); tvPurpose.setText(purpose); portConflictPd = dialog; portConflictPd.show(); } } public void dismiss() { try { if (portConflictPd != null) { portConflictPd.dismiss(); portConflictPd = null; } } catch (Exception e) { e.printStackTrace(); } } } app/src/main/res/drawable/oval_color_white_18.xml
New file @@ -0,0 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <solid android:color="@color/white" /> <corners android:topLeftRadius="18dp" android:topRightRadius="18dp" android:bottomLeftRadius="18dp" android:bottomRightRadius="18dp"/> </shape> </item> </selector> app/src/main/res/layout/dialog_permission_explanation.xml
New file @@ -0,0 +1,45 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content"> <RelativeLayout android:layout_width="343dp" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:background="@drawable/oval_color_white_18"> <TextView android:id="@+id/tv_description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/dp_16" android:layout_marginTop="@dimen/dp_20" android:text="111111" android:textColor="#0A0A0A" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_purpose" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tv_description" android:layout_marginStart="@dimen/dp_16" android:layout_marginTop="@dimen/dp_12" android:text="222222" android:textColor="#0A0A0A" android:textSize="16sp" /> <View android:id="@+id/view_split" android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_below="@id/tv_purpose" android:layout_marginTop="@dimen/dp_20" /> </RelativeLayout> </RelativeLayout> app/src/main/res/values-en/strings.xml
@@ -333,5 +333,7 @@ <string name="radio">Radio</string> <string name="min">Min</string> <string name="max">Max</string> <string name="camera_storage_instructions">Camera and Storage Permission Usage Instructions:</string> <string name="camera_storage_purpose">Used for scanning codes, taking photos, uploading pictures from albums, reading and writing photos on devices, and other scenarios</string> </resources> app/src/main/res/values-zh/strings.xml
@@ -330,6 +330,8 @@ <string name="radio">比率</string> <string name="min">最小值</string> <string name="max">最大值</string> <string name="camera_storage_instructions">相机、存储权限使用说明:</string> <string name="camera_storage_purpose">用于扫码、拍照、从相册上传图片、读写设备上的照片等场景</string> </resources> app/src/main/res/values/strings.xml
@@ -330,6 +330,8 @@ <string name="radio">比率</string> <string name="min">最小值</string> <string name="max">最大值</string> <string name="camera_storage_instructions">相机、存储权限使用说明:</string> <string name="camera_storage_purpose">用于扫码、拍照、从相册上传图片、读写设备上的照片等场景</string> </resources> app/src/main/res/values/themes.xml
@@ -81,4 +81,21 @@ <item name="android:windowFullscreen">true</item> </style> <style name="video_dialog" parent="@android:style/Theme.Dialog"> <!-- 背景颜色及和透明程度 --> <item name="android:windowBackground">@color/transparent</item> <!-- 是否去除标题 --> <item name="android:windowNoTitle">true</item> <!-- 是否去除边框 --> <item name="android:windowFrame">@null</item> <!-- 是否浮现在activity之上 --> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">true</item> <!-- 是否开启半透明的背景 --> <item name="android:backgroundDimEnabled">true</item> <!-- 半透明的背景的透明度 --> <item name="android:backgroundDimAmount">0.6</item> <item name="android:background">@color/transparent</item> </style> </resources> gradle.properties
@@ -21,3 +21,4 @@ android.nonTransitiveRClass=true # 可以将v4,v7库转成Android X android.enableJetifier=true android.bundle.enableUncompressedNativeLibs=false pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java
@@ -1,13 +1,13 @@ package com.bigkoo.pickerview; import android.app.Application; import android.test.ApplicationTestCase; /** * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> */ public class ApplicationTest extends ApplicationTestCase<Application> { public ApplicationTest() { super(Application.class); } } //import android.test.ApplicationTestCase; // ///** // * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> // */ //public class ApplicationTest extends ApplicationTestCase<Application> { // public ApplicationTest() { // super(Application.class); // } //} wheelview/src/androidTest/java/test/wheelview/ExampleInstrumentedTest.java
@@ -1,26 +1,26 @@ package test.wheelview; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; /** * Instrumentation test, which will execute on an Android device. * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test public void useAppContext() throws Exception { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); assertEquals("test.wheelview.test", appContext.getPackageName()); } } //import android.support.test.InstrumentationRegistry; //import android.support.test.runner.AndroidJUnit4; // //import org.junit.Test; //import org.junit.runner.RunWith; // //import static org.junit.Assert.*; // ///** // * Instrumentation test, which will execute on an Android device. // * // * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> // */ //@RunWith(AndroidJUnit4.class) //public class ExampleInstrumentedTest { // @Test // public void useAppContext() throws Exception { // // Context of the app under test. // Context appContext = InstrumentationRegistry.getTargetContext(); // // assertEquals("test.wheelview.test", appContext.getPackageName()); // } //}