当我点击活动布局中的按钮时,我正在尝试显示GPS坐标.以下是单击按钮时调用的方法:
public void getLocation(View view) {
TextView tv = (TextView) findViewById(R.id.gps_coord_view);
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude());
}
Run Code Online (Sandbox Code Playgroud)
我收到的错误是
呼叫需要用户可能拒绝的许可.代码应明确检查是否有权限.
我已经在我的授权中授予了这些权限AndroidManifest.当我在调用之前添加以下内容时,错误被处理并且应用程序编译lm.getLastKnownLocation:
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我按下点击时调用getLocation的按钮时,应用程序崩溃了.到底是怎么回事?是否有更好/更简单的方法来获取设备的GPS坐标?
我在android中每隔5分钟编写一次自己的后台位置更新.我想知道setInterval和setFastestInterval之间的区别
当我将setInterval设置为5分钟并将setFastestInterval设置为2分钟.每2分钟调用一次位置更新.
我想知道区别.我无法理解这个https://developer.android.com/reference/com/google/android/gms/location/LocationRequest.html的开发者页面中究竟写了什么.
另外:只有当第一次更新的距离超过20米并且第二次更新时,是否有内置功能来检查位置更新?
谢谢!
我试图让用户使用当前位置LocationManager.我做了很多研究,似乎找不到任何有同样问题的人.该OnLocationChanged回调似乎永远不会被调用.下面是我的各种代码和logcat.
protected LocationListener locationListener;
protected LocationManager locationManager;
protected Context context;
Run Code Online (Sandbox Code Playgroud)
我的OnCreate()方法
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "IN ON CREATE");
this.context = getActivity();
registerLocationUpdates();
}
Run Code Online (Sandbox Code Playgroud)
我的registerLocationUpdates方法
void registerLocationUpdates() {
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_LOW);
criteria.setPowerRequirement(Criteria.POWER_LOW);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
locationManager = (LocationManager)getActivity().getSystemService(LOCATION_SERVICE);
provider = locationManager.getBestProvider(criteria, true);
// Cant get a hold of provider
if (provider == null) {
Log.v(TAG, "Provider is null");
showNoProvider();
return;
} else {
Log.v(TAG, "Provider: " + …Run Code Online (Sandbox Code Playgroud) LocationManager locationManager = (LocationManager)getApp().getSystemService(Context.LOCATION_SERVICE); //getApp() returns my Application object
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER , 1, 1, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1, 1, this);
Run Code Online (Sandbox Code Playgroud)
那是我用来听的代码.启用GPS后,一切正常.但是,如果我禁用GPS并依赖网络位置,它会给我带来陈旧的结果 - 在这种情况下,从两天前开始.我无法让它更新.调用getLastKnownLocation返回相同的陈旧结果.
谷歌地图更新很好,所以我知道这不是硬件/系统配置问题.
我用Google搜索过,发现一些有类似问题的人,但没有答案.我已经尝试将我的项目定位到API级别8(2.2)以及15(4.0.3).结果相同.我的手机正在运行ICS.
我还试图删除对GPS_PROVIDER的请求,以及在getAllProviders()中包含对所有内容的请求.同样的交易.
知道为什么NETWORK_PROVIDER没有更新?任何帮助将不胜感激.
(PS不,我通常不会使用"1,1"作为我的时间/距离参数;我只是在调试时更改了它.)
编辑:我忘了提到是的,isProviderEnabled()返回true.
我正在开发一个应用程序,在服务中的6分钟和6分钟内整天获得手机的位置,它工作正常,但有时OnLocationChanged网络提供者监听器的方法停止被调用,我不知道为什么.
它由于某种原因停止被调用,但是当我手动启用或禁用提供程序onProviderEnabled并且onProviderDisabled被调用时,提供程序已启用且Lister正在工作.
它恰好发生NETWORK_PROVIDER,GPS_PROVIDER效果很好.
监听器:
LocationListener locationListenerGPS = new LocationListener() {
// @Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO locationListenerGPS onStatusChanged
Log.d(TAG, "Provedor trocado");
}
// @Override
public void onProviderEnabled(String provider) {
Log.w(TAG, "PROVEDOR " + provider + " HABILITADO!");
}
// @Override
public void onProviderDisabled(String provider) {
Log.w(TAG, "PROVEDOR " + provider + " DESABILITADO!");
}
// @Override
public void onLocationChanged(Location location) {
longitudeGPS = …Run Code Online (Sandbox Code Playgroud) 不知道为什么,但有时候LOCManager在关闭应用程序后仍然可以工作.
我在一个Activity中调用onCreate-Methode中的startGPS()(只有一个,我称之为StartActivity).
protected void startGPS(){
try {
lmanager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
lmanager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
lmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
} catch(Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
如果此活动将被销毁(因此,当应用程序将关闭时),我调用endGPS()
public void endGPS(){
try {
lmanager.removeUpdates(this);
lmanager=null;
} catch(Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
一些想法,一些建议,我做错了什么?!
有没有办法访问GPS一次,而不是有一个不断检查位置更新的looper?
在我的场景中,我感兴趣的是找到当前的坐标而不是与GPS卫星的连续连接.有没有人有任何想法如何做到这一点?提前致谢.
我正在尝试实施这篇文章中给出的建议.
不幸的是,我不清楚这些步骤.我尝试实现这些建议,但是即使在我启动和停止locationServices之后,backgroundTimeRemaining仍然继续减少.这就是我开发它的方式:
- (void)applicationDidEnterBackground:(UIApplication *)application {
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task.
self.timer = nil;
[self initTimer];
});
}
Run Code Online (Sandbox Code Playgroud)
initTimer:
- (void)initTimer {
// Create the location manager if this object does not
// already have one.
if (nil == self.locationManager)
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
[self.locationManager …Run Code Online (Sandbox Code Playgroud) 乍一看下面的代码中,mLocationManager对象应该在onCreate(...)完成后超出范围,并且预期的行为onLocationChanged是从未调用或调用几次,直到对象被垃圾回收.但是,返回的对象getSystemService似乎是单例,它存在于范围之外MainActivity(因此它是一个系统服务:)
在进行堆转储并使用Eclipse Memory Analyzer完成后,似乎ContextImpl保留了对LocationManager实例的引用.在内存转储中有两个对LocationManager对象的引用,而在代码中显然只有一个,这意味着在其他地方创建了另一个引用.
我的问题是:
在调用以下实现时,是否有人完整地描述了正在发生的事情:
public abstract Object getSystemService(String name);
Run Code Online (Sandbox Code Playgroud)
是一个懒惰创建的单例返回的对象,创建/保留引用的确切位置是什么?
package com.neusoft.bump.client.storage;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v("TAG", "STARTED");
LocationManager mLocationManager = (LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
Log.v("TAG", "onLocationChanged");
Log.v("TAG", "Latitude: " + location.getLatitude() …Run Code Online (Sandbox Code Playgroud) 我正在编写一个带来当前位置的代码,但它没有给我这个位置,因为它从不调用onLocationChanged().是否有任何方法可以找到该位置.
对于这种情况,mobileLocation将为0,因此执行将转到else块.
我的代码是
public class FindLocation {
private LocationManager locManager;
private LocationListener locListener;
private Location mobileLocation;
private String provider;
public FindLocation(Context ctx){
locManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
locListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(Location location) {
System.out.println("mobile location is in listener="+location);
mobileLocation = location;
}
};
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener);
if (mobileLocation …Run Code Online (Sandbox Code Playgroud) locationmanager ×10
android ×9
gps ×5
geolocation ×3
background ×1
ios ×1
iphone ×1
java ×1
location ×1
objective-c ×1