android google-play-services fusedlocationproviderapi android-fusedlocation
a根据这个:
https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi
您可以检查是否满足位置要求,如果没有,则使用显示对话框startResolutionForResult().
在该对话框中,您可以选择"ok","not this time"或"never".
是否可以禁用"从不"选项?
Google地图官方应用已禁用该选项.
我想使用最新的融合位置提供商客户端在"后台服务"上获取位置更新.我不想使用所有正在使用的位置监听器和Google API客户端.我还需要使用谷歌播放服务提供的位置设置Api来检查位置设置是否禁用或启用"后台服务".请帮助.
android android-location google-play-services fusedlocationproviderapi google-location-services
我不希望我的应用依赖Google API.是否有任何开源替代品FusedLocationProviderApi允许组合标准GPS和网络提供商?
api android location location-provider fusedlocationproviderapi
我正在尝试将 FusedLocationApi 与待处理的意图一起使用来获取期间位置更新,以便我可以将数据发送到某个服务器进行处理。一切正常。但是,在某些情况下,广播会停止接收。我需要再次重新启动该服务才能继续。
我已经有了 onStartCommand 服务来返回 START_STICKY,所以即使应用程序被终止,它也应该再次启动该服务。此外,我还添加了一个 Boot Completed Intent Receiver,因此如果手机死机并且用户重新启动手机,它将重新启动我的服务。
所以看起来一切都很好,但只是在某个时候,一切都停止了。我确实注意到几次,当它停止工作时,我收到的最后一个位置是 NULL(我记录了整个项目中的每个位置更新和错误消息)。
任何想法为什么定位服务停止工作?
PS 没有连接失败,因为我在该函数中放入了一条消息并挂钩,但它没有被调用。这也不是互联网故障,因为我也记录了它。一旦互联网恢复,它将继续正常/预期。
谢谢。
这是主要活动:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
if (findViewById(android.R.id.home) != null) {
findViewById(android.R.id.home).setVisibility(View.GONE);
}
LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflator.inflate(R.layout.header_logo, null);
ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setCustomView(view, params);
}
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.status_text);
// init preferences and …Run Code Online (Sandbox Code Playgroud) android background-service location-services fusedlocationproviderapi android-fusedlocation
我正在开发一个我想使用Fused Location Provider的应用程序.但我有一些疑问,还有几个问题.
你有什么意见?提前致谢.
我希望每隔一定分钟进行一次硬位置修复,每隔一定分钟进行一次软位置修复,并且如果用户移动的距离超过一定米数。我一直在用下面的代码步行来测试逻辑(在驾驶时也尝试使用更大的参数),但它并没有真正返回我定期的位置修复。当请求开始时,它会立即返回位置修复,然后有时会在几分钟后返回 1 个位置修复,但随后长达一个小时,它不会返回位置修复。
LocationRequest locationRequest = LocationRequest.create();
int priority = PRIORITY_BALANCED_POWER_ACCURACY;
locationRequest.setPriority(priority);
locationRequest.setInterval(localInterval); //set to 6 minutes
locationRequest.setFastestInterval(localFastestInterval); //set to 3 minutes
locationRequest.setSmallestDisplacement(smallestDisplacement); //set to 10 meters
locationRequest.setNumUpdates(numUpdates); //set to Int.MAX_VALUE
locationRequest.setExpirationDuration(expirationDuration); // set to Long.MAX_VALUE
LocationServices.FusedLocationApi.requestLocationUpdates(locationClient, locationRequest, pendingIntent);
Run Code Online (Sandbox Code Playgroud)
如果我将位移设置为 0,那么我会得到定期位置更新。知道发生了什么事吗?
android location android-location fusedlocationproviderapi android-fusedlocation
我正在开发一个项目,我们正在尝试跟踪设备的位置并保留数据供以后使用.在我谈论这个问题之前,我想提供一些背景知识.
通过搜索StackExchange和Google以及其他任何地方,我得出的结论是,几乎不可能使用Fused Location API获取有关卫星的信息(Google的工作很好).
大多数人使用的方法是在Fused位置旁边实际使用LocationManager来获取GPS状态.我的第一个问题是:我们怎么能100%确定LocationManager提供的数字与Fused Location给我们的数据同步?Fused Location是否在内部使用Manager?
而现在问题.该应用程序正在使用"永远在线"粘性服务来获取位置,无论如何.当没有卫星时,一切都按预期工作.将设备放置在可以看到卫星的位置,它似乎没有锁定.使用调试器,GpsStatus.getSatellites()带来一个空列表.现在,在没有移动设备的情况下,我启动了具有GPS型罗盘方案的应用程序Compass(由Catch.com提供,因为有很多).那个锁定卫星的速度非常快,从那时起我的应用程序也会报告卫星.如果指南针关闭,那么应用程序会卡在指南针提供的最后一个数字上!我个人用于测试的设备是带有最新官方更新的Nexus 7 2013(Android 6.0.1).
这是一些代码:
public class BackgroundLocationService extends Service implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
GpsStatus.Listener,
LocationListener {
// Constants here....
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private LocationManager locationManager;
// Flag that indicates if a request is underway.
private boolean mInProgress;
private NotificationManagement myNotificationManager;
private Boolean servicesAvailable = false;
//And other variables here...
@Override
public void onCreate()
{
super.onCreate();
myNotificationManager = new NotificationManagement(getApplicationContext());
myNotificationManager.displayMainNotification();
mInProgress = false;
// Create the LocationRequest object
mLocationRequest = …Run Code Online (Sandbox Code Playgroud) gps android locationmanager fusedlocationproviderapi android-fusedlocation
我们的应用程序中的流程如下:
我们收到了来自用户的多个支持请求,他们说什么也没有发生,他们只看到加载微调器。
目前,我们正在执行已激活的GPS提供程序,因此这不是无效定位服务的问题。
我设法通过在其中一部手机上创建用户帐户并启动该应用程序来重现该错误,并且我注意到未调用onLocationChanged
代码已经过去了LocationServices.FusedLocationApi.requestLocationUpdates,因此它应该提供位置,但是不提供
我知道我过去通过打开Google地图解决了这个问题,但是
a)我几乎无法想象用户到目前为止没有使用过Google地图b)告诉他们打开Google地图来解决我们应用中的问题听起来很奇怪
这是使用的确切代码的要点(我在131行上设置了一个断点,开始进行调试并到达那里,因此我应该获取位置,但是从未调用过onLocationChanged方法
在我们的 Android 应用程序中,我们使用 Google Maps API 来显示用户位置。目前我们正在使用 Koin 来将 FusedLocationProviderClient 依赖项的参数注入(它需要一个活动)提供到我们的 Fragment 类中。从理论上讲,这应该可以更直接地测试和模拟 Client 类(使用 mockk)。但是,在尝试使用 Android FragmentScenario 运行测试时,测试似乎在某个地方无限循环(调试没有给出原因的答案)。有没有人对如何与我们正在使用的框架一起进行测试有任何进一步的想法。Android/Google 文档不提供任何帮助,也没有提供大量时间浏览网络。
我们尝试在注入和不注入 FusedLocationProvideClient 的情况下进行测试。我们尝试在我们的测试类中启动 Koin 测试模块,使用活动参数化和不使用活动参数化,似乎没有任何区别。FusedLocationProviderClient 被模拟为relaxed 设置为true。
测试类:
private val viewModel = mockk<LocationSelectionViewModel>(relaxed = true)
private val locationClient = mockk<FusedLocationProviderClient>(relaxed = true)
override var testModule = module {
viewModel { viewModel }
factory { locationClient }
}
@Test
fun itShouldDoSomethingWithLocation() {
val scenario = FragmentScenario.launchInContainer(LocationSelectionDialogFragment::class.java)
scenario.moveToState(Lifecycle.State.RESUMED)
scenario.onFragment {
val location = Location("this")
location.latitude = 37.422
location.longitude = -122.084
location.accuracy = …Run Code Online (Sandbox Code Playgroud)