Работа над проектом класса и тезисы - попытка извлечь информацию из ячейки 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);
}
}
Попробуйте вызвать метод 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()
Вот почему:
Широта - это десятичное число, указанное в 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
Настоящая причина, по которой вы не получаете действительные координаты, заключается в том, что некоторые поставщики сотовой связи просто не предоставляют эту информацию или они предоставляют неверную информацию.
Я провел много исследований в этом для одного из моих опубликованных приложений. И, чтобы попытаться помочь вам указать в правильном направлении: (следующие являются обобщениями из многих разных тестов, поэтому вы можете найти одно устройство, которое отличается) - Поставщики сотовых телефонов, такие как T-Mobile, всегда будут возвращать недействительные. - Sprint имеет тенденцию возвращать хорошие/действительные значения. - Verizon предоставляет информацию о башне, которая имеет тенденцию находиться в нескольких милях от.
ps - На всякий случай, когда вас это интересует, мое приложение является LTE Discovery в Google Play. Он покажет вам всевозможные типы координат, которые можно получить из Android API. (Но я не связываюсь с ним, потому что это может быть против какой-то рекламы для SO.)