- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想提出以下问题。
我有一个 Android 应用程序,它同时使用了 UserLocation(我开发了自己的类,以便获取应用程序启动的时间,正如我在下面解释的那样)和 Google Maps Api v2。
假设应用程序有两个按钮按钮一--> 当用户单击应用程序时会显示带有很多标记的 map ,我使用的是 google maps api V2 fragment 。我可能会使用以下行来显示用户位置。
mMap.setMyLocationEnabled(true);
按钮二--> 启动 AsyncTask 以获取用户位置并计算壁橱位置,然后显示在 map 和 ListView 上。下面我提供了执行此操作的所有代码:
private class findPosicionTask extends AsyncTask<Void,Integer,Location>
{
private final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
private int error = 0;
private Activity actividad;
private int procesoTerminado=0;
public findPosicionTask(Activity actividad)
{
this.actividad = actividad;
}
@Override
protected void onPreExecute()
{
if (!LocationSettingsManager.isLocationServiceAvaliable(getApplicationContext()))
{
cancel(true);
}
else
{
this.dialog.setMessage(getString(R.string.obteniendoPoisicion));
this.dialog.show();
}
}
@Override
protected Location doInBackground(Void... params)
{
if (this.error==0)
{
try
{
Looper.prepare();
MyLocationManager.LocationResult locationResult = new MyLocationManager.LocationResult(){
@Override
public void gotLocation(Location location) {
if (location!=null)
{
LocationSingleton posicionSingleton = (LocationSingleton)getApplication();
posicionSingleton.setMiPoscion(location);
posicionSingleton.setFecha(new Date());
procesoTerminado=1;
onPostExecute(location);
}
else
{
procesoTerminado=1;
onPostExecute(location);
}
}
};
MyLocationManager myLocation = new MyLocationManager();
if (!myLocation.getLocation(getApplicationContext(), locationResult))
{
}
}
catch (Exception e)
{
error=2;
cancel(true);
return null;
}
}
return null;
}
@Override
protected void onPostExecute(Location posicion)
{
if (procesoTerminado==1)
{
if (this.dialog.isShowing())
{
this.dialog.dismiss();
}
if (error==0)
{
if (posicion==null)
{
MessageManager.muestraMensaje(this.actividad, R.string.noSeObtuvoLocalizacion);
}
else
{
ArrayList centros = DBFacade.findCentros(getBaseContext());
ArrayList<Centro> centrosMasCercanos = DistanciasManager.getCentrosMasCercanos(posicion, centros);
Intent i = new Intent(getBaseContext(), CentrosCercanosActivity.class);
i.putExtra("centrosMasCercanos", centrosMasCercanos);
i.putExtra("posicion", posicion);
startActivity(i);
}
}
else
{
if (error==2)
{
MessageManager.muestraMensaje(this.actividad, R.string.noSeObtuvoLocalizacion);
}
}
}
}
@Override
protected void onCancelled() {
super.onCancelled();
if (this.dialog.isShowing())
{
this.dialog.dismiss();
}
MessageManager.muestraMensaje(this.actividad, R.string.servicioLocalizacionDesactivado);
}
}
这是我自己的 MyLocationManager 类
public class MyLocationManager {
Timer timer1;
LocationManager lm;
LocationResult locationResult;
boolean gps_enabled=false;
boolean network_enabled=false;
public boolean getLocation(Context context, LocationResult result)
{
//I use LocationResult callback class to pass location value from MyLocation to user code.
locationResult=result;
if(lm==null)
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//exceptions will be thrown if provider is not permitted.
try
{
gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
catch(Exception ex)
{
}
try
{
network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
catch(Exception ex)
{
}
//don't start listeners if no provider is enabled
if(!gps_enabled && !network_enabled)
return false;
if (gps_enabled)
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
if (network_enabled)
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
timer1=new Timer();
timer1.schedule(new GetLastLocation(), 5000);
return true;
}
LocationListener locationListenerGps = new LocationListener()
{
@Override
public void onLocationChanged(Location location) {
Location gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
long diffInMs = (new Date().getTime()/60000) - (gps_loc.getTime()/60000);
if (diffInMs<1)
{
if (((int)gps_loc.getAccuracy())<=3000)
{
lm.removeUpdates(this);
lm.removeUpdates(locationListenerNetwork);
timer1.cancel();
locationResult.gotLocation(gps_loc);
Looper.loop();
return;
}
}
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
LocationListener locationListenerNetwork = new LocationListener()
{
@Override
public void onLocationChanged(Location location) {
Location net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
long diffInMs = (new Date().getTime()/60000) - (net_loc.getTime()/60000);
if (diffInMs<1)
{
if (((int)net_loc.getAccuracy())<=3000)
{
lm.removeUpdates(this);
lm.removeUpdates(locationListenerGps);
timer1.cancel();
locationResult.gotLocation(net_loc);
Looper.loop();
return;
}
}
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
class GetLastLocation extends TimerTask
{
@Override
public void run()
{
Looper.prepare();
lm.removeUpdates(locationListenerGps);
lm.removeUpdates(locationListenerNetwork);
Location net_loc=null;
Location gps_loc=null;
Location finalLocation=null;
if(gps_enabled)
gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(network_enabled)
net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
long diffInMs;
if (gps_loc!=null)
{
diffInMs = (new Date().getTime()/60000) - (gps_loc.getTime()/60000);
if (diffInMs>1)
gps_loc=null;
}
if (net_loc!=null)
{
diffInMs = (new Date().getTime()/60000) - (net_loc.getTime()/60000);
if (diffInMs>1)
net_loc=null;
}
if (gps_loc!=null || net_loc!=null)
{
int gpsAccuracy = 1000000;
int netAccuracy = 1000000;
if (gps_loc!=null)
gpsAccuracy = (int)gps_loc.getAccuracy();
if (net_loc!=null)
netAccuracy = (int)net_loc.getAccuracy();
if (netAccuracy<gpsAccuracy)
finalLocation=net_loc;
else
finalLocation=gps_loc;
if (((int)finalLocation.getAccuracy())<=3000)
{
locationResult.gotLocation(finalLocation);
Looper.loop();
return;
}
else
{
locationResult.gotLocation(null);
Looper.loop();
return;
}
}
else
{
locationResult.gotLocation(null);
Looper.loop();
return;
}
}//fin del run
}//fin de la clase GetLastLocation
public static abstract class LocationResult{
public abstract void gotLocation(Location location);
}
}
正如您在 AsyncTask 的 OnPreExecute 方法中看到的那样,检查位置提供程序是否已启用:
public static boolean isLocationServiceAvaliable(Context mContext)
{
String locationProviders = Settings.Secure.getString(mContext.getContentResolver(),Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if (locationProviders.trim().equals(""))
return false;
else
return true;
}
好吧,大多数时候该应用程序运行良好,但在某些情况下(这让我很生气),方法“isLocationServiceAvaliable”返回 false,因此该应用程序表示未启用位置提供程序。
即使在设备设置中启用了位置提供程序,也会发生这种情况,更奇怪的是,如果用户点击按钮一,应用程序会显示带有用户位置属性的谷歌地图。
那么 Google Maps Api V2 如何在当前未启用提供程序的情况下获取设备位置?有什么方法可以使用与我在 MyLocationManager 类上使用的方法相比似乎更有效的方法。
非常感谢你阅读我的帖子
最佳答案
Google 正在使用来自 googleplayservices 的位置提供程序。它 super 高效且 super 容易编码。第一个位置(最后一个已知位置)非常快。
没有任何复杂的供应商检查,它只适用于打开的内容。意思是如果用户以某种方式打开 gps。 googleplayservices 提供商将开始使用它。
这些是步骤。
github MapMover the complete.java code here
locationClient = new LocationClient(activity, this, this);
locationClient.connect();
public void onConnected(Bundle dataBundle) {
// Create a new global location parameters object
locationRequest = LocationRequest.create();
// Set the update interval 70% of the interval
// this is to make sure we have an updated location
// when the animation completes
locationInterval = (long) (interval * .70);
locationRequest.setInterval(locationInterval);
locationRequest.setFastestInterval(locationInterval);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationClient.requestLocationUpdates(locationRequest, this);
}
@Override
public void onLocationChanged(Location location) {
// here you have a location to do with what you will
}
关于java - Google Maps API V2 如何获取位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22934689/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!