Почему getBaseStationLatitude () продолжает возвращать Integer.MAX_VALUE (неизвестно)?

1

Работа над проектом класса и тезисы - попытка извлечь информацию из ячейки CDMA, в частности, используя getBaseStationLatitude() и getBaseStationLongitude(). Возвращаемое значение - MAX_VALUE (2147483647). Я не получаю фактические lat/longs. getBaseStationID(), getNetworkID() и getSystemID() возвращают действительные идентификаторы. Я тестировал это в двух отдельных ячейках без везения. Мой код размещен ниже. В манифест добавляются как 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);

   }
}
  • 0
    Исправлена блокировка кода, используйте теги кода в будущем
  • 0
    Сделаем, спасибо за редактирование.
Теги:
cell
location
cdma

3 ответа

1

Попробуйте вызвать метод 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

Вот почему:

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

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

Скажи:

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

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

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

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

  • 0
    Спасибо Маной за ответ. Возможно, я неправильно понимаю ваш ответ, но проблема, с которой я сталкиваюсь, заключается в том, что при выполнении приведенного выше кода возвращаемое мне значение соответствует значению Integer.MAX_VALUE ---> 2.1474836E9. Это большое количество - то, что API возвращают мне. Я не получаю значения от -1296000 до 1296000 или от -2592000 до 2592000 для широты и долготы соответственно. Я еще не ищу математику конверсии (которая, кажется, является тем, что вы опубликовали), но, вероятно, она пригодится, если я получу эту работу!
  • 0
    Привет, Маной, не могли бы вы указать мне источник математики, который вы предоставили?
Показать ещё 2 комментария
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню