我需要以编程方式使用GPS获取当前位置.我怎样才能实现它?
在我的应用程序中,我想确定用户的当前位置.但是我在这方面有几个问题:
我需要Google Maps在Android中开发一个应用程序来定位我当前的位置并需要找到最近的位置.
(例如:我当前所在地附近的警察局.)
它应该接受我当前的位置和输出应该显示最近的地方.
任何人都可以帮我提一些建议,链接,教程吗?
其实我的问题是我没有得到当前的位置纬度和经度我尝试了很多方法.我知道这个问题已经问过我试过那个答案还是我还没有得到答案.请帮助我代码:
if (googleMap == null) {
googleMap = ((MapFragment) getFragmentManager().findFragmentById(
R.id.map)).getMap();
// check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getApplicationContext(),
"Sorry! unable to create maps", Toast.LENGTH_SHORT)
.show();
}
}
googleMap.setMyLocationEnabled(true);
Location myLocation = googleMap.getMyLocation(); //Nullpointer exception.........
LatLng myLatLng = new LatLng(myLocation.getLatitude(),
myLocation.getLongitude());
CameraPosition myPosition = new CameraPosition.Builder()
.target(myLatLng).zoom(17).bearing(90).tilt(30).build();
googleMap.animateCamera(
CameraUpdateFactory.newCameraPosition(myPosition));
Run Code Online (Sandbox Code Playgroud) 我有一个需要设备当前位置(经度和纬度)的Android应用程序.我已经在网上尝试了一些教程,特别是堆栈溢出的一些解决方案,但它们对我来说效果不好.我的要求非常简单:首先我需要它快速并且在片段开始时需要一次位置.其次我需要它尽可能精确,我的意思是如果GPS不可用,它应首先使用GPS,然后使用网络提供商.
例如,我已经尝试过这个解决方案,但它在30秒后返回null,但我知道有一些所有的东西都可以,因为谷歌地图和其他应用程序运行良好!
几乎所有答案建议的东西都是使用getLastKnownLocation(),但我认为它不是当前的,如果是这样的话我不想要它.
任何人都可以建议我一些简单快捷的方式来获取位置只是一次?!
提前致谢
即使手机没有醒来,我的应用也需要定期修复定位.为此,我使用IntentService和Commonsware慷慨提供的模式. https://github.com/commonsguy/cwac-wakeful
为了获得位置修复,我依赖于一个名为Fedor的成员提供的以下代码. 在Android上获取用户当前位置的最简单,最强大的方法是什么?.我稍微修改它以返回null而不是获取最后的已知位置
它们在没有组合时都能很好地工作:我可以在一个Activity中从Fedor的类中获得一个位置修复,我可以使用Commonsware类做一些基本的东西(比如记录一些东西).
当我试图从Commonsware的WakefulIntentService子类获取位置修复时,会出现问题.LocationListeners没有对locationUpdates做出反应,我得到了这些警告(我还没有得到线程,处理程序......的细微之处).有人可以帮我理解问题所在吗?谢谢,祝大家新年快乐:)
12-31 14:09:33.664: W/MessageQueue(3264): Handler (android.location.LocationManager$ListenerTransport$1) {41403330} sending message to a Handler on a dead thread
12-31 14:09:33.664: W/MessageQueue(3264): java.lang.RuntimeException: Handler (android.location.LocationManager$ListenerTransport$1) {41403330} sending message to a Handler on a dead thread
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:196)
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessage(Handler.java:383)
12-31 14:09:33.664: W/MessageQueue(3264): at android.location.LocationManager$ListenerTransport.onLocationChanged(LocationManager.java:193)
12-31 14:09:33.664: W/MessageQueue(3264): at android.location.ILocationListener$Stub.onTransact(ILocationListener.java:58)
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Binder.execTransact(Binder.java:338)
12-31 14:09:33.664: W/MessageQueue(3264): at dalvik.system.NativeStart.run(Native Method)
Run Code Online (Sandbox Code Playgroud)
这是我的WakefulIntentService子类: …
我正在研究android中的gps跟踪应用程序.这是我的代码架构:
BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果它停止然后它开始.BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果它停止然后它开始.BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果停止,则启动.在我的BackgroundSyncService服务中,我使用以下方式初始化GoogleApiClient:
public void setLocationLocationRequest() {
try {
googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).addApi(com.google.android.gms.location.LocationServices.API).build();
locationRequest = new LocationRequest();
locationRequest.setInterval(3000);
locationRequest.setFastestInterval(3000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
googleApiClient.connect();
} catch (Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
这里是accuricy LocationRequest.PRIORITY_HIGH_ACCURACY和间隔
locationRequest.setInterval(3000)
Run Code Online (Sandbox Code Playgroud)
这是GoogleApiClient实现代码.
此应用程序GPS信息部分包含纬度经度和精度参数
我的发现:在onLocationChanged(Location location)方法中我用这种方式检查Location对象的准确性:location.getAccuracy().如果精度小于50米,那么我接受它.
在85%的情况下,它像魅力一样工作.它向我发送GPS的确切位置.但在15%的情况下,它给我发送了不准确的位置,如超过300米.
15%的设备是低成本的中国品牌手机.
我的问题:
在此先感谢此主题.并且抱歉英语不好.
我使用下面给出的代码来获取位置:
public Location getLocation() {
try {
mLocationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
// getting GPS status
boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
// First get location from Network Provider
if (isNetworkEnabled) {
mLocationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (mLocationManager != null) {
location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
lat = location.getLatitude();
lng = location.getLongitude();
}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要用户当前位置的应用程序(lastknownlocation不会非常有帮助),并显示从数据库中获取的所有最近"项目"的列表.
我发现最近的项目运行良好,但目前仅使用硬编码的纬度和经度位置,但现在是时候实现查找实际位置了.
任何人都可以提供一个示例,说明如何让应用程序在后台找到当前的好位置并让应用程序等待.当人们移动时,我只需要一次不更新的位置.我已经实现了一个位置监听器,但我知道获得GPS定位可能会很慢.我已经看到了使用上一个已知位置或实现位置监听器的其他示例,该位置监听器继续运行和更新,但是因为我的Activity需要位置坐标才能显示应用程序崩溃的任何内容.我需要在搜索时显示进度对话框.
如何让locationlistener在后台运行一次,然后在找到位置后删除位置更新.我需要应用程序的其余部分等到它有GPS位置或超时后说20-30秒.我想要一个ProgressDialog,以便用户知道某些事情正在发生,但它必须是旋转加载动画而不是百分比或任何东西.如果可能的话,我希望用户能够取消对话,如果他们厌倦了等待,那么他们可以通过键入郊区等来搜索.
我一直试图用线程做到这一点,但它变得比我觉得应该更复杂,但仍然无法工作.在iPhone上这更简单了吗?
任何人都可以提供一个很好的方法来做到这一点,我已经把我的头发扯了一个星期,这真的让我落后于应用程序完成日期的剩余时间.
总结一下,我想:
*找到当前坐标
*获取位置时显示进度对话框
*让应用程序能够等待成功的位置或在一段时间后放弃?
*如果成功:关闭进度对话框并使用坐标运行我的其他方法来查找附近的项目.
*如果获取位置失败:取消进度对话框并显示错误消息,并鼓励用户使用菜单转到"搜索活动".
*如果用户从菜单中选择地图视图,则使用这些坐标,以显示地图上的当前位置,并使用数据库中的坐标将引脚放在所有附近的项目上.
谢谢你们,我希望我能够很好地解释自己.如有任何问题,我会定期回来查看,因为我很想完成这部分.干杯
根据要求编辑代码
locationList活动文件
protected void onStart()
{
super.onStart();
// ....
new LocationControl().execute(this);
}
private class LocationControl extends AsyncTask<Context, Void, Void>
{
private final ProgressDialog dialog = new ProgressDialog(branchAtmList.this);
protected void onPreExecute()
{
this.dialog.setMessage("Determining your location...");
this.dialog.show();
}
protected Void doInBackground(Context... params)
{
LocationHelper location = new LocationHelper();
location.getLocation(params[0], locationResult);
return null;
}
protected void onPostExecute(final Void unused)
{
if(this.dialog.isShowing())
{
this.dialog.dismiss();
}
useLocation(); //does the …Run Code Online (Sandbox Code Playgroud)