Почему getBaseStationLatitude () продолжает возвращать Integer.MAX_VALUE (неизвестно)? - PullRequest
1 голос
/ 23 марта 2011

Проект класса и дипломная работа - попытка получить информацию из ячейки CDMA, в частности, используя getBaseStationLatitude () и getBaseStationLongitude (). Возвращаемое значение - MAX_VALUE (2147483647) - я не получаю фактические значения широты / долготы. getBaseStationID (), getNetworkID () и getSystemID () возвращают действительные идентификаторы. Я проверил это в 2 отдельных клетках без удачи. Мой код размещен ниже. И ACCESS_FINE_LOCATION & ACCESS_COURSE_LOCATION добавляются в манифест. Тестирование выполнено на Droid, Android 2.2.2.

Вопросы - Кто-нибудь сталкивался с такими же проблемами? Я что-то упустил в коде? Где хранятся и выдаются эти значения (например, эти координаты назначаются на базовой станции и постоянно передаются на мобильное устройство)?

Код:

package xXx.edu.com;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class CDMAData extends Activity implements OnClickListener{

    CdmaCellLocation location;
    int cellID, lat, lon, netID, sysID;
    private Context context;
    Button getDataBtn;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      context = (Context) this;
      setContentView(R.layout.cid);

      setConnections();
   }

   private void setConnections() {

       getDataBtn = (Button) this.findViewById(R.id.getID);
       getDataBtn.setOnClickListener(this);

   }

   public void onClick(View v) {

       TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
       location = (CdmaCellLocation) tm.getCellLocation();
       cellID = location.getBaseStationId();
       lat = location.getBaseStationLatitude();
       lon = location.getBaseStationLongitude();
       netID = location.getNetworkId();
       sysID = location.getSystemId();

       TextView myView1 = (TextView) findViewById(R.id.bsID);
       myView1.setText("" + cellID);

       TextView myView2 = (TextView) findViewById(R.id.bsLat);
       myView2.setText("" + lat);

       TextView myView3 = (TextView) findViewById(R.id.bsLon);
       myView3.setText("" + lon);

       TextView myView4 = (TextView) findViewById(R.id.netID);
       myView4.setText("" + netID);

       TextView myView5 = (TextView) findViewById(R.id.sysID);
       myView5.setText("" + sysID);

   }
}

Ответы [ 3 ]

1 голос
/ 30 декабря 2011

Попробуйте вызвать метод CellLocation.requestLocationUpdate (), прежде чем получать местоположение из TelephonyManager. Это заставит платформу обновить местоположение ячейки и даст вам действительное значение, если устройство зарегистрировано в сети CDMA:

CellLocation.requestLocationUpdate();
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
location = (CdmaCellLocation) tm.getCellLocation();
cellID = location.getBaseStationId();
....

Документация для этого метода: http://developer.android.com/reference/android/telephony/CellLocation.html#requestLocationUpdate()

1 голос
/ 03 апреля 2011

Вот почему:

Широта - это десятичное число, как указано в 3GPP2 C.S0005-A v6.0. представлена ​​в единицах по 0,25 секунды и колеблется от -1296000 до 1296000, оба значения включительно (соответствуют диапазону от -90 до +90 град). Integer.MAX_VALUE считается недопустимым значением.

Долгота - это десятичное число, как указано в 3GPP2 C.S0005-A v6.0. Это представлена ​​в единицах по 0,25 секунды и колеблется от -2592000 до 2592000, оба значения включительно (соответствуют диапазону от -180 до +180 градусов). Integer.MAX_VALUE считается недопустимым значением.

Скажи:

Широта = L (целое число, возвращаемое Android cdma API)

Широта в градусах = ((L * 90) / 1296000))

Теперь вы можете легко преобразовать его в градусы мин и секунды: Ниже приведен URL для этого (любая из следующих ссылок должна работать): http://zonalandeducation.com/mmts/trigonometryRealms/degMinSec/degMinSec.htm

http://www.fcc.gov/mb/audio/bickel/DDDMMSS-decimal.html

0 голосов
/ 09 сентября 2014

Реальная причина, по которой вы не получаете действительные координаты, заключается в том, что некоторые операторы сотовой связи просто не предоставляют эту информацию или они предоставляют неверную информацию.

Я провел множество личных исследований этого для одного из моих опубликованных приложений. И, чтобы попытаться помочь вам направить вас в правильном направлении: (ниже приведены обобщения из множества разных тестов, чтобы вы могли найти одно устройство, которое отличается) - GSM-провайдеры, такие как T-Mobile, всегда возвращают недействительными. - Sprint имеет тенденцию возвращать хорошие / действительные значения. - Verizon предоставляет информацию о вышке, которая находится на расстоянии многих миль.

ps. На всякий случай, мое приложение LTE Discovery в Google Play. Он покажет вам все различные типы координат, которые можно получить из Android API. (Но я не ссылаюсь на это, потому что это может быть против какой-то рекламы для SO.)

...