AndroidStudioでGoogleMapを活用したアプリを作っています。
GPSを使い、常に現在地をGoogleMapで表示したいのですが、onLocationChangedのmGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPos));でmGooleMapの中身がnullになってしまいNullPointerExceptionが起きてしまいます。
stackoverflowの同じような現在地取得が書いてあるページを参考にしたり、調べてみたのですがどうしても解決できません。
自分の勉強、理解力が足りないせいなのですがよろしければお助けください。
ソースコードに時折自分のメモが書いてありますが、そこはお気になさらず
###発生している問題・エラーメッセージ
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.animateCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference at com.example.toy.runtizu.MapFragment.onLocationChanged(MapFragment.java:119) at com.google.android.gms.internal.zzart$zzb$1.zza(Unknown Source) at com.google.android.gms.internal.zzart$zzb$1.zzs(Unknown Source) at com.google.android.gms.internal.zzaaz.zzb(Unknown Source) at com.google.android.gms.internal.zzaaz$zza.handleMessage(Unknown Source) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7229) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
###該当のソースコード
public class MapFragment extends Fragment implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, OnMapReadyCallback, LocationListener { private GoogleMap mGoogleMap = null; private GoogleApiClient mGoogleApiClient = null; private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi; // GPS用 private LocationManager mLocationManager; private static final LocationRequest REQUEST = LocationRequest.create() .setInterval(5000) // 5 seconds .setFastestInterval(16) // 16ms = 60fps .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rview = inflater.inflate(R.layout.fragment_map, container, false); // GPS //FragmentでgetSystemServiceを使うときはgetActivity()をつける //Activityで使うときなどはgetActivityいらない mLocationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); LocationProvider provider = mLocationManager.getProvider(LocationManager.GPS_PROVIDER); return rview; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //GooglePlayServices経由で最後に取得した位置情報を取得する mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); //GoogleApiClient の接続 mGoogleApiClient.connect(); } @Override public void onStart() { super.onStart(); final boolean gpsEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (!gpsEnabled) { //ここにGPSがOFFになっていた時の処理を } } @Override public void onStop() { super.onStop(); } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; //MapTypeの設定 //標準、ハイブリッド、地形マップに変えれる mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); //マップの右下に表示される組み込みのズームコントロール(+と-でズームできるやつ)はデフォルトでは無効 //ここをtrueにすると有効にできる mGoogleMap.getUiSettings().isZoomControlsEnabled(); } @Override public void onLocationChanged(Location location) { // 現在地に移動 CameraPosition cameraPos = new CameraPosition.Builder().target(new LatLng(location.getLatitude(), location.getLongitude())).zoom(7.0f).bearing(0).build(); mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPos)); } @Override public void onConnected(@Nullable Bundle bundle) { if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } fusedLocationProviderApi.requestLocationUpdates(mGoogleApiClient, REQUEST, this); } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/28 12:53