LocationManager的requestLocationUpdates无法工作

6
我正在尝试使用LocationManager和LocationListener在Android中获取当前位置,如http://developer.android.com/guide/topics/location/obtaining-user-location.html所述。
然而,LocationListener的onLocationChanged方法从未被调用。我已经使用了真实的Android手机/模拟器,并使用telnet模拟了位置更改,如上面链接中所述。
这是我的代码:
public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        /* Use the LocationManager class to obtain GPS locations */
        LocationManager mlocManager = (LocationManager) 
                getSystemService(Context.LOCATION_SERVICE);
        LocationListener mlocListener = new CustomLocationListener(
                getApplicationContext());
        // Location Providers
        String locationProvider = LocationManager.NETWORK_PROVIDER;
        // LocationProvider locationProvider = LocationManager.GPS_PROVIDER;
        mlocManager
                .requestLocationUpdates(locationProvider, 0, 0, mlocListener);
    }
}

以及我的位置监听器:

public class CustomLocationListener implements LocationListener {

    private Context m_context;

    public CustomLocationListener(Context context) {
        m_context = context;
    }

    @Override
    public void onLocationChanged(Location location) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        String Text = latitude + " " + longitude;
        Toast.makeText(m_context, Text, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO
    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}
}

所以onLocationChanged从未被调用。 有人能看出问题吗?谢谢。

你是否已经在手机上启用了GPS服务,并确认您应该拥有位置信息?(等待几分钟并不是确认,如果您处于信号较差的区域,30分钟可能还不够……) - Sam
必须问一下:您在清单文件中指定了位置权限吗? - dymmeh
@dymmeh 是的,我已经在清单文件中添加了权限。 - Dan Dinu
@Sam 我理解 NETWORK_PROVIDER 不使用手机的 GPS。 - Dan Dinu
@DanDinu 对不起,我误读了你的问题。正如你所知道的,网络位置不需要启用GPS服务,它需要启用网络提供商。解决问题有什么进展吗?你的代码看起来很好。 - Sam
4个回答

4
你可以让你的手机决定最佳供应商,而不仅仅是进行设置。
String locationProvider = LocationManager.NETWORK_PROVIDER;

尝试使用这个替代方案:
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);   
String locationProvider = mlocManager.getBestProvider(criteria, true);

另外,您是否尝试将设备移至新位置进行测试?否则,“onlocationchanged”事件可能不会触发。几年前我在搞定这些问题时,我加入了一些“toast”提示我的纬度/经度坐标,以便我走在街区周围验证事件是否正在触发。

1
我该如何让模拟器“前往新位置”? - Mathias Lykkegaard Lorenzen
1
@MathiasLykkegaardLorenzen:我总是使用设备进行开发,但如果您按照Dan Dinu上面的原始问题链接,似乎可以在模拟器中模拟位置。转到该文章底部并查看“在模拟器控制台中使用“geo”命令”。 - CircuitBreaker716
将我的设备移动到新的位置解决了问题!谢谢 - arthur bryant

3
这对我来说看起来像是Android Bug 57707
如果是的话,重新启动设备应该会有所帮助,至少可以暂时解决问题。
或者您可以使用Google Play Services Location API
通过同时使用Wifi、GPS和网络定位,Google Play Services位置API将隐藏网络定位出现故障的事实;只有在没有GPS和Wifi可用时才会显而易见。

1

请确保在设置中启用了适当的位置服务。您还可以使用isProviderEnabled()检查您选择的特定提供程序是否有效。并确保在清单中具有COARSE或FINE位置权限。

此外,请确保您正在设备上进行测试。网络位置在模拟器中根本无法工作,只有在使用模拟工具注入新数据点时,GPS才能正常工作。


很不幸,isProviderEnabled()并没有像宣传的那样正常工作。请参考:https://dev59.com/e2kw5IYBdhLWcg3wE2dA 和 https://dev59.com/W3LYa4cB1Zd3GeqPY4mI。 - Jules

0

我遇到了类似的问题。尝试将getApplication()替换为MainAvtivity.this

另外,请确保您同时保留FINE和COARSE位置权限。如果您的目标API大于23,则还应从Java代码处理权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接