Android GPS位置始终将位置显示为零

Android GPS位置始终将位置显示为零,android,android-asynctask,gps,locationmanager,Android,Android Asynctask,Gps,Locationmanager,我在点击按钮时通过电子邮件发送用户的位置。AsyncTask的doInBackground如下所示 @Override protected Boolean doInBackground(String... arg0) { // TODO Auto-generated method stub boolean status = false; try { double latitude=0; double longitude=0; GPSTracker

我在点击按钮时通过电子邮件发送用户的位置。AsyncTask的doInBackground如下所示

@Override
protected Boolean doInBackground(String... arg0) {
    // TODO Auto-generated method stub
    boolean status = false;
    try {
    double latitude=0;
    double longitude=0;
    GPSTracker gps=new GPSTracker(MainActivity.this);
    if(gps.canGetLocation()){
        latitude=gps.getLatitude();
        longitude=gps.getLongitude();
    }
    String mapUrl= "https://www.google.co.in/maps/@"+latitude+","+longitude+",17z";
    GMailSender sender = new GMailSender(
        "myemail@gmail.com", "password",
        getApplicationContext());
    status = sender.sendMail(" Subject ", "\nLocation : "+mapUrl,"myemail@gmail.com",
         "anothermail@gmail.com");
    } catch (Exception e) {
    }
    return status;
}
但始终将位置返回为0,0

GPSTracker.java

locationManager = (LocationManager) mContext
    .getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
    .isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
    // no network provider is enabled
    } else {
    this.canGetLocation = true;
    if (isNetworkEnabled) {
        locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER,
            MIN_TIME_BW_UPDATES,
            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
        Log.d("Network", "Network Enabled");
        if (locationManager != null) {
            location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            if (location != null) {
                latitude = location.getLatitude();
                longitude = location.getLongitude();
            }
        }
    }
    // if GPS Enabled get lat/long using GPS Services
    if (isGPSEnabled) {
        locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER,                    
                        MIN_TIME_BW_UPDATES,
            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
        Log.d("GPS", "GPS Enabled");
        if (locationManager != null) {
            location = locationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (location != null) {
                latitude = location.getLatitude();
                longitude = location.getLongitude();
            }
        }
    }
}
日志显示

05-16 22:01:30.449: W/System.err(12459): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-16 22:01:30.489: W/System.err(12459): at android.os.Handler.<init>(Handler.java:121)
05-16 22:01:30.489: W/System.err(12459): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:198)
05-16 22:01:30.489: W/System.err(12459): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:198)
05-16 22:01:30.499: W/System.err(12459): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:604)
05-16 22:01:30.499: W/System.err(12459): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:471)
05-16 22:01:30.509: W/System.err(12459): at com.package.utils.GPSTracker.getLocation(GPSTracker.java:65)
05-16 22:02:07.309: W/System.err(12459): at com.package.utils.GPSTracker.getLocation(GPSTracker.java:65)
05-16 22:02:07.309: W/System.err(12459): at com.package.utils.GPSTracker.<init>(GPSTracker.java:44)
05-16 22:02:07.309: W/System.err(12459):    at com.webnamaste.ulrasoundindia.MainActivity$SendMailTask.doInBackground(MainActivity.java:255)
05-16 22:02:07.319: W/System.err(12459): at com.package.ulrasoundindia.MainActivity$SendMailTask.doInBackground(MainActivity.java:1)
05-16 22:02:07.319: W/System.err(12459): at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-16 22:02:07.319: W/System.err(12459): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-16 22:02:07.319: W/System.err(12459): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-16 22:02:07.319: W/System.err(12459): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-16 22:02:07.339: W/System.err(12459): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-16 22:02:07.339: W/System.err(12459): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-16 22:02:07.349: W/System.err(12459): at java.lang.Thread.run(Thread.java:856)
05-16 22:01:30.449:W/System.err(12459):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
05-16 22:01:30.489:W/System.err(12459):在android.os.Handler。(Handler.java:121)
05-16 22:01:30.489:W/System.err(12459):在android.location.LocationManager$ListenerTransport$1。(LocationManager.java:198)
05-16 22:01:30.489:W/System.err(12459):在android.location.LocationManager$ListenerTransport。(LocationManager.java:198)
05-16 22:01:30.499:W/System.err(12459):在android.location.LocationManager.\u请求locationupdates(LocationManager.java:604)
05-16 22:01:30.499:W/System.err(12459):位于android.location.LocationManager.RequestLocationUpdate(LocationManager.java:471)
05-16 22:01:30.509:W/System.err(12459):位于com.package.utils.GPSTracker.getLocation(GPSTracker.java:65)
05-16 22:02:07.309:W/System.err(12459):位于com.package.utils.GPSTracker.getLocation(GPSTracker.java:65)
05-16 22:02:07.309:W/System.err(12459):位于com.package.utils.GPSTracker.(GPSTracker.java:44)
05-16 22:02:07.309:W/System.err(12459):位于com.webnamaste.ulrasoundindia.MainActivity$SendMailTask.doInBackground(MainActivity.java:255)
05-16 22:02:07.319:W/System.err(12459):位于com.package.ulrasoundindia.MainActivity$SendMailTask.doInBackground(MainActivity.java:1)
05-16 22:02:07.319:W/System.err(12459):位于android.os.AsyncTask$2.call(AsyncTask.java:264)
05-16 22:02:07.319:W/System.err(12459):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-16 22:02:07.319:W/System.err(12459):位于java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-16 22:02:07.319:W/System.err(12459):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-16 22:02:07.339:W/System.err(12459):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-16 22:02:07.339:W/System.err(12459):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-16 22:02:07.349:W/System.err(12459):位于java.lang.Thread.run(Thread.java:856)

AsyncTask
方法
doInBackground
在后台线程上执行,它不是主(UI)线程。这里有3种解决方案:

  • 将获取GPS坐标过程移动到
    onPreExecute
    并将结果传递到
    doInBackground
  • doInBackground
    处调用
    runOnUiThread
    调用
    GPSTracker
    ,这是一个丑陋的解决方案
  • 使用
    Looper.prepare()的组合
    Looper.loop()

  • 看一看

    您正在尝试在gui应用程序中显示一些数据,在doInBackgrund()中,解决方案是 将Looper.prepare()放在doInBackgrund()的第一行


    gps图标是否在运行应用程序时闪烁或已固定???将获取gps坐标过程移动到onPreExecute。它现在会闪烁gps,但位置仍然为0。手机的谷歌地图显示了正确的位置。我得到的网络位置管理器=不为空,网络位置=为空,GPS位置管理器=不为空,GPS位置=为空。在检查GPSTracker.javais中的if时,传递的上下文应该是MainActivity.this或getApplicationContext()或getBaseContext()@user330169
    getApplicationContext()
    更好,以避免内存泄漏,但这不是问题的根源。你确定你的
    GPSTracker
    没有bug吗?该类是从
    androidhive.com
    复制粘贴的。我认为代码中没有bug。这是我正在测试的设备的问题吗。我应该在其他设备上测试还是在emulator中测试。但它在谷歌地图中显示了确切的位置
    protected Boolean doInBackground(String... arg0) {
    // TODO Auto-generated method stub
    Looper.prepare();//This code
    boolean status = false;
    try {
    double latitude=0;
    double longitude=0;
    GPSTracker gps=new GPSTracker(MainActivity.this);
    if(gps.canGetLocation()){
        latitude=gps.getLatitude();
        longitude=gps.getLongitude();
    }
    String mapUrl= "https://www.google.co.in/maps/@"+latitude+","+longitude+",17z";
    GMailSender sender = new GMailSender(
        "myemail@gmail.com", "password",
        getApplicationContext());
    status = sender.sendMail(" Subject ", "\nLocation : "+mapUrl,"myemail@gmail.com",
         "anothermail@gmail.com");
        } catch (Exception e) {
        }
        return status;
    }