質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

2回答

7908閲覧

GoogleMap常に現在地表示をしたい

dattememo

総合スコア7

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2016/12/28 10:48

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) { } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

以下のドキュメントでは
Google Map

final void setLocationSource(LocationSource source)

Replaces the location source of the my-location layer.
とのことなのでsourceの切り替えをしないといけないのではないでしょうか

java

1mGoogleMap = googleMap; 2mGoogleMap.setLocationSource(source); 3mGoogleMap.setMyLocationEnabled(true);

参考:
http://stackoverflow.com/questions/28108326/android-google-maps-location-with-low-battery-usage
https://akira-watson.com/android/google-map-fusedlocationapi.html

投稿2016/12/28 12:11

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dattememo

2016/12/28 12:53

書いてあるURLなどを見て試してみているのですがmGoogleMap.setLocationSource(source);がうまくいきません。 やはりActivityとFragmentでは書き方がちがうものなのでしょうか
guest

0

ベストアンサー

地図の用意ができると呼ばれるメソッドonMapReadyの前に位置情報が変化したときに呼ばれるメソッドonLocationChangedが先に呼ばれているからだと思いますよ。

まずは各メソッドの先頭にログ出力処理を追加してどちらが先に呼ばれているかを確認しましょう。

また、どの変数がnullなのかを調べてから質問をしましょう。

投稿2016/12/28 12:02

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dattememo

2016/12/28 12:26

onCreateViewのLocationManagerをつかっているところでonLocationChangedが呼ばれているからそれよりも前にonMapReadyを呼んであげるということでよろしいでしょうか ログを表示させ、先にonMapReadyを呼んでみたのですが変数mGoogleMapがnullから変わらずに同じエラーが出てしまいます。
yona

2016/12/28 12:37

onMapReadyはライブラリからの地図の準備ができたときに呼ばれるコールバックメソッドなので、あなたが呼んでも無駄です。 ログの結果はどちらが先でしたか?
dattememo

2016/12/28 13:02

onLocationChangedが先に呼ばれていました。 onCreate→onCreateView→onConnected→onLocationChangedの順番でした
yona

2016/12/28 13:49

onLocationChanged内ではmGoogleMapがnullなら処理をしないようにしましょう。 また、onMapReadyでは位置情報が取得されていたら地図の位置を移動するようにしましょう。
dattememo

2016/12/28 14:06

onLocationChanged内でmGoogleMapがnullなら処理をしないようにしたらエラーは消え、アプリも実行できたのですが、onMapReadyが呼ばれてないようでmGoogleMapがnullなのは変わりませんでした。
yona

2016/12/28 14:25

GoogleMapについて使用するための処理はどこにあるんですか? 省略されているかと思いましたが、無いなら呼ばれないのは当たり前です。
dattememo

2016/12/29 05:24

このFragmentを表示する処理を書いてあるActivityでgetMapAsyncを書いていたので大丈夫なのかと考えていました。 FragmentにgetMapAsyncを書こうとしたのですが SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.fragment); のgetSupportFragmentManagerが使えないようだったのでActivityのほうに書きました。 SupportMapFragmentを継承すれば使えるのでしょうがほかのFragmentから遷移できなくなるようなので・・・
dattememo

2016/12/29 06:06

getMapAsyncはメインスレッドでしか呼び出せないのを忘れていました。 無事に解決できました。 自分の勉強不足で初歩的なミスをしてしまい理解力も足らないのに親切に教えてくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問