2

モバイルが接続されているセルの場所を見つける方法または方法を知りたいです (GSM 1)

これは私のクラスです:

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();
        }
    }

}

私が言えることはありますgsmLocation.getLatitude()gsmLocation.getLongitude()

4

2 に答える 2

2

現在のGSMセルの位置を知るには、セルIDとその場所のデータベースが必要です。あなたがネットワーク事業者でない場合、彼らはそれを公開していないので、この情報のための本当に良い、信頼できる情報源はありません。

デバイスの位置を修正したいだけの場合は、このSOの質問を試してください。

于 2013-03-22T09:43:13.560 に答える
2

@S リストが言ったことを拡張すると、次の API プロバイダーでトークンにサインアップし、精度/コストがどのように機能するかを自分で確認する必要があります.

于 2013-08-16T07:56:59.353 に答える