【问题标题】:GPS did not getting location updatesGPS 没有获取位置更新
【发布时间】:2014-02-07 07:32:26
【问题描述】:

我正在开发一个应用程序,在该应用程序中,按下屏幕上的按钮后,我正在将纬度和经度上传到服务器,异步任务正在启动并执行操作并将纬度和经度上传到服务器端口。 现在的问题是gps找不到纬度和经度。它在服务器端口上抛出 null 。请帮助我,我的代码如下所示...... 提前致谢

class Server extends AsyncTask<String, Integer, String> implements LocationListener{
@Override
protected String doInBackground(String... arg0) {

Looper.myLooper();
Looper.prepare();
for(int i=0;i<9898;i++){
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,this);
sendstring=phonenumber+latitude+longitude+"12345467788";
System.out.println(sendstring+"4532748");
stopUsingGPS();
try {
StrictMode.ThreadPolicy policy = new   StrictMode.ThreadPolicy.Builder().permitNetwork().build();
 StrictMode.setThreadPolicy(policy);
 Socket socket = null;
 try {
 int REDIRECTED_SERVERPORT=31997;
 InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
 socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
                     } catch (UnknownHostException e1) {
                        e1.printStackTrace();
                     } catch (IOException e1) {
                        e1.printStackTrace();
                     }                               
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);

out.println(sendstring); 
                     /*latitude=0.0;
                     longitude=0.0;*/
            }

                 catch (UnknownHostException e1) {
                    e1.printStackTrace();
                 } catch (IOException e1) {
                    e1.printStackTrace();
                 }




              catch (Exception e) {


              }
        }   
            return call1;
        }

        @Override
public void onLocationChanged(Location location) {


             latitude=location.getLatitude();
             longitude=location.getLongitude();
        }
@Override
public void onProviderDisabled(String provider) {


        }
@Override
public void onProviderEnabled(String provider) {
    }
@Override
public void onStatusChanged(String provider, int status,
                Bundle extras) {
}

public void stopUsingGPS(){
            if(locationManager != null){
                locationManager.removeUpdates(this);
            }       
        }   

【问题讨论】:

  • @Mayank Saini 如何在不使用网络提供商的情况下使用?
  • 我已经在没有网络提供商的情况下发布了答案。只是它使用 GPS,如果 GPS 不可用,它使用网络提供商。我已经在下面发布的答案中删除了网络提供商。

标签: android gps


【解决方案1】:

最好的方法是使用 CWAC 的位置服务 位置轮询服务已经为我们提供了使用它,只是您必须给出唤醒它的时间间隔

这样做你需要 jar 文件,你可以从 [这里]https://github.com/commonsguy/cwac-locpoll 获取它。

从您的活动开始 LocationPoller 并将闹钟重复设置为您想要的时间

AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, LocationPoller.class);

Bundle bundle = new Bundle();
LocationPollerParameter parameter = new LocationPollerParameter(bundle);
parameter.setIntentToBroadcastOnCompletion(new Intent(this,
        LocationReceiver.class));
// try GPS and fall back to NETWORK_PROVIDER
parameter.setProviders(new String[] { LocationManager.GPS_PROVIDER });
parameter.setTimeout(120000);
i.putExtras(bundle);

PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime(), 300000, pi);

创建一个接收器类位置接收器,您将从那里获取 lat n lon

public class LocationReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {


    try {      
      Bundle b=intent.getExtras();

      LocationPollerResult locationResult = new LocationPollerResult(b);

      Location loc=locationResult.getLocation();
      String msg;

      if (loc==null) {
        loc=locationResult.getLastKnownLocation();

        if (loc==null) {
          msg=locationResult.getError();
        }
        else {
          msg="TIMEOUT, lastKnown="+loc.toString();
        }
      }
      else {
        msg=loc.toString();



        Log.i("Location Latitude", String.valueOf(loc.getLatitude()));
        Log.i("Location Longitude", String.valueOf(loc.getLongitude()));
        Log.i("Location Accuracy", String.valueOf(loc.getAccuracy()));




      }

      Log.i(getClass().getSimpleName(), "received location: " + msg);   



    }
    catch (Exception e) {
      Log.e(getClass().getName(), e.getMessage());
    }
  }

并将其添加到您的清单中

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

   <receiver android:name="com.commonsware.cwac.locpoll.LocationPoller" />

   <service android:name="com.commonsware.cwac.locpoll.LocationPollerService" />

以及您将获取所有内容的接收者声明

<receiver android:name="com.RareMediaCompany.Helios.LocationReceiver" />

【讨论】:

  • LocationPollerParameter,LocationPollerResult 显示错误
  • 对不起,这是一个过时的库使用这个库 [dropbox.com/sh/pgxk2v9l5vl0h2j/3svyZnuwOK/…
  • E/LocationPoller(4626): Invalid Intent -- 没有提供者显示此错误
  • 这不会返回 lat long logcat 显示在 02-07 15:22:30.452: D/dalvikvm(8118): threadid=13: interp stack at 0x5e643000 02-07 15:22: 50.435:D/dalvikvm(8118):创建 interp 线程:堆栈大小 = 32KB 02-07 15:22:50.438:D/dalvikvm(8118):创建新线程 02-07 15:22:50.438:D/dalvikvm(8118 ): 新线程创建 02-07 15:22:50.439: D/dalvikvm(8118): 更新线程列表 02-07 15:22:50.444: D/dalvikvm(8118): threadid=14: interp stack at 0x5e64b000 02- 07 15:22:50.446: D/dalvikvm(8118): threadid=14: 从 interp 创建 02-07 15:22:50.446: D/dalvikvm(8118): 启动新线程
  • 你能告诉我得到纬度和经度需要多少时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多