たぶん週刊「今週の進捗」

1週間に勉強したことや実装したことをネタに、週に1回(主に土日に)更新していく予定です。「多分」なので、臨時休刊があってもご海容ください。

プロつく計画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:ランニング用走行距離計測アプリを作る

今日も今日とて、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.xmlandroid: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

また同じエラー…

というわけで、今週も進捗なしです。