2015-12-24 3 views
0

Я пытался разработать приложение для Android, которое получило бы текущее местоположение и отправило его на сервер. Когда я тестировал его с помощью симулятора, он всегда показывал лат и долго, как «0», и при тестировании на телефоне я получаю окно предупреждения настроек, чтобы включить GPS ON всегда, даже если оно «включено». Ниже приведен код, который я попробовал ..Android - Отправка местоположения из приложения на сервер

public class Sample extends Activity { 

    GPSTracker gps; 
    EditText editTextAddress, editTextPort; 
    Button buttonConnect; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sample); 
     editTextAddress = (EditText)findViewById(R.id.address); 
     editTextPort = (EditText)findViewById(R.id.port); 
     buttonConnect = (Button)findViewById(R.id.connect); 

     buttonConnect.setOnClickListener(new View.OnClickListener() { 

      double latitude; 
      double longitude; 

      @Override 
      public void onClick(View v) { 
       gps = new GPSTracker(Sample.this); 

       if(gps.canGetLocation()) { 
        latitude = gps.getLatitude(); 
        longitude = gps.getLongitude(); 

        Toast.makeText(
          getApplicationContext(), 
          "Your Location is -\nLatitude: " + latitude + "\nLongitude: " 
            + longitude + "\nLocation Sent", Toast.LENGTH_LONG).show(); 
       } else { 
        gps.showSettingsAlert(); 
       } 

       MyClientTask myClientTask = new MyClientTask(
         editTextAddress.getText().toString(), 
         Integer.parseInt(editTextPort.getText().toString()),latitude, longitude); 
       myClientTask.execute(); 
      } 
     }); 
    } 
public class MyClientTask extends AsyncTask<Void, Void, Void> { 

     String dstAddress; 
     int dstPort; 
     double latitude; 
     double longitude; 

     MyClientTask(String addr, int port, double lat, double lon){ 
      dstAddress = addr; 
      dstPort = port; 
      latitude = lat; 
      longitude = lon; 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 

      Socket socket = null; 

      String lat1 = String.valueOf(latitude); 
      String lon1 = String.valueOf(longitude); 
      String msg = lat1 + lon1; 

      try { 
       socket = new Socket(dstAddress, dstPort); 

       OutputStream outputStream; 

        outputStream = socket.getOutputStream(); 
       PrintStream printStream = new PrintStream(outputStream); 
       printStream.print(msg); 

       printStream.close(); 

      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 

      }finally{ 
       if(socket != null){ 
        try { 
         socket.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
      return null; 
     } 


    } 

} 

И мой GPS трекер код, как показано ниже

public class GPSTracker extends Service implements LocationListener{ 

    private final Context context; 

    boolean isGPSEnabled = false; 
    boolean isNetworkEnabled = false; 
    boolean canGetLocation = false; 

    Location location; 

    double latitude; 
    double longitude; 

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 5; 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 35 * 1; 

    protected LocationManager locationManager; 

    public GPSTracker(Context context) { 
     this.context = context; 
     getLocation(); 
    } 

    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); 

      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if(!isGPSEnabled && !isNetworkEnabled) { 

      } else { 
       this.canGetLocation = true; 

       if (isNetworkEnabled) { 

        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

        if (locationManager != null) { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

         if (location != null) { 

          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 

       } 

       if(isGPSEnabled) { 
        if(location == null) { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

         if(locationManager != null) { 
          location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

          if(location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return location; 
    } 


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

    public double getLatitude() { 
     if(location != null) { 
      latitude = location.getLatitude(); 
     } 
     return latitude; 
    } 

    public double getLongitude() { 
     if(location != null) { 
      longitude = location.getLongitude(); 
     } 

     return longitude; 
    } 

    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 

    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(context); 

     alertDialog.setTitle("GPS is settings"); 

     alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

     alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       context.startActivity(intent); 
      } 
     }); 

     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     alertDialog.show(); 
    } 

    @Override 
    public void onLocationChanged(Location arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderDisabled(String arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

Пожалуйста, кто-то мне помочь в определении problem.thanks заранее.

ответ

0

Проблема не в вашем коде (ну, по крайней мере, не «пока») проблема в том, что эмулятор работает в соответствии с проектом.

Причина этого в том, что по умолчанию для эмулятора по умолчанию используется значение «Lat/Lon». Вам нужно будет самостоятельно отрегулировать лат/lon вручную. для тестирования.

от: https://stackoverflow.com/a/2279827

Для этого ...

из командной строки telnet localhost 5554

затем geo fix <longitude value> <latitude value>

Если у вас есть несколько виртуальных машин, работающих, они могут иметь разные порты, и они будут перечислены в названии эмулятора (так, чтобы началось 5554, то, скорее всего, 5555, 5556 и т. д.)

+0

Я вручную дал lat и длинные значения из DDMS. И тестирование на реальном телефоне всегда дает мне настройки. – Learner

+0

Проблема с «высоким уровнем» в том, что у вас нет ни одного оператора logcat в любом месте этих файлов. У вас всегда должны быть «Log.V» («ClassName», «methodName() Called.»); 'В каждом методе , таким образом вы можете сказать, что происходит для отладки. А затем «Log.d()», где у вас проблемы. Потому что, как есть, вы просто видите результат и не знаете, что происходит до этого. – mawalker

+0

Хорошо, попробуем. Поскольку я начинаю изучать android, я не знаю о журналах и способах отладки. – Learner

0

Вы уверены, что this.canGetLocation = true; в вызове функции getLocation, прежде чем вы проверите if(gps.canGetLocation()) { в действии onClick. Не могли бы вы сделать точку останова и отладить на this.canGetLocation = true;, чтобы увидеть, что называется первым и что вызвано после этого.

+0

Я добавил точку останова в строке this.canGetLocation = true; но как просмотреть журнал. Я не знаю отладки. Я попытался нажать F5/F6, но где я должен посмотреть, что называется первым ... Пожалуйста, руководство. – Learner

Смежные вопросы