安卓广播gps开启更新位置

Posted

技术标签:

【中文标题】安卓广播gps开启更新位置【英文标题】:Android broadcast gps turned on update location 【发布时间】:2020-03-09 07:03:07 【问题描述】:

好吧,即使在这里阅读很多,我也无法弄清楚问题所在。看来我从来没有开启 gps 事件。

经过一些调试检查,标志 isGps 是正确的。但结果,用户警报效果很好,但不能更新位置。我只想在打开 gps 时添加一个标记,并且看起来这里有些东西没有正确同步。

即使定位精度很高。

我使用片段中的这段代码。

public class MapDialogFragment extends DialogFragment
        implements OnMapReadyCallback, GoogleMap.OnMarkerDragListener 

.....

       private BroadcastReceiver mGpsSwitchStateReceiver = new BroadcastReceiver() 
            @Override
            public void onReceive(Context context, Intent intent) 

                if (LocationManager.PROVIDERS_CHANGED_ACTION.equals(intent.getAction())) 


                    boolean isGPS = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                    if(isGPS)
                        // never goes here WHEN GPS TURNED ON !!! WHY ?? MAKES ME CRAZY
                        // + how get current location here ? is updateMyLocation call ok ?
                        updateMyLocation();
                    
                    else
                         // user alert
                         Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.message_location_error_gps_off), Toast.LENGTH_LONG).show();
                    
                
            
        ;

        @Override
        public void onResume() 
            super.onResume();
            getContext().registerReceiver(mGpsSwitchStateReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));
        

        @Override
        public void onPause() 
            super.onPause();
            getContext().unregisterReceiver(mGpsSwitchStateReceiver);
        

     private void updateMyLocation()
            Task locationResult = mFusedLocationProviderClient.getLastLocation();
            locationResult.addOnCompleteListener(getActivity(), new OnCompleteListener() 
                @Override
                public void onComplete(@NonNull Task task) 
                    if (task.isSuccessful() && task.getResult() != null) 
                        // Set the map's camera position to the current location of the device.
                        mLastKnownLocation = (Location) task.getResult();
                        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                new LatLng(mLastKnownLocation.getLatitude(),
                                        mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));

                        latitude = mLastKnownLocation.getLatitude();
                        longitude = mLastKnownLocation.getLongitude();

                        // add marker
                        buildMarkerFromLocation();

                     else 
                        Log.d(TAG, "Current location is null. Using defaults.");
                        Log.e(TAG, "Exception: %s", task.getException());
                    
                
            );
        
...

所以这是我的逻辑:

    检查 GPS 是否打开 如果是发送mFusedLocationProviderClient.getLastLocation()请求 获取结果,但在 GPS 刚打开时总是没有结果

所以基本上,如何提供一个没有硬代码的默认位置?

这里是关于 google api 页面的更多信息:

getLastLocation() 方法返回一个 Task,您可以使用该 Task 获取具有地理位置的纬度和经度坐标的 Location 对象。位置对象在以下情况下可能为空:

    位置在设备设置中被关闭。即使先前检索到最后一个位置,结果也可能为空,因为禁用位置也会清除缓存。

    设备从未记录其位置,可能是新设备或已恢复出厂设置的设备。

    设备上的 Google Play 服务已重新启动,并且在服务重新启动后没有活动的 Fused Location Provider 客户端请求位置。为避免这种情况,您可以创建一个新客户端并自己请求位置更新。有关详细信息,请参阅接收位置更新。

希望我能在您的帮助下解决这个问题。应该是显而易见的,但我不知道出了什么问题......

【问题讨论】:

您确定广播接收者是否收到事件? 我每次都会收到事件(断开/连接),但不幸的是,问题似乎出在 updateMyLocation 中,因为当 GPS 打开时,标记并没有在地图上添加一个,如何解决这个问题? 【参考方案1】:

由于您收到事件,这意味着它与设备本身无关,并且看起来它在您的更新位置,在我的情况下,我使用的方法是“OnSuccessListener”而不是“OnCompleteListener”,我没有知道这是否是一个问题,但无论如何这就是我更新我身边位置的方式:

/**
 * To get the current MapLocation and add marker at that location
 */
@SuppressLint("MissingPermission")
private void setCurrentLocation() 
    try 
        FusedLocationProviderClient locationClient = new FusedLocationProviderClient(getActivity());
        if (checkLocationPermissions()) 
            Task<Location> currentLocationTask = locationClient.getLastLocation(); // already checked
            currentLocationTask.addOnSuccessListener(new OnSuccessListener<Location>() 
                @Override
                public void onSuccess(Location location) 
                    try 
                        // Now, add the required Marker
                        addMarker(new LatLng(location.getLatitude(), location.getLongitude()));
                     catch (NullPointerException npe) 
                        npe.printStackTrace();
                        Toast.makeText(getActivity(), getResources().getString(R.string.cannot_get_location), Toast.LENGTH_SHORT).show();
                    
                
            );
        
     catch (Exception ex) 
        ex.printStackTrace();
    


/**
 * Adding a Marker at the Map
 *
 * @param point the point contains the latitude and longitude to add the marker at
 */
private void addMarker(LatLng point) 
    try 
        marker.remove();
     catch (NullPointerException ex) 
        ex.printStackTrace();
    
    MarkerOptions markerOptions = new MarkerOptions().position(
        new LatLng(point.latitude, point.longitude)).title(getAddressAtLocation(point));
    marker = mMap.addMarker(markerOptions);
    currentChosenLocation = point;

【讨论】:

不幸的是,这在我的手机上不起作用,我使用在 updateMyLocation() 的 else 语句方法中显示信息“无法获取位置”,并且当 gps 打开时,FusedLocationProviderClient 在我的案例,为什么? 日志中出现的任何异常或特殊情况 不幸的是,这里没有什么特别的,我只是在请求最后一个位置时在 task.getResult() 中得到 null,因此结果我没有要显示的标记。谷歌地图圆点显示在地图上,但是打开gps时我仍然无法在上面添加标记 还有这个问题吗? 不幸的是我还不能想出另一个解决方案,也许一旦我有机会我会试试你来看看它是否对我有用

以上是关于安卓广播gps开启更新位置的主要内容,如果未能解决你的问题,请参考以下文章

安卓gps检索

在安卓设备上模拟位置

如何在应用程序处于后台时保持GPS接收器位置更新(Google Play服务位置API)

GPS定位研究之gps位置改变监听源码分析(Android10)

Android如何开启GPS定位服务?

CLLocationmanager 中的 GPS 位置更新