1

课程项目和论文工作 - 尝试从 CDMA Cell 中提取信息,特别是使用 getBaseStationLatitude() 和 getBaseStationLongitude()。返回的值是 MAX_VALUE (2147483647) - 我没有收到实际的纬度/经度。getBaseStationID()、getNetworkID() 和 getSystemID() 正在返回有效的 id。我已经在 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);

   }
}
4

3 回答 3

1

原因如下:

纬度是 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 被视为无效值。

说:

Latitude = 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

于 2011-04-03T00:48:55.923 回答
1

在从 TelephonyManager 获取位置之前尝试调用“CellLocation.requestLocationUpdate()”方法。这将强制平台更新小区位置,如果设备已注册到 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 ()

于 2011-12-30T19:13:18.383 回答
0

您没有收到有效坐标的真正原因是某些小区提供商只是不提供该信息,或者他们提供了错误的信息。

我已经为我发布的一个应用程序进行了大量的个人研究。并且,为了帮助您指出正确的方向:(以下是许多不同测试的概括,因此您可能能够找到不同的设备) - 像 T-Mobile 这样的 GSM 蜂窝提供商将始终返回无效。- Sprint 倾向于返回良好/有效的值。- Verizon 提供的信号塔信息往往在数英里之外。

ps - 如果您有兴趣,我的应用是 LTE Discovery,在 Google Play 中。它将向您展示所有可能从 Android API 检索到的不同类型的坐标。(但是,我没有链接到它,因为它可能与 SO 的某些广告相冲突。)

于 2014-09-09T02:01:26.020 回答