Getting Tower GSM location lat lng

a 夏天 提交于 2019-11-29 23:26:37

问题


I would like to know a method or a way to find the location of the cell the mobile is connected to (GSM one)

This is my class:

package com.example.signal;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.telephony.CellLocation;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.text.format.Time;
import android.util.Log;
import android.view.Menu;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    int counter = 0;
    MainActivity mainn = this;
    String SignalType = "";
    List<TextView> ListText = new LinkedList<TextView>();
     TelephonyManager        Tel;
       MyPhoneStateListener    MyListener;
       int dBm;
       int ASU;
       Context context;
       LinearLayout Linear;
       ScrollView scroll;
       File myFile;
       FileOutputStream fOut;
       OutputStreamWriter myOutWriter;
       /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
           // setContentView(R.layout.activity_main);
            myFile = new File("/sdcard/mysdfile.txt");
            while (myFile.exists())
            {
                counter++;
                myFile = new File("/sdcard/mysdfile" + counter+".txt");
            }
            try {
                myFile.createNewFile();
                 fOut = new FileOutputStream(myFile);
                    myOutWriter = new OutputStreamWriter(fOut);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Linear = new LinearLayout(this);
            Linear.setOrientation(LinearLayout.VERTICAL);
            scroll = new ScrollView(this);
            scroll.addView(Linear);
            this.setContentView(scroll);
            Tel       = ( TelephonyManager )getSystemService(Context.TELEPHONY_SERVICE);  
            if (Tel.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
                 Toast.makeText(getApplicationContext(), "NO GSM", Toast.LENGTH_SHORT).show();
                return;
            } else if  (Tel.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {

            }
            Tel.listen(MyListener ,PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
            MyListener   = new MyPhoneStateListener();

        }

        /* Called when the application is minimized */
        @Override
       protected void onPause()
        {
          super.onPause();
          Tel.listen(MyListener, PhoneStateListener.LISTEN_NONE);
       }

        /* Called when the application resumes */
       @Override
       protected void onResume()
       {
          super.onResume();
          Tel.listen(MyListener,PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
       }

       /* —————————– */
        /* Start the PhoneState listener */
       /* —————————– */
        private class MyPhoneStateListener extends PhoneStateListener
        {
          /* Get the Signal strength from the provider, each tiome there is an update */
          @Override
          public void onSignalStrengthsChanged(SignalStrength signalStrength)
          {

             super.onSignalStrengthsChanged(signalStrength);
             //Toast.makeText(getApplicationContext(), "Go to Firstdroid!!! GSM Cinr = "
               // + String.valueOf(signalStrength.getGsmSignalStrength()), Toast.LENGTH_SHORT).show();
            ASU =  signalStrength.getGsmSignalStrength();
            if (ASU > 30) {
                SignalType = "Good";
                // signalStrengthText.setTextColor(getResources().getColor(R.color.good));
            } else if (ASU > 20 && ASU < 30) {
                SignalType = "Average";
                // signalStrengthText.setTextColor(getResources().getColor(R.color.average));
            } else if (ASU < 20) {
                SignalType = "Weak";
                // signalStrengthText.setTextColor(getResources().getColor(R.color.weak));
            } 
            dBm= -113+(2*ASU);
             TelephonyManager m = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
             if (m.getSimState() != TelephonyManager.SIM_STATE_ABSENT){
               // SIM card
             } else {
               // No SIM card
             }
             TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
             CellLocation location = telephonyManager.getCellLocation();
             GsmCellLocation gsmLocation = (GsmCellLocation) location;
             String networkOperator = telephonyManager.getNetworkOperator();

             if (networkOperator != null) {
                 int mcc = Integer.parseInt(networkOperator.substring(0, 3));
                 int mnc = Integer.parseInt(networkOperator.substring(3));
                 Log.d("mcc " + mcc, "mnc " + mnc);
             }
             //CdmaCellLocation gsmLocation1 = (CdmaCellLocation) location;
             int cellId = gsmLocation.getCid();
             int lac = gsmLocation.getLac();
            // Log.d("al latitude ", gsmLocation1.getBaseStationLatitude()+"");
             //Time today = new Time(Time.getCurrentTimezone());
             //today.setToNow();
             String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
             TextView tvv = new TextView(mainn);
             tvv.setText("GSM dBm " + String.valueOf(dBm) + " , Cell ID " + String.valueOf(cellId) + " , Cell LAC " + String.valueOf(lac)+ " , ASU " + ASU + " , Time now " + mydate + " , Signal Type " + SignalType);
           //  Toast.makeText(getApplicationContext(), "Go to Firstdroid!!! GSM dBm = "
             //       + String.valueOf(dBm) + " , Cell ID = " + String.valueOf(cellId) +" , Cell Lac = " + String.valueOf(lac), Toast.LENGTH_SHORT).show();
            /* LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

          // Define a listener that responds to location updates
          LocationListener locationListener = new LocationListener() {
              public void onLocationChanged(Location location) {
                // Called when a new location is found by the network location provider.
               // makeUseOfNewLocation(location);
              }

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

              public void onProviderEnabled(String provider) {}

              public void onProviderDisabled(String provider) {}
            };

          // Register the listener with the Location Manager to receive location updates
          locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
          String locationProvider = LocationManager.NETWORK_PROVIDER;
       // Or use LocationManager.GPS_PROVIDER

          Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
        double lat =  lastKnownLocation.getLatitude();
        double longg =   lastKnownLocation.getLongitude();
        Log.d("Lat is " + lat, "Long is " + longg);
        int psc = gsmLocation.getPsc();
        Log.d("TAG", "PSC = " + psc); */

        List<NeighboringCellInfo> neighCell = null; 
        neighCell = telephonyManager.getNeighboringCellInfo();  
        for (int i = 0; i < neighCell.size(); i++) 
        {
            NeighboringCellInfo thisCell = neighCell.get(i);  
            int CID = thisCell.getCid();  
            int RSSI = thisCell.getRssi();
            int PSC = thisCell.getPsc();
            Log.d("TAG", " "+CID+" - "+RSSI + " - " + PSC);
        }
        try
            {

                    myOutWriter.append(tvv.getText());
                    myOutWriter.append("\n");
            } 
            catch (Exception e)
            {
                e.printStackTrace();
            }
             Linear.addView(tvv);
             Linear.invalidate();
             scroll.invalidate();
          }

        };/* End of private Class */

    /* GetGsmSignalStrength */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public void onBackPressed()
    {
        try
        {
            myOutWriter.close();
            fOut.close();
            this.finish();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

Is there something which I can say gsmLocation.getLatitude() or gsmLocation.getLongitude()?


回答1:


To know the position of the current GSM cell, you need a database of cell Ids and their location. If you aren't a network operator, there is no really good, authoritative source for this information, because they don't publish it.

If you just want a position fix for the device, try this SO question.




回答2:


Extending on what @S List said, you should sign-up for a token with the following API providers & see for yourself how the accuracy/costs work out.

  • LocationAPI.org


来源:https://stackoverflow.com/questions/15560870/getting-tower-gsm-location-lat-lng

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!