@@ -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 ( )   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					     * 申请「前台+后台」位置权限(弹出系统权限弹窗,适配版本差异) 
 
					 
					 
					 
							 // 1. 先判断前台定位权限(  ACCESS_FINE_LOCATION)  是否已授予 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					     */ 
 
					 
					 
					 
							 if   ( ContextCompat . checkSelfPermission ( this ,   Manifest . permission . ACCESS_FINE_LOCATION ) 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    private   void   requestLocationPermissions (  )   { 
 
					 
					 
					 
					             ! =   PackageManager . PERMISSION_GRANTED  )   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         String [ ]   permissions ; 
 
					 
					 
					 
								 // 1.1 未授予前台权限:  先申请前台权限(  API 30+ 后台权限依赖前台权限) 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         // Java7 显式版本判断:  Android 10+ 需同时申请前台+后台权限 
 
					 
					 
					 
								 String [ ]   foregroundPermissions   =   new   String [ ] { Manifest . permission . ACCESS_FINE_LOCATION } ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         if   ( Build . VERSION . SDK_INT   > =   Build . VERSION_CODES . Q )   { 
 
					 
					 
					 
								 // 对API 23+(  Android 6.0)动态申请,低版本会直接授予(清单已声明前提下) 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					             permissions   =   new   String [ ] { 
 
					 
					 
					 
								 if   ( Build . VERSION . SDK_INT   >  =  Build . VERSION_CODES . M )   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
									 android . Manifest . p ermission. ACCESS_FINE_LOCATION , 
 
					 
					 
					 
									 requestPermissions ( foregroundP ermissions ,   REQUEST_LOCATION_PERMISSIONS ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
									 android . Manifest . permission . ACCESS_BACKGROUND_LOCATION  
 
					 
					 
					 
								}  
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					             } ; 
 
					 
					 
					 
							 }   else   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         }   else   { 
 
					 
					 
					 
								 // 2. 已授予前台权限:  判断是否需要申请后台权限(  仅API 29+需要) 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					             // 低版本仅需申请前台权限 
 
					 
					 
					 
								 if   ( Build . VERSION . SDK_INT   > =   Build . VERSION_CODES . Q )   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					             permissions   =   new   String [ ] { android . Manifest . permission . ACCESS_FINE_LOCATION } ; 
 
					 
					 
					 
									 // 2.1 检查后台权限是否未授予 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         } 
 
					 
					 
					 
									 if   ( ContextCompat . checkSelfPermission ( this ,   Manifest . permission . ACCESS_BACKGROUND_LOCATION ) 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					        // 触发系统权限申请(  Java7 显式调用requestPermissions,  无方法引用)   
 
					 
					 
					 
					                     ! =   PackageManager . PERMISSION_GRANTED )   {  
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         requestPermissions ( permissions ,   REQUEST_LOCATION_PERMISSIONS ) ; 
 
					 
					 
					 
										 // 2.2 API 30+ 必须单独申请后台权限(不能和前台权限一起弹框) 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					     } 
 
					 
					 
					 
										 requestPermissions ( 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                         new   String [ ] { Manifest . permission . ACCESS_BACKGROUND_LOCATION } , 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                         REQUEST_BACKGROUND_LOCATION_PERMISSION 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
										 ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
									 } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
								 } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
								 // 3. 前台权限已授予(+ 后台权限按需授予):此处可执行定位相关逻辑 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
								 // doLocationRelatedLogic();  
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							 } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						 } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					     /** 
 
					 
					 
					 
					// 【必须补充】权限申请结果回调(处理用户同意/拒绝逻辑) 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					     * 处理权限申请结果(  系统弹窗用户选择后回调,  Java7 显式重写方法) 
 
					 
					 
					 
						 @Override 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					     */ 
 
					 
					 
					 
						 public   void   onRequestPermissionsResult ( int   requestCode ,   @NonNull   String [ ]   permissions ,   @NonNull   int [ ]   grantResults )   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					     @Override 
 
					 
					 
					 
							 super . onRequestPermissionsResult ( requestCode ,   permissions ,   grantResults ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					     public   void   onRequestPermissionsResult ( int   requestCode ,   String [ ]   permissions ,   int [ ]   grantResults )   { 
 
					 
					 
					 
							 // 处理前台权限申请结果 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         super . onRequestPermissionsResult ( requestCode ,   permissions ,   grantResults ) ; 
 
					 
					 
					 
							 if   ( requestCode   = =   REQUEST_LOCATION_PERMISSIONS )   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         // 仅处理位置权限的申请结果 
 
					 
					 
					 
								 if   ( grantResults . length   >   0   & &   grantResults [ 0 ]   = =   PackageManager . PERMISSION_GRANTED )   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					         if   ( requestCode   = =   REQUEST_LOCATION_PERMISSIONS )   { 
 
					 
					 
					 
									 // 前台权限同意:  自动尝试申请后台权限(  如果是API 29+)  
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					             boolean   allGranted   =   true ; 
 
					 
					 
					 
									 requestLocationPermissions ( ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					             // Java7 显式for循环遍历结果(  无增强for简化写法)  
 
					 
					 
					 
								 }   else   { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					             for   ( int   i   =   0 ;   i   <   grantResults . length ;   i + + )   { 
 
					 
					 
					 
									 // 前台权限拒绝:提示用户(可选:引导跳转到应用设置页) 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					                 if   ( grantResults [ i ]   ! =   PackageManager . PERMISSION_GRANTED )   { 
 
					 
					 
					 
									 Toast . makeText ( this ,   " 需要前台定位权限才能使用该功能 " ,   Toast . LENGTH_SHORT ) . show ( ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					                     allGranted   =   false ; 
 
					 
					 
					 
								 } 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					                     break ;   // 有一个权限未通过,直接终止判断 
 
					 
					 
					 
							 }   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数据,  请在设置中开启 " ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					             } 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					         } 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					     } 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					}