私はユーザーの位置を見つけ、アクセスポイントと信号エリアの近くに配置するアプリを開発中です。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としても使用しようとしましたが、動作しません。 はい、マニフェストの権限は問題ありません。
私が間違っていることは本当に分かりません。
「古い」アプローチを使用し、ロケーションの更新を融合していないように見えます。まだ動作しないはずはありませんが、このライブラリに試してみてください:https://github.com/mcharmas/Android-ReactiveLocation?あなたのtargetSdkが23より大きい場合は、実行時のアクセス許可を設定する必要があります – cYrixmorten
それにも偉大なライブラリがあります。ちょうどfyi :) – cYrixmorten
はいアクセス権を要求する "splash_activity"があります。 私はfusedLocationを学校試験のために使用しようとします。私はコード内で何が起こるのか理論的に説明する必要があります。アドバイスをありがとう –