Android GPS位置始终将位置显示为零
我在点击按钮时通过电子邮件发送用户的位置。AsyncTask的doInBackground如下所示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
@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()@user330169getApplicationContext()
更好,以避免内存泄漏,但这不是问题的根源。你确定你的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;
}