Android - using LocationManager does not give a geo fix

前端 未结 3 1452
孤街浪徒
孤街浪徒 2021-01-03 10:18

I am trying to get the GPS location of my G1 using the following code

In Activity

MyLocationListener myListener = new MyLocationList         


        
相关标签:
3条回答
  • 2021-01-03 10:36

    Here's a nice example with source code http://marakana.com/forums/android/android_examples/42.html

    0 讨论(0)
  • 2021-01-03 10:39

    Firstly, in your activity, where you're calling requestLocationUpdates(), the second argument is the minimum time, not the scheduled time. You're currently asking for an update AT MOST every 2 seconds. It won't actually report anything until it can... sometimes it takes a little while.

    If your GPS is unresponsive/slow elsewhere as well (like in Maps) try restarting the phone (some people claim you have to turn off the phone then pull out the battery to completely de-energized the GPS radio). Hopefully this will bring it back up to it's normally responsive state.

    Also, it shouldn't matter, but you said you were using the 1.5 SDK, but you didn't mention if you were compiling against it (as opposed to 1.1). I only bring this up because the GPS works better/faster in Cupcake, so I was wondering what your phone was actually running.

    UPDATE:

    I wrote up a little test on my own to see if I could duplicate your problem. It consists of just three user-generated files and I tested it with SDK 1.1 and 1.5

    In the main Activity (I simply used Main.java):

    package org.example.LocationTest;
    
    import android.app.Activity;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    public class Main extends Activity implements LocationListener{
        private LocationManager myManager;
        private TextView tv;
    
    
        /********************************************************************** 
         * Activity overrides below 
         **********************************************************************/
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            // get a handle to our TextView so we can write to it later
            tv = (TextView) findViewById(R.id.TextView01);
    
            // set up the LocationManager
            myManager = (LocationManager) getSystemService(LOCATION_SERVICE);   
        }
    
        @Override
        protected void onDestroy() {
            stopListening();
            super.onDestroy();
        }
    
        @Override
        protected void onPause() {
            stopListening();
            super.onPause();
        }
    
        @Override
        protected void onResume() {
            startListening();
            super.onResume();
        }
    
    
    
        /**********************************************************************
         * helpers for starting/stopping monitoring of GPS changes below 
         **********************************************************************/
        private void startListening() {
            myManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 
                0, 
                0, 
                this
            );
        }
    
        private void stopListening() {
            if (myManager != null)
                myManager.removeUpdates(this);
        }
    
    
    
    
        /**********************************************************************
         * LocationListener overrides below 
         **********************************************************************/
        @Override
        public void onLocationChanged(Location location) {
            // we got new location info. lets display it in the textview
            String s = "";
            s += "Time: "        + location.getTime() + "\n";
            s += "\tLatitude:  " + location.getLatitude()  + "\n";
            s += "\tLongitude: " + location.getLongitude() + "\n";
            s += "\tAccuracy:  " + location.getAccuracy()  + "\n";
    
            tv.setText(s);
        }    
    
        @Override
        public void onProviderDisabled(String provider) {}    
    
        @Override
        public void onProviderEnabled(String provider) {}    
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    }
    

    In your "main" layout file (I used main.xml):

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:id="@+id/TextView01"
            android:text="Waiting for location information..." 
        />
    </LinearLayout>
    

    Then, in your AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="org.example.LocationTest"
        android:versionCode="1"
        android:versionName="1.0">
        <application 
            android:icon="@drawable/icon" 
            android:label="@string/app_name">
            <activity 
                android:name=".Main"
                android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-sdk android:minSdkVersion="3" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    </manifest> 
    

    You should be able to compile/run this just fine. If, using this, you still can't get a fix it's not a software problem. You either have a bad GPS or it just can't get a lock on any satellites.

    You can download the source here.

    0 讨论(0)
  • 2021-01-03 10:46
    1. Is your GPS enabled in your device settings? I presume so since you are getting the GPS icon, but I figured I'd check.
    2. onProviderDisabled() will only get called if you disable GPS in the settings, and so that code is unlikely to get invoked.
    3. Have you tried a distance of 0 instead of 2000?
    4. Are you sure that your call to requestLocationUpdates() is actually getting executed?
    5. Does your log show any errors? You can examine your log via adb logcat, DDMS, or the DDMS perspective in Eclipse.
    6. Have you tried any existing code, published, that should work? For example, you can grab the source code to my Android book, where the Weather and WeatherPlus samples show the use of LocationManager.
    0 讨论(0)
提交回复
热议问题