Android百度地图SDK,为何只有将App放在后台才能定位?

看了郭霖的第一行代码,照着上面的百度地图SDK教程敲了一遍,发现第一次进App的时候是不定位的,只有回到桌面,也就是把App后台运行,再打开App才会进行定位功能,这是什么原因呢?代码确认了好几遍了

public class MainActivity extends AppCompatActivity
{
    public LocationClient mLocationClient;
    private TextView positionText;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        mLocationClient=new LocationClient(getApplicationContext());
        mLocationClient.registerLocationListener(new MyLocationListener());
        setContentView(R.layout.activity_main);
        positionText= (TextView) findViewById(R.id.position_text_view);
        List<String> permissionList=new ArrayList<>();
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED)
        {
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                !=PackageManager.PERMISSION_GRANTED)
        {
            permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE)
                !=PackageManager.PERMISSION_GRANTED)
        {
            permissionList.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (!permissionList.isEmpty())
        {
            String[] permissions=permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(this,permissions,1);
        }
        else
        {
            requestLocation();
        }
    }

    private void requestLocation()
    {
        initLocation();
        mLocationClient.start();
    }

    private void initLocation()
    {
        LocationClientOption option=new LocationClientOption();
        option.setScanSpan(1000);
        mLocationClient.setLocOption(option);
    }

    public class MyLocationListener implements BDLocationListener
    {

        @Override
        public void onReceiveLocation(BDLocation bdLocation)
        {
            //当绑定的LocationClient获取到位置信息的时候就会回调这个方法,BDLocation中存放的就是位置信息
            StringBuilder currentPosition=new StringBuilder();
            currentPosition.append("纬度:").append(bdLocation.getLatitude()).append("\n");
            currentPosition.append("经度:").append(bdLocation.getLongitude()).append("\n");
            currentPosition.append("定位方式:");
            if (bdLocation.getLocType()==BDLocation.TypeGpsLocation)
            {
                currentPosition.append("GPS");
            }
            else if (bdLocation.getLocType()==BDLocation.TypeNetWorkLocation)
            {
                currentPosition.append("网络");
            }
            positionText.setText(currentPosition);
        }

        @Override
        public void onConnectHotSpotMessage(String s, int i)
        {

        }


    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
    {
        switch (requestCode)
        {
            case 1:
            {
                if (grantResults.length>0)
                {
                    for (int results:grantResults)
                    {
                        if (results!=PackageManager.PERMISSION_GRANTED)
                        {
                            Toast.makeText(this,"拒绝权限将无法使用本产品",Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    requestLocation();
                }
                else
                {
                    Toast.makeText(this,"发生未知错误",Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            }
        }
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        mLocationClient.stop();
    }
}
阅读 4.5k
1 个回答

目测是权限判定的问题,第一次运行走权限申请逻辑分支,区别是回调监听是子线程。试试权限管理信任应用或者用主线程调用requestLocation()方法。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题