看了郭霖的第一行代码,照着上面的百度地图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();
}
}
目测是权限判定的问题,第一次运行走权限申请逻辑分支,区别是回调监听是子线程。试试权限管理信任应用或者用主线程调用requestLocation()方法。