プロつく計画6: onLocationChanged() で位置情報を取得する
onLocationChanged() を呼び出すには requestLocationUpdates() が必要らしいので、
とりあえず適当な場所に requestLocationUpdates() を書いてみたところ、
定期的に位置情報を取得するようになりました。
が、以下のような課題も。
- スリープしている間、位置情報の取得が止まる
- 一度位置情報の取得が止まると再開されない
これらの要改善点もありますが、
まだ android.location で位置情報の取得をしているみたいなので、
次は GoogleAPI で取得するようにします。
プロつく計画6:呼び出されなくなったonLocationChanged()
症状: onLocationChanged() メソッドが呼び出されない
原因?: onLocationChanged メソッドを使うには、LocationManager の requestLocationUpdates() で設定することが必要らしい。
前のソースコードでは確かに実行されていた requestLocationUpdates() がデッドコードになっていたので、 多分これが原因。
ツールでアクティビティ図で自分のコードとサンプルコードを分析してみたら、 割とあっさり問題箇所をここまで至ったので、 ただコードを眺めるだけでなく図に書いて解析することも、 紙じゃなくてツールで効率化することも重要だと思いました()
というわけで、次週はこれをなんとかします。
06/04 ~ 06/10 の進捗
** Androidアプリを作る
draw.io という、UMLを書けるサイトでとりあえずシーケンス図を書いているところです。 Flowchart Maker & Online Diagram Software
しかしこれから解決しようとしている問題にシーケンス図は適当なのか?という問題も
** Unreal Engine 初めて関東ゲーム制作部に参加して、Unreal Engineのインストール作業を進めていました。 動作確認はできてないけどインストールは終わったので後は家でやろうと思ったら、 何故かインストールしたはずのUnrealEngineがない…
@ZeitungM は「つぁいとぅんぐえむ」と読んでください
プロつく計画6:ランニング用走行距離計測アプリを作る
locationクラスを使ったサンプルコードと、GoogleLocationAPIを使ったサンプルコードを 同じプロジェクトで参考にして継ぎ足して書いていった結果、 とんでもないスパゲッティコードモンスターを生み出してしまったような気がする…
やはり早く完成させたいという気持ちに逸ってはダメですね。
次からはGoogleLocationAPIのサンプルコードのトピックや全体を 理解してから書いていこうと思います。
プロつく計画6:ランニング用走行距離計測アプリを作る
ちゃんと起動できるようになるまでになりました。
まだ位置情報の取得は出来ていませんが…
onLocationChanged() が呼ばれていないような気がする。
プロつく計画6:ランニング用走行距離計測アプリを作る
今日も今日とて、java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
問題です。
AndroidManifest.xml だけでなく styles.xml も噛んでいるみたいなので、そっちも見てみることに。
試しに、 styles.xml を以下のように編集してみる。
<!-- Theme.AppCompat を継承して、Theme.MyAppCompat を作成 --> <style name="Theme.MyAppCompat" parent="Theme.AppCompat"> <!-- 中略 --> </style>
で、これに合わせて、AndroidManifest.xml を編集。
<application <!-- 中略 --> <!-- android:theme に、 styles.xml で作成した theme を指定 --> android:theme="@style/Theme.MyAppCompat">
で、ビルドしてみます。
11:24:26.294 30345-30345/net.zeitungm.measureofroad E/AndroidRuntime: FATAL EXCEPTION: main Process: net.zeitungm.measureofroad, PID: 30345 java.lang.RuntimeException: Unable to start activity ComponentInfo{net.zeitungm.measureofroad/net.zeitungm.measureofroad.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.common.api.GoogleApiClient.connect()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2509) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:168) at android.app.ActivityThread.main(ActivityThread.java:5885) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.common.api.GoogleApiClient.connect()' on a null object reference at net.zeitungm.measureofroad.MainActivity.onStart(MainActivity.java:178) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1288) at android.app.Activity.performStart(Activity.java:6279) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2472) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:168) at android.app.ActivityThread.main(ActivityThread.java:5885) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
ぬるぽ 新しいエラー
Attempt to invoke virtual method 'void com.google.android.gms.common.api.GoogleApiClient.connect()' on a null object reference
が出ました。
ということは、これで You need to use a Theme.AppCompat theme (or descendant) with this activity.
は解決です!(多分)
というか、このくらい先週の時点で察するべきだったなぁ…
プロつく計画6:動かなくなった原因を追求する
さて、先週の続きです。 どうやら、使っているテーマが合わないらしく、エラーメッセージで Theme.AppCompat (あるいはそれ的なもの)を使えと言われているようなきがするので、AndroidManifest.xml の android:theme を修正してみます。
@android:style/Theme.Light.NoTitleBar
元々指定していたものなので省略。
@style/Theme.AppCompat.Light.NoActionBar
@style/Theme.App.Compat
まで入力したらサジェストされた、今まで使っていたテーマと近そうなものを指定してみる。
こんなエラーが出た。
05-13 01:55:48.873 22675-22675/? E/AndroidRuntime: FATAL EXCEPTION: main Process: net.zeitungm.measureofroad, PID: 22675 java.lang.RuntimeException: Unable to start activity ComponentInfo{net.zeitungm.measureofroad/net.zeitungm.measureofroad.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2509) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:168) at android.app.ActivityThread.main(ActivityThread.java:5885) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:355) at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:324) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:285) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) at net.zeitungm.measureofroad.MainActivity.onCreate(MainActivity.java:142) at android.app.Activity.performCreate(Activity.java:6262) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2462) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:168) at android.app.ActivityThread.main(ActivityThread.java:5885) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 05-13 01:55:48.875 1191-2723/? E/ActivityManager: App crashed! Process: net.zeitungm.measureofroad
同じエラー内容ですがな。
@style/Theme.AppCompat.Light.NoActionBar.FullScreen
ここを参考に、 styles.xml も編集してやってみた。
https://moshimore.jp/knowledge/2016/02/06/android_fullscreen/
こんなエラーが出た。
05-13 13:29:04.748 12269-12269/net.zeitungm.measureofroad E/AndroidRuntime: FATAL EXCEPTION: main Process: net.zeitungm.measureofroad, PID: 12269 java.lang.RuntimeException: Unable to start activity ComponentInfo{net.zeitungm.measureofroad/net.zeitungm.measureofroad.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2509) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:168) at android.app.ActivityThread.main(ActivityThread.java:5885) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:355) at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:324) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:285) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) at net.zeitungm.measureofroad.MainActivity.onCreate(MainActivity.java:142) at android.app.Activity.performCreate(Activity.java:6262) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2462) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:168) at android.app.ActivityThread.main(ActivityThread.java:5885) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 05-13 13:29:04.748 1191-2723/? E/ActivityManager: App crashed! Process: net.zeitungm.measureofroad
また同じエラー…
というわけで、今週も進捗なしです。