Android 未调用onLocationChanged

Android 未调用onLocationChanged,android,google-maps,geolocation,Android,Google Maps,Geolocation,我一直在尝试创建一个与地图相关的android应用程序,但我意识到我的应用程序的onLocationChanged没有被调用,因此地图始终保持在默认区域(美国) 我的代码: public class MapMainActivity extends MapActivity implements OnClickListener, LocationListener { MapView mapView; /** Called when the activity is first created.

我一直在尝试创建一个与地图相关的android应用程序,但我意识到我的应用程序的onLocationChanged没有被调用,因此地图始终保持在默认区域(美国)

我的代码:

public class MapMainActivity extends MapActivity 
implements OnClickListener, LocationListener {

MapView mapView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_main);

    //reference
    mapView = (MapView)findViewById(R.id.map_view);
    mapView.setBuiltInZoomControls(true);
    this.findViewById(R.id.btn_satellite).setOnClickListener(this);
    this.findViewById(R.id.btn_street).setOnClickListener(this);

}//onCreate

@Override
protected void onResume() {
    super.onResume();

    Toast.makeText(this, "GPS tracking started",
        Toast.LENGTH_SHORT).show();

 // Start location updates; 5s/5m
    LocationManager locManager = (LocationManager)getSystemService(
        Context.LOCATION_SERVICE);
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
        5000, 0, this);

    Criteria crit = new Criteria();
    crit.setAccuracy(Criteria.ACCURACY_FINE);
    String provider = locManager.getBestProvider(crit, true);
    Location loc = locManager.getLastKnownLocation(provider);

}//onResume

@Override
protected void onPause() {
    super.onPause();

    Toast.makeText(this, "GPS tracking stopped", 
        Toast.LENGTH_SHORT).show();

    LocationManager locManager = (LocationManager)getSystemService(
            Context.LOCATION_SERVICE);
        locManager.removeUpdates(this);
}//onPause

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(v == findViewById(R.id.btn_street))
    {
        mapView.setSatellite(false);
    }//street view

    else if (v == findViewById(R.id.btn_satellite))
    {
        mapView.setSatellite(true);
    }
}//onClick

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}//isRouteDisplayed

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    double lat = location.getLatitude();
    double lon = location.getLongitude();

    TextView txtLat = (TextView)findViewById(R.id.txt_lat);
    txtLat.setText(String.format("%.6f", lat));
    TextView txtLon = (TextView)findViewById(R.id.txt_lon);
    txtLon.setText(String.format("%.6f", lon));

    MapView map = (MapView)findViewById(R.id.map_view);
    map.getController().animateTo(new GeoPoint((int)(lat*1E6),//1000000), 
        (int)(lon*1E6)));
}//onLocationChanged

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "GPS disabled", 
            Toast.LENGTH_SHORT).show();
}//onProviderDisabled

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "GPS enabled", 
            Toast.LENGTH_SHORT).show();
}//onProviderEnabled

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}//onStatusChanged


}//class
当我通过我的设备运行应用程序时,我的整个日志猫(16/12/2011)

舱单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="sg.edu.tp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".SIP_MLT_TestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <uses-library android:name="com.google.android.maps" />
        <activity android:name=".SIP_TestMapActivity"></activity>
        <activity android:name=".SIP_TestDraw1Activity"></activity>
        <activity android:name=".SIP_TestDraw2Activity"></activity>
    </application>

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

</manifest>

您是在移动时还是在用USB连接到您的开发设备并观看logcat时进行测试

如果坐在开发人员的机器上,我怀疑您无法移动触发位置更改事件所需的5米,正如您在调用RequestLocationUpdate时所请求的那样

来自文档:

如果minDistance大于0,则仅当 该装置通过距离计移动

尝试将该调用中的min distance参数减少为零,看看会发生什么

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,5000, 0, this);
除了测试之外,您可能不想将其保留为零

如果这对你没有帮助,在你要求位置更新后,你可以在你的简历中这样做,看看你的GPS是否正常工作:

Criteria crit = new Criteria();
crit.setAccuracy(Criteria.ACCURACY_FINE);
String provider = lm.getBestProvider(crit, true);
Location loc = lm.getLastKnownLocation(provider);

并查看您是否获得了良好的位置信息。

位置搜索很棘手。一方面,你需要最新的快速定位,以尽可能高的精度;另一方面,你不喜欢快速消耗电池电量。API级别之间也存在差异。详细说明见本手册:

至于你最初的问题-重新查询位置更新只是建议位置经理在某些更改后向你发送这些更新。没有义务这么做 所以您的GPS系统可能不够好(当然也不够好),无法在使用USB电缆时检测到所有位置的变化。出于测试目的,您可以创建模拟提供程序 并用她的应用程序操纵它


您是如何更改位置的??呃。。。我真的不明白你的意思。但是,由于我不在状态,当我运行应用程序时,它不应该显示状态图。不,我通过我的设备(三星galaxy R)运行它。是的,我用插入com的usb测试它。当我从5变为0时,什么也没有发生。我用onLocationChanged方法插入的日志测试了应用程序,当我运行应用程序时,日志不会出现。所以我猜它甚至没有进入这个方法。我已经更新了上面的代码和日志。请帮忙。Thank=)尝试在onResume的末尾进行一些日志记录,然后查看loc包含的内容,以确保您从位置提供程序获得了一些内容。另外,您是否确定您的清单包含权限?在我在onResume中添加了Log.d(“location”,String.valueof(loc))之后,在条件之后,返回为nullhi,你能告诉我我该如何把代码放在哪里吗?thks
Criteria crit = new Criteria();
crit.setAccuracy(Criteria.ACCURACY_FINE);
String provider = lm.getBestProvider(crit, true);
Location loc = lm.getLastKnownLocation(provider);