Android GPS无法访问

时间:2016-10-21 04:45:08

标签: android

一个新手问题,我有一个Android应用程序,其中包含一个实现LocationListener的服务。我试图在OnCreate中挂钩事件,并在事情发生变化时用我当前的位置显示烤面包机。由于某种原因,该应用程序没有看到我的GPS,并抱怨我无法访问GPS并在我调用requestLocationUpdates函数时抛出异常。任何建议都会有所帮助,我错过了我的清单中的其他条目,目前我只有(ACCESS_FINE_LOCATIONACCESS_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();
    }
}

1 个答案:

答案 0 :(得分:0)

不完全确定您的具体问题是什么,所以我会选择:

  

当我的当前位置发生变化时,如何请求定期更新位置并显示祝酒词?

首先要做的事情:

  • 如果您想使用GPS,在清单中使用ACCESS_FINE_LOCATION即可。 无需指定ACCESS_COARSE_LOCATION
  • 对于Marshmallow及以上,您需要在运行时请求位置权限。我看到你有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 还允许您可靠地拒绝模拟位置(如果您的应用需要这样做)。