2011-08-15 4 views
1

J'écris un programme qui obtient les coordonnées de l'endroit où un téléphone portable utilise le gestionnaire de téléphonie, le problème est, il me donne les coordonnées de la tour cellulaire à laquelle je suis le plus proche mais pas l'endroit exact où Je suis. Voici mon code. Comment utiliser les coordonnées de la tour cellulaire pour me donner mon emplacement exct. les gars ThanxEmplacement du téléphone portable

package com.celllocation; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLConnection; 
import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.telephony.TelephonyManager; 
import android.telephony.gsm.GsmCellLocation; 
import android.widget.TextView; 
import android.widget.Toast; 

public class cellLocation extends Activity { 
    int cellID,lac; 
    TextView textViewCoord; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textViewCoord=(TextView)findViewById(R.id.textViewCoord); 
    } 
    @Override 
    protected void onStart() { 
     TelephonyManager telManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
     GsmCellLocation location=(GsmCellLocation)telManager.getCellLocation(); 
     cellID=location.getCid(); 
     lac=location.getLac(); 
     try 
     { 
      displayMap(cellID, lac); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 

     super.onStart(); 
    } 
    private boolean displayMap(int cellID, int lac) throws Exception 
    { 
     String urlString = "http://www.google.com/glm/mmap";    

     //---open a connection to Google Maps API--- 
     URL url = new URL(urlString); 
     URLConnection conn = url.openConnection(); 
     HttpURLConnection httpConn = (HttpURLConnection) conn;   
     httpConn.setRequestMethod("POST"); 
     httpConn.setDoOutput(true); 
     httpConn.setDoInput(true); 
     httpConn.connect(); 

     //---write some custom data to Google Maps API--- 
     OutputStream outputStream = httpConn.getOutputStream(); 
     WriteData(outputStream, cellID, lac);  

     //---get the response--- 
     InputStream inputStream = httpConn.getInputStream(); 
     DataInputStream dataInputStream = new DataInputStream(inputStream); 

     //---interpret the response obtained--- 
     dataInputStream.readShort(); 
     dataInputStream.readByte(); 
     int code = dataInputStream.readInt(); 
     if (code == 0) { 
      double lat = (double) dataInputStream.readInt()/1000000D; 
      double lng = (double) dataInputStream.readInt()/1000000D; 
      dataInputStream.readInt(); 
      dataInputStream.readInt(); 
      dataInputStream.readUTF(); 

      //---display Google Maps--- 
      String uriString =lat+ "," + lng; 
      Toast.makeText(getApplicationContext(), uriString, Toast.LENGTH_LONG).show(); 
      textViewCoord.setText(uriString); 
      return true; 
     } 
     else 
     {   
      return false; 
     } 
    } 
    private void WriteData(OutputStream out, int cellID, 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(cellID); 
     dataOutputStream.writeInt(lac);  

     dataOutputStream.writeInt(0); 
     dataOutputStream.writeInt(0); 
     dataOutputStream.writeInt(0); 
     dataOutputStream.writeInt(0); 
     dataOutputStream.flush();  
    } 
} 
+2

vous auriez besoin les coordonnées de toutes les tours de téléphonie cellulaire à proximité afin que vous puissiez faire une triangulation de base ... ou ne pas utiliser les données de la tour cellulaire et aller pour les coordonnées GPS. –

+1

Si vous voulez une solution très précise sur l'emplacement d'un téléphone portable, vous feriez mieux d'utiliser le GPS. Si vous devez utiliser des tours de téléphonie cellulaire, je vous suggérerais d'examiner la triangulation. –

+0

Ce n'est pas ce que vous voulez. Utilisez le 'LocationManager' comme décrit par @Marco –

Répondre

1

Pour connaître l'emplacement exact que vous devez utiliser le GPS, pour un endroit moins précis, vous pouvez utiliser NETWORK_PROVIDER (précision variable, en fonction de la densité de nework cellulaire). Je pense que vous pourriez avoir besoin de définir un LocationManager dans le onCreate

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 

ou fournisseur de réseau:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

Cette classe permet d'accéder aux services de localisation du système. Ces services permettent aux applications d'obtenir des mises à jour périodiques de l'emplacement géographique de l'appareil, ou de déclencher une intention spécifiée par l'application lorsque l'appareil entre à proximité d'un emplacement géographique donné.

Marco

+0

Je veux une solution qui fonctionne aussi à l'intérieur, le GPS ne fonctionne qu'à l'extérieur – Nikud

Questions connexes