android - 如何使用 Android LocationManager 和 Listener

标签 android service gps locationmanager

我无法使用下面的代码从 GPS 接收任何数据,而且我不确定自己做错了什么,似乎我的代码与我在网上看到的所有内容都匹配。我想最终将它添加到后台服务以记录 gps 坐标,即使 Activity 不可见或其他应用程序打开并且速度大于某个定义的数量,但此时我不能甚至可以显示任何数据。我是 android 的新手,但我不知道我做错了什么?

public class MainActivity extends Activity {
TextView textView;
MyLocationListener myLocationListener;
LocationManager lm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    this.textView = (TextView)findViewById(R.id.message);
    addLocationListener();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private void addLocationListener()
{
    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

    Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_FINE);

    final String PROVIDER = lm.getBestProvider(c, true);

    this.myLocationListener = new MyLocationListener();
    this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0L, 0.0F, this.myLocationListener);
    //lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0.0F, myLocationListener);
    Log.d("LOC_SERVICE", "Service RUNNING!");
}

public void updateLocation(Location location)
{
    double latitude, longitude;

    latitude = location.getLatitude();
    longitude = location.getLongitude();
    int mph = convertSpeed(location.getSpeed());
    Log.d("LOC_SERVICE", "mph: "+mph);
    this.textView.setText(this.textView.getText()+"\n"+"lat: "+latitude+" lng: "+longitude+" mph: "+mph);
}


private int convertSpeed(float speed) {
    int mph =(int)(2.236936D * speed);
    return mph;
}


class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        Log.d("LOC_SERVICE", "Listener RUNNING!");
        updateLocation(location);
    }
    @Override
    public void onProviderDisabled(String provider) {}
    @Override
    public void onProviderEnabled(String provider) {}
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}
}
}

最佳答案

您需要先使用权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

接下来你在 onCreate() 方法中使用下面的代码来访问 GPS。

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
            2000, 1, this);

}

现在,如果 GPS 未启用,则需要引用以下代码。详细解释可以引用how to get[DEAD LINK] [current location in android] 1教程。

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
         startActivity(intent);

这里我们使用 intents 将用户重定向到位置设置页面,以便他可以在位置设置下启用 GPS。

关于android - 如何使用 Android LocationManager 和 Listener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21085497/

相关文章:

android - 关于 Google 文字转语音 TTS 的许可问题

android - 构建本地单元测试(未注册仪器!必须在注册仪器下运行)

java - 如何在 Firebase 中订购 'subdata'?

java - Tomcat 停止问题 + Spring boot + 服务

java - Android错误,无法实例化服务...接口(interface)无法实例化

android - 获取到一个点的最短距离

android - ImageSwitcher 从 url 加载图片

java - 是否可以从用户模式 ​​java 应用程序查询特权 Windows 服务?

android - 如何不断地将GPS数据从android发送到服务器直到应用程序关闭

android - 在 iOS 和 Android 上,如果两个应用程序都向操作系统请求 GPS 流,电池使用量会加倍吗?