【问题标题】:Fused location provider doesn't seem to use GPS receiver融合的位置提供者似乎没有使用 GPS 接收器
【发布时间】:2014-01-28 03:02:03
【问题描述】:

在 Moto G 上运行 Android 4.3,在 Nexus 7 2012 上运行 Android 4.4.2,在 Nexus 5 上运行 Android 4.4.2。Android Studio 0.4。

我不想定期接收位置更新,我只想在用户按下按钮时获得准确的位置。

我遵循了这个例子:https://developer.android.com/training/location/retrieve-current.html

在清单文件中:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

我使用 GooglePlayServicesUtil.isGooglePlayServicesAvailable 检查 Play 服务是否可用

在主要活动中:

//in activity onCreate method
mLocationClient = new LocationClient(this, this, this);

@Override
protected void onStart() {
    mLocationClient.connect();
    super.onStart();
}

@Override
protected void onStop() {
    mLocationClient.disconnect();
    super.onStop();
}

//in button onclick method    
mCurrentLocation = mLocationClient.getLastLocation();

我没有 SIM 卡。如果我启用 Wifi,那么有时我会得到准确的位置。其他时候 mCurrentLocation 为空。

如果我禁用 Wifi,则 mCurrentLocation 始终为空。

我在室外的几个位置进行测试,始终可以清楚地看到天空。我在每个位置都等了三分钟。

我从未在屏幕顶部的 Android 通知栏上看到 GPS 图标。

我有以下位置设置:

GPS 测试应用在禁用 Wi-Fi 的同一设备上成功地在室内使用 GPS,因此 GPS 正常工作:

注册位置更新,如https://developer.android.com/training/location/receive-location-updates.html,也不起作用。从未调用注册的方法。

我做错了什么?

【问题讨论】:

  • 发布一些代码,GPS 也需要一些时间才能获得正确的锁定
  • @tyczj 刚刚编辑问题以添加代码。我在每个位置等了三分钟。 GPS 图标都没有出现在 Android 通知栏中。
  • 谢谢!您还可以发布用于注册位置更新的 LocationRequest 代码吗?另外,我假设当您说要打开 WiFi 时,您也有互联网连接?您还可以在此处使用我的 GPS Benchmark 应用程序测试融合提供程序 - play.google.com/store/apps/details?id=com.gpsbenchmark.android
  • GPS Benchmark 看起来很有用
  • 你真的需要这两个权限吗?

标签: android geolocation gps google-play-services


【解决方案1】:

我解决了。问题是“让 Google 应用访问您的位置”已关闭:

当我打开它时,我得到 GPS 读数,当它关闭时,我没有。

我放弃了它有两个原因:

  1. 我正在开发一个应用程序以用于公司的许多设备,并且我希望最少的手动配置是必要的

  2. 屏幕清楚地显示“此设置仅影响 Google 应用程序”。我知道 Play Services 是 Google 软件,但我认为 Google 不会期望最终用户理解这一点。

然后我得到了 Android 4.4.2 更新,位置设置页面发生了变化。看来我可以关闭谷歌位置报告,但仍然可以从融合位置提供者那里获得 GPS 读数:

因此,也许 Google 意识到该设置令人困惑并对其进行了改进。不管怎样,如果我几天前有 4.4.2,我会节省很多时间。

【讨论】:

  • 你们都很好,乐于助人,但我希望有办法奖励自己声誉赏金!
  • 对于那些现在发现这个线程的人 - 坏消息:谷歌让它更难理解。现在没有明确的“谷歌位置设置”。如果您选择“高精度”或“省电”定位模式,则表示您接受 Google 定位设置。好消息:您可以使用 SettingsApi 而不必将用户重定向到神秘的设备设置视图coderwall.com/p/zvmefa/…
【解决方案2】:

问题在于getLastLocation(),因为它使用了缓存位置。我遇到了同样的问题,因为我也尝试使用这种简单的方法。从那以后,我已经切换到收听更新(并在第一次成功更新后自动停止)。

这是我的有效代码。

首先,在Application中检查可用性(不是必须的,可以在Activity中并且不保留结果):

public class MainApp extends Application {
  public static enum PlayServices {
    NOT_CHECKED, AVAILABLE, UNAVAILABLE
  };
  public static PlayServices mPlayServices = PlayServices.NOT_CHECKED;

  @Override
  public void onCreate() {
    super.onCreate();

    if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) {
      MainApp.mPlayServices = MainApp.PlayServices.AVAILABLE;
    }
  }
}

然后,进入活动:

public class MainActivity extends SherlockFragmentActivity implements
  GooglePlayServicesClient.ConnectionCallbacks,
  GooglePlayServicesClient.OnConnectionFailedListener, LocationListener {

在其onCreate():

if (MainApp.mPlayServices != MainApp.PlayServices.UNAVAILABLE) {
  mLocationClient = new LocationClient(this, this, this);

  mLocationRequest = LocationRequest.create();
  mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
  mLocationRequest.setInterval(5000);
  mLocationRequest.setNumUpdates(1);
  mLocationRequest.setFastestInterval(1000);

  mUpdatesRequested = false;
  MainApp.prefs.edit().putBoolean(MainApp.KEY_LOCATION_UPDATES_REQUESTED, mUpdatesRequested)
      .commit();
}

MainActivity 类的其余部分:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  Log.d(this.getClass().getSimpleName(), "onActivityResult(" + requestCode + ", " + resultCode
      + ")");
  // Decide what to do based on the original request code
  switch (requestCode) {
    case MainApp.PLAY_CONNECTION_FAILURE_RESOLUTION_REQUEST:
      /*
       * If the result code is Activity.RESULT_OK, try
       * to connect again
       */
      switch (resultCode) {
        case Activity.RESULT_OK:
          // here we want to initiate location requests!
          mLocationClient = new LocationClient(this, this, this);

          break;
      }
      break;
  }
}

@Override
public void onConnected(Bundle dataBundle) {
  Log.d(this.getClass().getSimpleName(), "onConnected()");

  Log.d(this.getClass().getSimpleName(), "Google Play Services are available.");
  MainApp.mPlayServices = MainApp.PlayServices.AVAILABLE;

  if (!mUpdatesRequested) {

    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    boolean gps_enabled = false;
    try {
      gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {
    }

    boolean network_enabled = false;
    try {
      network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception ex) {
    }

    // don't start listeners if no provider is enabled
    MainApp.locEnabled = gps_enabled || network_enabled;

    if (!MainApp.locEnabled) {
      // we have access to PlayServices, but user has disabled location visibility --> alert him
      alertLocationOff();
    } else {
      mLocationClient.requestLocationUpdates(mLocationRequest, this);
      mUpdatesRequested = true;
    }
  }
}

@Override
public void onDisconnected() {
  Log.d(this.getClass().getSimpleName(), "onDisconnected()");
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
  Log.d(this.getClass().getSimpleName(), "onConnectionFailed()");

  Log.d(this.getClass().getSimpleName(), "Google Play Services not available.");
  MainApp.mPlayServices = MainApp.PlayServices.UNAVAILABLE;

  /*
   * Google Play services can resolve some errors it detects.
   * If the error has a resolution, try sending an Intent to
   * start a Google Play services activity that can resolve
   * error.
   */
  if (connectionResult.hasResolution()) {
    try {
      // Start an Activity that tries to resolve the error
      connectionResult.startResolutionForResult(this,
          MainApp.PLAY_CONNECTION_FAILURE_RESOLUTION_REQUEST);
      /*
       * Thrown if Google Play services canceled the original
       * PendingIntent
       */
    } catch (IntentSender.SendIntentException e) {
      // Log the error
      e.printStackTrace();
    }
  } else {
    /*
     * If no resolution is available, display a dialog to the
     * user with the error.
     */
    GooglePlayServicesUtil.getErrorDialog(connectionResult.getErrorCode(), this, 0).show();
  }
}

@SuppressLint("NewApi")
@Override
public void onLocationChanged(Location location) {
  Log.d(this.getClass().getSimpleName(), "onLocationChanged(), location=" + location);

  if (location != null) {
    boolean present = true;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
      present = Geocoder.isPresent();
    }

    if (present) {
      (new ExtractLocationTask(this)).execute(location);
    } else {
      Log.e(this.getClass().getSimpleName(), "Geocoder not present");
      MainApp.mPlayServices = MainApp.PlayServices.UNAVAILABLE;
    }
  }
}


private class ExtractLocationTask extends AsyncTask<Location, Void, Boolean> {
  Context mContext;

  public ExtractLocationTask(Context context) {
    super();
    mContext = context;
  }

  @Override
  protected Boolean doInBackground(Location... params) {
    Log.d(getClass().getSimpleName(), "ExtractLocationTask.onPreExecute()");

    boolean found = false;
    try {
      Geocoder geoCoder_local = new Geocoder(mContext, Locale.getDefault());
      Geocoder geoCoder_en = new Geocoder(mContext, Locale.ENGLISH);

      List<Address> addresses_local = geoCoder_local.getFromLocation(params[0].getLatitude(),
          params[0].getLongitude(), 10);
      List<Address> addresses_en = geoCoder_en.getFromLocation(params[0].getLatitude(),
          params[0].getLongitude(), 10);

      if (addresses_local != null && addresses_local.size() > 0) {

        // do what you want with location info here

        // based on mLocationRequest.setNumUpdates(1), no need to call
        // removeLocationUpdates()

        MainApp.locEnabled = true;

        mUpdatesRequested = false;
        MainApp.prefs.edit()
            .putBoolean(MainApp.KEY_LOCATION_UPDATES_REQUESTED, mUpdatesRequested).commit();

        found = true;
      }
    } catch (IOException e) {
      Log.e(this.getClass().getSimpleName(), "Exception: ", e);
    }

    return found;
  }

  @Override
  protected void onPostExecute(Boolean found) {
    Log.d(getClass().getSimpleName(), "ExtractLocationTask.onPostExecute()");

    if (found) {
      // update UI etc.
    } else if (!mUpdatesReRequested) {
      mLocationClient.requestLocationUpdates(mLocationRequest, (LocationListener) mContext);
      mUpdatesRequested = true;
      mUpdatesReRequested = true;
    }
  }
}

我希望这会帮助你让它工作!

【讨论】:

  • LocationManager.isProviderEnabled 是否与融合的位置提供程序一起使用?
  • 我发现它可以在没有问题的情况下工作,但您可以轻松地从 onConnected() 中删除 LocationManager 检查并使用 mLocationClient.requestLocationUpdates(mLocationRequest, this);
  • 顺便说一句。从 FusedLocation 源代码 (android.googlesource.com/platform/frameworks/base/+/…) 你可以看到他们以同样的方式使用 LocationManager (isProviderEnabled()) 来检查 GPS & NETWORK 的可用性。
  • 感谢您确认 LocationManager 的使用
  • Google Play 定位服务还有很多问题。有时它不会检测到位置并且需要很长时间。但是,旧技术比 Google Play Location Services API 为您提供快速定位。如果有人想遇到这个问题,只需观察到,每当您的 MAP 应用程序显示“等待位置”时,同时使用旧的定位技术运行您的示例应用程序。旧的播放位置服务返回非常快的结果。
【解决方案3】:

在某些客户要求(订阅)高精度位置(如其他用户给出的示例中所述)之前,位置提供程序不会唤醒 GPS。 GPS 测试应用不使用位置提供程序,而是使用旧的“直接”方式获取位置。

还有过期机制,如果最后一个位置的信息被认为是陈旧的,它会在一段时间后删除它。

综上所述,LP(Location Provider)真的很可能没有什么可以给你的。

【讨论】:

    【解决方案4】:

    我认为您正在 Indoor 中测试您的应用程序,它不起作用..

    和代码流..

    public void setUpLocationClientIfNeeded() {
            createLocReq();
            if (mLocationClient == null) {
                mLocationClient = new LocationClient(getApplicationContext(), this, // ConnectionCallbacks
                        this); // OnConnectionFailedListener
            }
        }
    
        private void createLocReq() {
            if (mLocationRequest == null) {
                // Create a new global location parameters object
                mLocationRequest = LocationRequest.create();
                // Set the update interval
                mLocationRequest.setInterval(LocationServices.UPDATE_INTERVAL_IN_MILLISECONDS);
                // Use high accuracy
                mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                // Set the interval ceiling to one minute
                mLocationRequest.setFastestInterval(LocationServices.FAST_INTERVAL_CEILING_IN_MILLISECONDS);
    
                mLocationClient = new LocationClient(getApplicationContext(), this, this);
                mLocationClient.connect();
            }
        }
    
        public void updateLocation(Location location) {
            if (lastTrackedLat == 0.0) {
                lastTrackedLat = location.getLatitude();
            }
            if (lastTrackedLng == 0.0) {
                lastTrackedLng = location.getLongitude();
            }
    
            currentLat = location.getLatitude();
            currentLng = location.getLongitude();
        }
    
        @Override
        public void onLocationChanged(Location location) {
            if (location != null) {
                this.location = location;
                updateLocation(location);
            }
        }
    
        public Location getLocation() {
            // mLocationClient.getLastLocation();
            return location;
        }
    

    【讨论】:

    • 感谢您的代码示例。但是,我不想收到定期更新,我只想在用户按下按钮时获得准确的位置。我关注developer.android.com/training/location/retrieve-current.html
    • 为什么不使用 FusedLocationProvider?
    • 现在可以使用FusedLocation Provider了,比之前的LocationManager更好。
    【解决方案5】:

    根据文档

    此方法提供了一种获取位置的简化方法。 它特别适合不需要准确位置的应用程序,并且不想为位置更新维护额外的逻辑。

    因此它可能会或可能不会返回高度准确的位置。

    GPS 可能需要一段时间才能锁定,因此调用 getLastLocation 可能会或可能不会返回位置

    您最好请求位置更新,然后在获得位置后停止请求位置更新。

    同时查看您提供的代码,您是否在等待LocationClient 连接后再尝试获取位置?这肯定会给你一个空位置,因为它还没有连接到获取位置。

    你应该做的是在你的onConnected 中获取最后一个位置,例如

    public void onConnected(Bundle connectionHint) {
        Location location = mLocationClient.getLastLocation();
    }
    

    正如在该示例中所说,onConnected 是 Called by Location Services when the request to connect the client finishes successfully. At this point, you can request the current location or start periodic updates

    【讨论】:

    • 如果它可以获得网络位置,那么它可能会在不使用 GPS 的情况下给我,但如果它无法获得网络位置,那么它肯定会使用 GPS。我不敢相信它会被设计成甚至不尝试 GPS。我确定我做错了什么。
    • 重申一下,这不是给我一个不准确的位置,而是给我一个空位置。
    • 来自developer.android.com/google/play-services/location.html:“立即可用:让您的应用程序可以立即访问最近的最佳位置。”要么这是谎言,要么我做错了什么。
    • 注册位置更新,如developer.android.com/training/location/…,也不起作用。从未调用注册的方法。
    • 得票最多的人绝对应该得到赏金。 @cja
    【解决方案6】:

    您需要做的就是像这样向请求对象添加优先级属性。

    public void onConnected(Bundle arg0)
    {
        locationrequest = LocationRequest.create();
        locationrequest.setInterval(1000);
        locationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationclient.requestLocationUpdates(locationrequest, this);
    }
    

    也许使用布尔变量让用户可以选择强制 GPS 之类的

    boolean forceGPS=false;
    .
    .
    .//make the user choose to change the value of the boolean
    .
    .
    public void onConnected(Bundle arg0)
        {
            locationrequest = LocationRequest.create();
            locationrequest.setInterval(1000);
            if(forceGPS==true)
            {
            locationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            }
            locationclient.requestLocationUpdates(locationrequest, this);
        }
    

    【讨论】:

      【解决方案7】:

      如果没有 sim 卡,coarse location provider 无法知道大致位置,除非它能够找到由 Google 映射的 WiFi 网络。

      请求最后一个已知位置可能会导致位置过时,因此相当无用。我猜这是上次某个应用请求位置更新时记录的位置。

      我使用以下代码获取最近的位置:

          Criteria criteria = new Criteria();
          criteria.setAccuracy(Criteria.ACCURACY_COARSE);
          criteria.setAltitudeRequired(false);
          criteria.setSpeedRequired(false);
          criteria.setBearingRequired(false);
          criteria.setCostAllowed(false);
      
          final LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
      
          ....
          LocationListener listener = new LocationListener() {
              @Override
              public void onLocationChanged(Location lastKnownLocation) {
                           ....
              }
              // rest of interface
           }
      
      
           manager.requestSingleUpdate(criteria, listener, null);
      

      最后一次调用确保我们请求当前位置,而不是它能够在未知时间之前找到的位置。

      您可以尝试将其更改为 Criteria.ACCURACY_FINE 以启动 GPS。请注意,如果 GPS 在很长一段时间内没有修复,它可能需要几分钟才能真正获得修复。同时,我希望您会看到 GPS 图标,表明它正在等待修复。

      【讨论】:

      • “最后一次通话”——你指的是哪一行?
      • 好像manager.requestSingleUpdate(criteria, listener, null); 就是这么做的
      • “最后一次通话”是requestSingleUpdate() 通话。这将刷新当前位置,并在建立后传递给侦听器。之后将不再有更新。
      • 等一下,这个问题是关于融合位置提供者的。你的答案似乎使用了 android.location.LocationManager,这是不同的。
      • @user1993392 为什么要使用 LocationManager 进行演示? FusedLocationProvider 现在不是更受欢迎吗?
      【解决方案8】:

      OnConnected 方法中有什么?

      在此方法中,您应该创建具有PRIORITY_HIGH_ACCURACY 优先级的LocationRequest 对象。

      @Override
      public void onConnected(Bundle dataBundle) {
          mLocationRequest = LocationRequest.create();
          mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
          mLocationClient.requestLocationUpdates(mLocationRequest, fusedListener);
      }
      

      【讨论】:

        【解决方案9】:

        试试这个:

        public final static int MINACCURACY = 50;
        
        private LocationManager lm;
        private LocationListener listener;
        
        private void foundLoc(double x, double y) {
            // do something with x,y
            Log.v("DEBUG", x + "," + y);
        }
        
        
        public void findMe(View v) {
            lm = (LocationManager) getSystemService(LOCATION_SERVICE);
            listener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    if(location.getAccuracy() < MINACCURACY) {
                        foundLoc(location.getLatitude(), location.getLongitude());
                        lm.removeUpdates(listener);
                    }
                }
        
                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                }
        
                @Override
                public void onProviderEnabled(String provider) {
                }
        
                @Override
                public void onProviderDisabled(String provider) {
                }
            };
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, listener);
        }
        

        MINACCURACY 以米为单位。这样,在按下按钮时(调用 findMe 方法),GPS 被启用,以最低精度找到您的位置,foundLoc 方法获取数据并且监听器终止(这反过来又禁用 GPS)。

        【讨论】:

        • 这个问题是关于融合位置提供者的。你的答案似乎使用了 android.location.LocationManager,这是不同的。
        【解决方案10】:

        这里发生了两件事,导致您有时会收到null,有时会收到一个位置。

        首先,您在onClick 方法中创建LocationClient 的新实例,这与您在onStart() 中调用connect() 的实例不同。这将产生不可预知的行为,有时客户端在从LocationClient.getLastLocation() 返回结果之前有足够的时间进行连接,而有时则不会。

        其次,您应该通过对LocationClient.isConnected() 的调用来保护对LocationClient.getLastLocation() 的调用。它在LocationClient.isConnected() 文档中说明了以下内容: https://developer.android.com/reference/com/google/android/gms/location/LocationClient.html#isConnected()

        检查客户端当前是否连接到服务,以便对其他方法的请求将成功。应用程序应保护由用户调用此方法引起的客户端操作。

        由于用户通过点击按钮触发onClick()代码,因此您应该在尝试获取最后一个位置之前调用此方法。

        所以,你的代码应该是这样的:

        LocationClient mLocationClient;
        Location mCurrentLocation;
        
        @Override
        protected void onCreate() {
            ...
            mLocationClient = new LocationClient(this, this, this);
            ...
        }
        
        @Override
        protected void onStart() {
            mLocationClient.connect();
            super.onStart();
        }
        
        @Override
        protected void onStop() {
            mLocationClient.disconnect();
            super.onStop();
        }
        
        public void onClick(View v) {
            ...
            if (mLocationClient.isConnected()) {
                // You should get a valid location here
                mCurrentLocation = mLocationClient.getLastLocation();
            }
        }
        

        这应该让LocationClient 有足够长的时间来连接并为您提供一个有效的位置,其中应该包括 GPS 数据。

        【讨论】:

        • 抱歉 - 我的问题中的代码略微歪曲了我的应用程序中的代码。请查看最新编辑。
        • 将尝试使用 isConnected
        【解决方案11】:

        由于没有人分享此链接,我发现这是最有用的文档http://developer.android.com/guide/topics/location/strategies.html

        “您可能认为最近的位置修正是最准确的。但是,由于位置修正的准确性各不相同,因此最近的修正并不总是最好的。您应该包括根据几个选择位置修正的逻辑标准。标准也因应用程序和现场测试的用例而异。"

        您最好的办法是,只要 Activity 处于前台,就让位置侦听器继续运行,并在按下按钮时选择最准确的缓存位置。您可能需要显示微调器或其他东西,并在等待准确测量显示时禁用该按钮。

        【讨论】:

          【解决方案12】:

          我更喜欢使用实现LocationListener 的服务来获取当前接近准确的位置。我通常采取以下步骤:

          1. 初始化LocationManager 并在onCreate() 中为GPS_PROVIDERNETWORK_PROVIDER 调用requestLocationUpdates
          2. GPS_PROVIDERNETWORK_PROVIDER 致电getLastKnownLocation 并使用getTime() 了解最新的最新位置。
          3. 广播最后一个位置(如果是
          4. 与此同时,当onLocationChanged 被调用时,我将新更新的位置与最近的最佳位置(如果有)进行比较并检查准确度级别。
          5. 如果精度增量
          6. 广播当前最佳位置
          7. 必须删除 LocationManager locationManager.removeUpdates(this);
          8. 调用 stopSelf(); (您也可以从活动的onDestroy 停止服务)

          编辑:

          好的...上面的方法是使用 Location API,下面我使用 Fused Provider (GooglePlayServices) 进行了编码。我已经在我的 Nexus 5 (Android 4.4.2) 上进行了测试,没有 SIM 卡,没有 WIFI……我正在得到结果。

          编辑 2:我还在 Android 2.3.3 LG Optimus(无 SIM 和 Wifi)上进行了测试,大约需要 5 分钟才能获得锁定(使用提供的 Fused),但我立即获得了位置图标。

          public class HomeActivity extends FragmentActivity implements
                  ActionBar.OnNavigationListener,
                  GooglePlayServicesClient.ConnectionCallbacks,
                  GooglePlayServicesClient.OnConnectionFailedListener, LocationListener {
          
              private LocationClient locationClient;
              private LocationRequest locationRequest;
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                      setContentView(R.layout.activity_home);
                      // ...
                      int resp = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
                  if (resp == ConnectionResult.SUCCESS) {
                      locationClient = new LocationClient(this, this, this);
                      locationClient.connect();
                  } else {
                      Toast.makeText(this, "Google Play Service Error " + resp,
                              Toast.LENGTH_LONG).show();
          
                  }
              }
          
              @Override
              public void onConnected(Bundle connectionHint) {
                  if (locationClient != null && locationClient.isConnected()) {
          
                      locationRequest = LocationRequest.create();
                      locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                      locationRequest.setInterval(100);
                      locationClient.requestLocationUpdates(locationRequest, this);
          
                  }
              }
          
              @Override
              public void onLocationChanged(Location location) {
          
                  try {
                      if (location != null) {
                          LatLng gps = new LatLng(location.getLatitude(), location.getLongitude());
                          Log.v("JD", "My Location: " + gps.toString());
                      }
                  } catch (Exception e) {
                      Log.d("JD",
                              "onLocationChanged", e);
          
                  }       
              }
          }
          

          【讨论】:

          • 这与google play服务中的fused location API无关
          • 上述方法适用于没有 SIM 和 Wifi 的我的应用程序,我认为这对 OP 可能更有用。无论如何,我稍后会使用 Fused 提供程序检查并编辑我的帖子。
          • 上面的代码没有使用融合的lcoation提供者,我们可以在不打开设置中的位置的情况下从融合的提供者那里获取位置。
          猜你喜欢
          • 2017-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-24
          • 1970-01-01
          • 2017-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多