在不插入Sim卡的情况下获取纬度和经度,并从应用程序启动/停止GPS

5

我正在尝试获取GPS纬度和经度,但是我有一个问题,即当我尝试在没有SIM卡的情况下获取纬度和经度时,它不会提供任何信息。然而,一旦我插入sim卡,它会按照预期的方式提供所有信息。

LocationManager mlocManager = 
    (LocationManager) getSystemService(Context.LOCATION_SERVICE);

LocationListener mlocListener = new MyLocationListener();

mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                                   0, 0, mlocListener);

虽然我正在使用GPS_PROVIDER,但没有网络运营商的帮助,它无法为我提供纬度和经度信息,有人可以告诉我吗?


另一件事是如何从应用程序中启动和停止GPS,我的意思是在特定时间后启动GPS,然后在获得最佳位置后立即关闭它。


你是否在“位置和安全”系统偏好设置中启用了“使用GPS卫星”选项? - Reuben Scratton
嗨,Reuben,当然我已经启用了它,但我面临的问题是尽管我正在尝试通过GPS_PROVIDER获取,但它需要网络运营商的帮助,这很奇怪。 - Ankit
4个回答

10

在Android上获取GPS位置不需要访问任何网络。但是,互联网连接可以将位置修复速度从约5分钟加快到5秒钟(大约!)。这种改进是由辅助 GPS (A-GPS)实现的,与独立 GPS 相反。

GPS手机(包括Android设备)会检查是否有可用的网络连接。如果是,则它们从 A-GPS 服务器下载辅助数据,并将其与 GPS 芯片一起使用来计算位置修复。如果没有,则 GPS 芯片必须从 GPS 卫星下载数据,这需要很长时间(速率为每秒 50 比特!)。如果最近已计算出 GPS 位置,则该过程也可以加速。

因此,首先:

  • 检查您是否已向清单的权限中添加了 ACCESS_FINE_LOCATION
  • 检查手机设置中是否启用了 GPS 卫星
  • 检查您是否不在室内(来自高达 20,000 公里以上卫星的信号不喜欢屋顶和墙壁)

然后启动您的应用程序并等待,可能需要几分钟才能获得第一个修复。

至于如何从您的应用程序启动 GPS,似乎是可能的(请参见如何在Android上以编程方式启用或禁用 GPS?),但我不知道如何!至少,您可以下载Tasker并编程以启动/停止GPS。


谢谢Stephen。实际上,我的手机在办公室里没有信号,而且我对Android非常陌生,所以无法解决这个问题。每当我将SIM卡插入设备时,它会获取LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDER两者的位置提供程序。 - Ankit

0

这可能已经过时了,但你有任何想法这个错误是什么吗?

我得到的错误是“获取单元格位置信息错误”。

我找到了导致这个错误的源代码。

private void requestRefLocation(int flags)
{
    TelephonyManager phone = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
    if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM)
    {
        GsmCellLocation gsm_cell = (GsmCellLocation) phone.getCellLocation();
        if ((gsm_cell != null)
                && (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM)
                && (phone.getNetworkOperator() != null)
                && (phone.getNetworkOperator().length() > 3))
        {
            int type;
            int mcc = Integer.parseInt(phone.getNetworkOperator().substring(0, 3));
            int mnc = Integer.parseInt(phone.getNetworkOperator().substring(3));
            int networkType = phone.getNetworkType();
            if (networkType == TelephonyManager.NETWORK_TYPE_UMTS
                    || networkType == TelephonyManager.NETWORK_TYPE_HSDPA
                    || networkType == TelephonyManager.NETWORK_TYPE_HSUPA
                    || networkType == TelephonyManager.NETWORK_TYPE_HSPA)
            {
                type = AGPS_REF_LOCATION_TYPE_UMTS_CELLID;
            }
            else
            {
                type = AGPS_REF_LOCATION_TYPE_GSM_CELLID;
            }
            native_agps_set_ref_location_cellid(type, mcc, mnc, gsm_cell.getLac(), gsm_cell.getCid());
        }
        else
        {
            Log.e(TAG, "Error getting cell location info.");
        }
    } else {
        Log.e(TAG, "CDMA not supported.");
    }
}

注意检查语句

if ((gsm_cell != null)
            && (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM)
            && (phone.getNetworkOperator() != null)
            && (phone.getNetworkOperator().length() > 3))
    {

这与您面临的问题有些关联。当然,通过连接到WIFI网络,您仍然可以获取您的位置,因为它使用了不同的方式来获取位置信息。希望这回答了您的问题。


0
这是我的主活动,其中包含一个按钮,并在其上设置了onClickListner以将我的GPS从OFF状态切换到ON状态,无需任何权限即可执行此操作。
已在Android 2.2上进行测试,对我来说运行良好。
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class GPSONOFFActivity extends Activity {
/** Called when the activity is first created. */
Button b;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    b=(Button)findViewById(R.id.button1);

    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            toggleGPS(true);                
        }
    });
}

private void toggleGPS(boolean enable) {
    String provider = Settings.Secure.getString(getContentResolver(), 
        Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(provider.contains("gps") == enable) {
        return; // the GPS is already in the requested state
    }

    final Intent poke = new Intent();
    poke.setClassName("com.android.settings", 
        "com.android.settings.widget.SettingsAppWidgetProvider");
    poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
    poke.setData(Uri.parse("3"));
    this.sendBroadcast(poke);
 }
}

我尝试了,但在我的设备上(操作系统为4.0.3),它没有起作用。在清单中是否需要提及任何权限?因为它没有显示任何错误,所以我猜什么都没发生。 - Ankit

0

我认为你遇到的一个问题可能是Android中没有内置任何“地图”。地图是根据手机需要从Google的服务器上动态加载的。例如,当你只需要一个邻里地图时,为什么要加载整个国家的地图呢?这就是它背后的理论。它获取你的位置,将其发送到Google的服务器,然后返回它认为你需要的地图。当然,如果你将所有地图(我听说可能是可以的,但我不确定)下载到设备上,那么这可能不是这种情况...

编辑: 谷歌不允许下载他们的地图。(感谢Austyn提供的信息)。


谷歌不允许完全缓存他们的地图瓦片。要做到这一点,您需要下载一款替代地图应用程序(http://wiki.openstreetmap.org/wiki/Android),该应用程序允许本地存储地图瓦片。 - Austyn Mahoney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接