Как получить Android GPS местоположение, когда внутри дома - PullRequest
2 голосов
/ 29 марта 2012

Мне нужно определить положение человека, когда он находится в доме.

GPS не работает внутри дома, но я слышал, кто-то объясняет, что в Android вы должны сначала проверить, доступен ли GPS. Если нет, то следующим шагом будет локализация человека на основе ближайших беспроводных сетей.

Я новичок в этом, и я планирую разработать простое приложение из титана. Мой вопрос: Можете ли вы локализовать кого-либо на основе беспроводной сети, когда gps недоступен? Могу ли я узнать местонахождение людей внутри зданий?

Ответы [ 4 ]

0 голосов
/ 21 ноября 2013

Вы можете вызвать ниже функцию cellID, где бы вы ни хотели получить местоположение cellID. Это не будет так точно, как GPS

 public void cellID()
{
    TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);


    GsmCellLocation cellLocation = (GsmCellLocation)    telephonyManager.getCellLocation();     
      int cid = cellLocation.getCid();
      int lac = cellLocation.getLac();
      SimpleDateFormat sdfDateTime = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
        datetimeCellID = sdfDateTime.format(new Date());
      String cell_Id=String.valueOf(cid);
      String gsm_Loc_Area_Code=String.valueOf(lac);
    //  Toast.makeText(getBaseContext(),"cellid="+cell_Id+"\nGsm Location Area Code:"+gsm_Loc_Area_Code,Toast.LENGTH_LONG ).show();

      if(RqsLocation(cid, lac))
      {
          TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            imeiCellID = tm.getDeviceId();
          latitude_cellID=String.valueOf((float)myLatitude/1000000);
          longitude_cellID=String.valueOf((float)myLongitude/1000000);
        // Toast.makeText(getBaseContext(),"Lat:"+latitude_cellID+"Long:"+longitude_cellID,Toast.LENGTH_LONG ).show();


      }//if
      else
      {
          Toast.makeText(getBaseContext(),"CellID : Can't find Location",Toast.LENGTH_LONG ).show();
      }//else 
     }

} // CellID

  private Boolean RqsLocation(int cid, int lac)
  {
      //Toast.makeText(getBaseContext(),"inReqloc",Toast.LENGTH_LONG ).show();
   Boolean result = false; 
   String urlmmap = "http://www.google.com/glm/mmap";

      try {
           URL url = new URL(urlmmap);
          URLConnection conn = url.openConnection();
          HttpURLConnection httpConn = (HttpURLConnection) conn;      
          httpConn.setRequestMethod("POST");
          httpConn.setDoOutput(true);
          httpConn.setDoInput(true);
          httpConn.connect();  
          OutputStream outputStream = httpConn.getOutputStream();
          WriteData(outputStream, cid, lac);       
          InputStream inputStream = httpConn.getInputStream();
          DataInputStream dataInputStream = new DataInputStream(inputStream);
          dataInputStream.readShort();
          dataInputStream.readByte();
          int code = dataInputStream.readInt();
          if (code == 0)
          {
           myLatitude = dataInputStream.readInt();
           myLongitude = dataInputStream.readInt();
           result = true;

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

    return result;

  }

  private void WriteData(OutputStream out, int cid, int lac)
  throws IOException
  {    
      DataOutputStream dataOutputStream = new DataOutputStream(out);
      dataOutputStream.writeShort(21);
      dataOutputStream.writeLong(0);
      dataOutputStream.writeUTF("en");
      dataOutputStream.writeUTF("Android");
      dataOutputStream.writeUTF("1.0");
      dataOutputStream.writeUTF("Web");
      dataOutputStream.writeByte(27);
      dataOutputStream.writeInt(0);
      dataOutputStream.writeInt(0);
      dataOutputStream.writeInt(3);
      dataOutputStream.writeUTF(""); 
      dataOutputStream.writeInt(cid);
      dataOutputStream.writeInt(lac);    
      dataOutputStream.writeInt(0);
      dataOutputStream.writeInt(0);
      dataOutputStream.writeInt(0);
      dataOutputStream.writeInt(0);
      dataOutputStream.flush();    
  }  
0 голосов
/ 29 марта 2012

Кажется, это хорошее начало, надеюсь, этот код может помочь:

try {
            gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }
        try {
            network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
        }

        // don't start listeners if no provider is enabled
        if (!gps_enabled && !network_enabled) {
            AlertDialog.Builder builder = new Builder(this);
            builder.setTitle("Attention!");
            builder.setMessage("Sorry, location is not determined. Please enable location providers");
            builder.create().show();
        }

        if (gps_enabled) {
            locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
        }
        if (network_enabled) {
            locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
        }

Отсюда: http://www.hrupin.com/2011/04/android-gps-using-how-to-get-current-location-example

0 голосов
/ 29 марта 2012

Один из вариантов - Skyhook. Вот ссылка на их SDK. Это совместимо с Android. Это будет не так точно, как GPS, но в большинстве случаев вы попадете в правильное здание.

http://www.skyhookwireless.com/location-technology/sdk.php

0 голосов
/ 29 марта 2012

Вы спрашиваете у поставщика местоположения лучшего поставщика, если GPS недоступен, вы получите местоположение из cellID (мобильная мачта) или беспроводной сети, см. this и связанный с ним стекопоток вопрос

...