为什么getBaseStationLatitude()会一直返回Integer.MAX_VALUE(未知)?

时间:2011-03-23 18:11:26

标签: android location cell cdma

班级项目&论文工作 - 尝试从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);

   }
}

3 个答案:

答案 0 :(得分: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被视为无效值。

说:

纬度= L(Android cdma API返回的整数)

纬度度=((L * 90)/ 1296000))

现在您可以轻松将其转换为min和seconds: 以下是执行此操作的URL(以下任何链接都应该起作用): http://zonalandeducation.com/mmts/trigonometryRealms/degMinSec/degMinSec.htm

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

答案 1 :(得分: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()

答案 2 :(得分:0)

您没有收到有效坐标的真正原因是因为某些细胞提供者不提供该信息,或者他们提供的信息不正确。

我已经针对我发布的一个应用程序进行了大量的个人研究。并且,尝试帮助您指明正确的方向:(以下是来自许多不同测试的概括,因此您可能能够找到一个不同的设备)   - 像T-Mobile这样的GSM小区提供商将始终无效。   - Sprint倾向于返回良好/有效值。   - Verizon提供的塔楼信息往往距离很远。

ps - 如果您有兴趣,我的应用程序是Google Play中的LTE Discovery。它将显示从Android API检索的所有不同类型的坐标。 (但是,我没有链接到它,因为它可能违反某些广告的内容。)