修复应用初始设置问题,添加应用权限申请。
This commit is contained in:
		| @@ -1,8 +1,8 @@ | |||||||
| #Created by .winboll/winboll_app_build.gradle | #Created by .winboll/winboll_app_build.gradle | ||||||
| #Wed Oct 01 21:03:35 HKT 2025 | #Wed Oct 01 13:21:26 GMT 2025 | ||||||
| stageCount=6 | stageCount=6 | ||||||
| libraryProject= | libraryProject= | ||||||
| baseVersion=15.0 | baseVersion=15.0 | ||||||
| publishVersion=15.0.5 | publishVersion=15.0.5 | ||||||
| buildCount=0 | buildCount=3 | ||||||
| baseBetaVersion=15.0.6 | baseBetaVersion=15.0.6 | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package cc.winboll.studio.positions; | package cc.winboll.studio.positions; | ||||||
|  |  | ||||||
|  | import android.Manifest; | ||||||
| import android.app.Activity; | import android.app.Activity; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
| import android.content.pm.PackageManager; | import android.content.pm.PackageManager; | ||||||
| @@ -9,7 +10,10 @@ import android.view.View; | |||||||
| import android.widget.Button; | import android.widget.Button; | ||||||
| import android.widget.CompoundButton; | import android.widget.CompoundButton; | ||||||
| import android.widget.Switch; | import android.widget.Switch; | ||||||
|  | import android.widget.Toast; | ||||||
|  | import androidx.annotation.NonNull; | ||||||
| import androidx.appcompat.widget.Toolbar; | import androidx.appcompat.widget.Toolbar; | ||||||
|  | import androidx.core.content.ContextCompat; | ||||||
| import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; | import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; | ||||||
| import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; | import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; | ||||||
| import cc.winboll.studio.libappbase.LogUtils; | import cc.winboll.studio.libappbase.LogUtils; | ||||||
| @@ -17,7 +21,6 @@ import cc.winboll.studio.positions.activities.LocationActivity; | |||||||
| import cc.winboll.studio.positions.activities.WinBoLLActivity; | import cc.winboll.studio.positions.activities.WinBoLLActivity; | ||||||
| import cc.winboll.studio.positions.services.MainService; | import cc.winboll.studio.positions.services.MainService; | ||||||
| import cc.winboll.studio.positions.utils.AppConfigsUtil; | import cc.winboll.studio.positions.utils.AppConfigsUtil; | ||||||
| import com.hjq.toast.ToastUtils; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 主页面:仅负责 |  * 主页面:仅负责 | ||||||
| @@ -27,8 +30,9 @@ import com.hjq.toast.ToastUtils; | |||||||
|  */ |  */ | ||||||
| public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { | public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { | ||||||
|     public static final String TAG = "MainActivity"; |     public static final String TAG = "MainActivity"; | ||||||
|     // 位置权限请求码(自定义唯一标识) |     // 权限请求码(建议定义为类常量,避免魔法值) | ||||||
| 	private static final int REQUEST_LOCATION_PERMISSIONS = 1001; | 	private static final int REQUEST_LOCATION_PERMISSIONS = 1001; | ||||||
|  | 	private static final int REQUEST_BACKGROUND_LOCATION_PERMISSION = 1002; | ||||||
| 	 | 	 | ||||||
|     // UI 控件:服务控制开关、顶部工具栏 |     // UI 控件:服务控制开关、顶部工具栏 | ||||||
|     private Switch mServiceSwitch; |     private Switch mServiceSwitch; | ||||||
| @@ -206,49 +210,57 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity { | |||||||
|         return hasForegroundPerm && hasBackgroundPerm; |         return hasForegroundPerm && hasBackgroundPerm; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 申请「前台+后台」位置权限(弹出系统权限弹窗,适配版本差异) |  | ||||||
|      */ |  | ||||||
| 	private void requestLocationPermissions() { | 	private void requestLocationPermissions() { | ||||||
|         String[] permissions; | 		// 1. 先判断前台定位权限(ACCESS_FINE_LOCATION)是否已授予 | ||||||
|         // Java7 显式版本判断:Android 10+ 需同时申请前台+后台权限 | 		if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) | ||||||
|  |             != PackageManager.PERMISSION_GRANTED) { | ||||||
|  | 			// 1.1 未授予前台权限:先申请前台权限(API 30+ 后台权限依赖前台权限) | ||||||
|  | 			String[] foregroundPermissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION}; | ||||||
|  | 			// 对API 23+(Android 6.0)动态申请,低版本会直接授予(清单已声明前提下) | ||||||
|  | 			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | ||||||
|  | 				requestPermissions(foregroundPermissions, REQUEST_LOCATION_PERMISSIONS); | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			// 2. 已授予前台权限:判断是否需要申请后台权限(仅API 29+需要) | ||||||
| 			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { | 			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { | ||||||
|             permissions = new String[]{ | 				// 2.1 检查后台权限是否未授予 | ||||||
| 				android.Manifest.permission.ACCESS_FINE_LOCATION, | 				if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) | ||||||
| 				android.Manifest.permission.ACCESS_BACKGROUND_LOCATION |                     != PackageManager.PERMISSION_GRANTED) { | ||||||
|             }; | 					// 2.2 API 30+ 必须单独申请后台权限(不能和前台权限一起弹框) | ||||||
|         } else { | 					requestPermissions( | ||||||
|             // 低版本仅需申请前台权限 |                         new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, | ||||||
|             permissions = new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}; |                         REQUEST_BACKGROUND_LOCATION_PERMISSION | ||||||
|  | 					); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			// 3. 前台权限已授予(+ 后台权限按需授予):此处可执行定位相关逻辑 | ||||||
|  | 			// doLocationRelatedLogic();  | ||||||
| 		} | 		} | ||||||
|         // 触发系统权限申请(Java7 显式调用requestPermissions,无方法引用) |  | ||||||
|         requestPermissions(permissions, REQUEST_LOCATION_PERMISSIONS); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     /** | // 【必须补充】权限申请结果回调(处理用户同意/拒绝逻辑) | ||||||
|      * 处理权限申请结果(系统弹窗用户选择后回调,Java7 显式重写方法) |  | ||||||
|      */ |  | ||||||
| 	@Override | 	@Override | ||||||
|     public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { | 	public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | ||||||
| 		super.onRequestPermissionsResult(requestCode, permissions, grantResults); | 		super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||||||
|         // 仅处理位置权限的申请结果 | 		// 处理前台权限申请结果 | ||||||
| 		if (requestCode == REQUEST_LOCATION_PERMISSIONS) { | 		if (requestCode == REQUEST_LOCATION_PERMISSIONS) { | ||||||
|             boolean allGranted = true; | 			if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||||||
|             // Java7 显式for循环遍历结果(无增强for简化写法) | 				// 前台权限同意:自动尝试申请后台权限(如果是API 29+) | ||||||
|             for (int i = 0; i < grantResults.length; i++) { | 				requestLocationPermissions(); | ||||||
|                 if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { | 			} else { | ||||||
|                     allGranted = false; | 				// 前台权限拒绝:提示用户(可选:引导跳转到应用设置页) | ||||||
|                     break; // 有一个权限未通过,直接终止判断 | 				Toast.makeText(this, "需要前台定位权限才能使用该功能", Toast.LENGTH_SHORT).show(); | ||||||
|  | 			} | ||||||
|  | 		} else if (requestCode == REQUEST_BACKGROUND_LOCATION_PERMISSION) { | ||||||
|  | 			if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||||||
|  | 				// 后台权限同意:可执行后台定位逻辑 | ||||||
|  | 				Toast.makeText(this, "已获得后台定位权限", Toast.LENGTH_SHORT).show(); | ||||||
|  | 			} else { | ||||||
|  | 				// 后台权限拒绝:提示用户(可选:说明后台定位的用途,引导手动开启) | ||||||
|  | 				Toast.makeText(this, "拒绝后台权限将无法在后台持续定位", Toast.LENGTH_SHORT).show(); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|             // 提示用户权限结果,并处理开关状态 |  | ||||||
|             if (allGranted) { |  | ||||||
|                 ToastUtils.show("已获取位置权限(含后台),可正常使用定位功能"); |  | ||||||
|             } else { |  | ||||||
|                 ToastUtils.show("位置权限未完全授予,无法后台获取GPS数据,请在设置中开启"); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -54,10 +54,13 @@ public class AppConfigsUtil { | |||||||
| 			loadConfigs(); | 			loadConfigs(); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return mAppConfigsModel.isEnableMainService(); | 		return (mAppConfigsModel == null) ?false: mAppConfigsModel.isEnableMainService(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public void setIsEnableMainService(boolean isEnableMainService) { | 	public void setIsEnableMainService(boolean isEnableMainService) { | ||||||
|  | 		if(mAppConfigsModel == null) { | ||||||
|  | 			mAppConfigsModel = new AppConfigsModel(); | ||||||
|  | 		} | ||||||
| 		mAppConfigsModel.setIsEnableMainService(isEnableMainService); | 		mAppConfigsModel.setIsEnableMainService(isEnableMainService); | ||||||
| 		saveConfigs(); | 		saveConfigs(); | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen