2017-07-10 9 views
0

私はユーザーの位置を見つけ、アクセスポイントと信号エリアの近くに配置するアプリを開発中です。OnLocationChangedの問題

ボタンを使用して手動で位置の更新をリクエストしているとき、コールバック機能は呼び出されません。

これが私の活動です:ユーザーが探索ボタンを押したときに

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; 
} 

}

は基本的にアプリがユーザーを検索し、地図上に彼を示すべきです。ここ

はlogcatある:

/デバッグMainActivity ::ネットワーク

/デバッグMainActivity :: onMapReady

/デバッグコントローラ::設定位置

/デバッグMainActivity ::マニュアル更新リクエスト

と/ Debugging MainActivity :: onLocationChangedは決して表示されません。

変数をLocationListenerとしても使用しようとしましたが、動作しません。 はい、マニフェストの権限は問題ありません。

私が間違っていることは本当に分かりません。

+0

「古い」アプローチを使用し、ロケーションの更新を融合していないように見えます。まだ動作しないはずはありませんが、このライブラリに試してみてください:https://github.com/mcharmas/Android-ReactiveLocation?あなたのtargetSdkが23より大きい場合は、実行時のアクセス許可を設定する必要があります – cYrixmorten

+0

それにも偉大なライブラリがあります。ちょうどfyi :) – cYrixmorten

+0

はいアクセス権を要求する "splash_activity"があります。 私はfusedLocationを学校試験のために使用しようとします。私はコード内で何が起こるのか理論的に説明する必要があります。アドバイスをありがとう –

答えて

0

マップが非同期にロードされたため、onMapReady()メソッドでの処理を依頼するのが早すぎました。

LocationManagerアプローチをFusedLocationアプローチに置き換えると、接続が確立されてから計算されるまで待つことができます。

関連する問題