一个新手问题,我有一个Android应用程序,其中包含一个实现LocationListener的服务。我试图在OnCreate中挂钩事件,并在事情发生变化时用我当前的位置显示烤面包机。由于某种原因,该应用程序没有看到我的GPS,并抱怨我无法访问GPS并在我调用requestLocationUpdates函数时抛出异常。任何建议都会有所帮助,我错过了我的清单中的其他条目,目前我只有(ACCESS_FINE_LOCATION
,ACCESS_COARSE_LOCATION
设置)
谢谢
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
@Override
public void onCreate() {
super.onCreate();
ctx = this;
if ( Build.VERSION.SDK_INT >= 23 &&
ContextCompat.checkSelfPermission( ctx, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission( ctx, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000,1, this);
} else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000,1, this);
}
}
// Toast.makeText(this, "MyService Created", Toast.LENGTH_LONG).show();
}
@Override
public void onLocationChanged(Location location) {
double latitude = 0;
double longitude = 0;
latitude = location.getLatitude();
longitude =location.getLongitude();
if (latitude != 0 && longitude != 0){
Toast.makeText(this, "LAT and LON updated", Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:0)
不完全确定您的具体问题是什么,所以我会选择:
当我的当前位置发生变化时,如何请求定期更新位置并显示祝酒词?
首先要做的事情:
ACCESS_FINE_LOCATION
即可。 无需指定ACCESS_COARSE_LOCATION
。ContextCompat.checkSelfPermission()
,但你在哪里处理用户决定(见here)?如果从未成功请求权限或未正确处理响应,则您的应用实际上没有权限,您将看到您遇到的例外情况。现在提供更多细节并解决上述问题。
历史上,始终通过LocationManager检索位置更新,这是您正在尝试执行的操作。但是,几年来,更好(和推荐)的方法是使用Google Location API(请参阅here)。 但是,Google Location API需要比LocationManager更多的样板。这就是我编写LocationAssistant的原因,这是一个实用程序类,可以为您完成大部分工作。使用LocationAssistant,您可以使用以下方式请求位置更新和显示toast:
public class MyActivity extends Activity implements LocationAssistant.Listener {
private LocationAssistant assistant;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
// You can specify a different accuracy and interval here, depending on the needs of your app
assistant = new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, true);
}
@Override
protected void onResume() {
super.onResume();
assistant.start();
}
@Override
protected void onPause() {
assistant.stop();
super.onPause();
}
@Override
public void onNewLocationAvailable(Location location) {
Toast.makeText(this, location != null ?
"Lat: " + location.getLatitude() + " Lon: " + location.getLongitude() :
"Null location",
Toast.LENGTH_LONG).show(); }
...
}
只要第一个有效位置可用,就会调用 onNewLocationAvailable()
(并在此之后的请求时间间隔内定期调用)。您需要实现一些更多的侦听器方法,这些方法可以处理未授予权限或关闭位置提供程序的情况。但基本上就是这样。
LocationAssistant 还允许您可靠地拒绝模拟位置(如果您的应用需要这样做)。