Android OnLocationChanged问题

Android OnLocationChanged问题,android,listener,on-location-changed,Android,Listener,On Location Changed,我正在开发一个应用程序,可以找到用户的位置,并定位在接入点和信号区附近 当我通过按钮手动请求位置更新时,它不会调用回调函数 这是我的活动: public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback, LocationListener{ //LOG tag private static

我正在开发一个应用程序,可以找到用户的位置,并定位在接入点和信号区附近

当我通过按钮手动请求位置更新时,它不会调用回调函数

这是我的活动:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback, LocationListener{

//LOG tag
private static final String LOG = MainActivity.class.getSimpleName();
private static final String DEBUG = "Debugging MainActivity:";
private static final String TEST = "Test";
private static final float ZOOM_LEVEL = 15.5f;
//The map
private GoogleMap mGmap;
private LocationManager mLocationManager;
private Location mLocation;
private WifiManager mWifiManager;
private BroadcastReceiver mBroadcastReceiver;
private List<ScanResult> mResultList;
private String mProvider;
private Criteria mCriteria;
//Controller
private AccessPointController mController;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Toolbar
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    mController = new AccessPointController();

    startReceivingLocationUpdates();
    mCriteria = new Criteria();
    mCriteria.setAccuracy(Criteria.ACCURACY_COARSE);
    mCriteria.setPowerRequirement(Criteria.POWER_MEDIUM);
    mProvider = mLocationManager.getBestProvider(mCriteria, false);
    Log.i(DEBUG, mProvider);
    mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context c, Intent intent) {
            if(intent.getAction() == WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) {
                mResultList = mWifiManager.getScanResults();
                mController.setApList(mResultList);
            }
        }
    };

    mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    registerReceiver(mBroadcastReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    mWifiManager.startScan();

    //Map handling
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

private void startReceivingLocationUpdates() {
    if(mLocationManager == null) {
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    }
}

@Override
public void onLocationChanged(Location location) {
    Log.i(DEBUG, "onLocationChanged");
    mLocation = new Location(location);
    mController.setCurrentPosition(mLocation);
    Log.i(DEBUG, "setted new position");
    mController.showOnMap(mGmap);
    mGmap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mLocation.getLatitude(), mLocation.getLongitude()), ZOOM_LEVEL));
}

@Override
protected void onResume() {
    super.onResume();
    try {
        mLocationManager.requestSingleUpdate(mProvider, this, null);
    } catch(SecurityException e) {
        System.out.println("OnResume Error: " + e.getMessage());
    }
}

@Override
protected void onPause() {
    super.onPause();
    mLocationManager.removeUpdates(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    Log.i(DEBUG, "onMapReady");
    mGmap = googleMap;
    try {
        mLocation = mLocationManager.getLastKnownLocation(mProvider);
        mController.setCurrentPosition(mLocation);
    } catch(SecurityException e) {
        e.printStackTrace();
    }
    mGmap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mLocation.getLatitude(), mLocation.getLongitude()), ZOOM_LEVEL));
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_explore) {
        try {
            if(mLocationManager != null) {
                try {
                    Log.i(DEBUG, "manual update request");
                    mLocationManager.requestSingleUpdate(mProvider, this, null);
                } catch (SecurityException e) {
                    Toast.makeText(this, "Failed to request location updates, ignore: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                } catch (IllegalArgumentException e) {
                    Toast.makeText(this, "Provider does not exist: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    } else if (id == R.id.nav_open_networks) {
        Toast.makeText(this, "Open network pressed", Toast.LENGTH_SHORT).show();

    } else if (id == R.id.nav_closed_networks) {
        Toast.makeText(this, "Closed network pressed", Toast.LENGTH_SHORT).show();
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}
public类MainActivity扩展了AppCompatActivity
实现NavigationView.OnNavigationItemSelectedListener、OnMapReadyCallback、LocationListener{
//日志标签
私有静态最终字符串LOG=MainActivity.class.getSimpleName();
私有静态最终字符串DEBUG=“调试MainActivity:”;
私有静态最终字符串TEST=“TEST”;
专用静态最终浮动缩放水平=15.5f;
//地图
私有谷歌地图;
私人场所经理;
私人位置;
私人WifiManager-mWifiManager;
专用广播接收机;
私有列表mResultList;
私有字符串提供程序;
私人标准mCriteria;
//控制器
专用访问点控制器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//工具栏
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
ActionBarDrawerToggle切换=新建ActionBarDrawerToggle(
这,抽屉,工具栏,R.string.navigation\u drawer\u open,R.string.navigation\u drawer\u close);
抽屉。设置抽屉定位器(开关);
toggle.syncState();
NavigationView NavigationView=(NavigationView)findViewById(R.id.nav_视图);
navigationView.setNavigationItemSelectedListener(此);
mController=新的AccessPointController();
startReceivingLocationUpdates();
mCriteria=新标准();
mCriteria.setaccurity(标准:精度_粗略);
mCriteria.setPowerRequirement(标准功率\介质);
mProvider=mLocationManager.getBestProvider(mCriteria,false);
Log.i(调试、mProvider);
mBroadcastReceiver=新广播接收器(){
@凌驾
接收时公共无效(上下文c,意图){
if(intent.getAction()==WifiManager.SCAN\u结果\u可用\u操作){
mResultList=mWifiManager.getScanResults();
mController.setApList(mResultList);
}
}
};
mWifiManager=(WifiManager)getApplicationContext().getSystemService(Context.WIFI_服务);
registerReceiver(mBroadcastReceiver,新的意向过滤器(WifiManager.SCAN\u RESULTS\u AVAILABLE\u ACTION));
mWifiManager.startScan();
//地图处理
SupportMapFragment mapFragment=(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
getMapAsync(这个);
}
私有void StartReceivingLocationUpdate(){
if(mLocationManager==null){
mLocationManager=(LocationManager)getSystemService(Context.LOCATION\u服务);
}
}
@凌驾
已更改位置上的公共无效(位置){
Log.i(调试,“onLocationChanged”);
M位置=新位置(位置);
mController.设置当前位置(mLocation);
Log.i(调试,“设置新位置”);
mController.shownmap(mGmap);
mGmap.moveCamera(CameraUpdateFactory.newLatLngZoom(新LatLng(mLocation.getLatitude()、mLocation.getLatitude()、ZOOM_LEVEL));
}
@凌驾
受保护的void onResume(){
super.onResume();
试一试{
mLocationManager.requestSingleUpdate(mProvider,this,null);
}捕获(安全异常e){
System.out.println(“OnResume错误:+e.getMessage());
}
}
@凌驾
受保护的void onPause(){
super.onPause();
mLocationManager.RemoveUpdate(此);
}
@凌驾
4月1日公开作废(谷歌地图谷歌地图){
Log.i(调试,“onMapReady”);
mGmap=谷歌地图;
试一试{
mLocation=mLocationManager.getLastKnownLocation(mProvider);
mController.设置当前位置(mLocation);
}捕获(安全异常e){
e、 printStackTrace();
}
mGmap.moveCamera(CameraUpdateFactory.newLatLngZoom(新LatLng(mLocation.getLatitude()、mLocation.getLatitude()、ZOOM_LEVEL));
}
@SuppressWarnings(“StatementWithEmptyBody”)
@凌驾
公共布尔值onNavigationItemSelected(MenuItem项){
//处理导航视图项单击此处。
int id=item.getItemId();
if(id==R.id.nav_){
试一试{
if(mLocationManager!=null){
试一试{
Log.i(调试,“手动更新请求”);
mLocationManager.requestSingleUpdate(mProvider,this,null);
}捕获(安全异常e){
Toast.makeText(此“无法请求位置更新,忽略:”+e.getMessage(),Toast.LENGTH_SHORT).show();
}捕获(IllegalArgumentException e){
Toast.makeText(此“提供程序不存在:”+e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
}捕获(安全异常e){
e、 printStackTrace();
}
}else if(id==R.id.nav\u open\u网络){
Toast.makeText(这是“打开网络按下”,Toast.LENGTH_SHORT).show();
}else if(id==R.id.nav\u闭合网络){
Toast.makeText(这是“已按下闭合网络”,Toast.LENGTH_SHORT).show();
}
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
抽屉。关闭抽屉(重力压缩机启动);
返回true;
}
}

基本上,当用户按下探索按钮时,应用程序应该找到用户并在地图上显示他

以下是日志:

/调试MainActivity::网络

/调试MainActivity::onMapReady

/调试控制器::设置位置

/调试MainActivity::手动更新请求

并且/Debugging MainActivity::onLocationChanged从未显示

我还尝试使用变量作为LocationListener,但它不起作用。 是的,我在清单中的权限很好

我真的