サンタレーダーのエラーを多分直した

スポンサーリンク
スポンサーリンク
サンタレーダー - Apps on Google Play
I will show Santa's current location.

スポンサーリンク

エラーを(できるだけ)直そう

何がおかしくて強制終了になってしまうのか分からなかったのだけれども、自分でPlayから落としてきて、エラー起きた時にフィードバックを送信したら、PlayConsoleのANRとクラッシュにエラーの詳細が送られてきた。ただ全部は直してない。なぜかって分からないからです。

java.lang.NullPointerException

ぬるぽ!が2箇所あった。

soundpoolのロードタイミング

Caused by: java.lang.NullPointerException:

at net.dalomo.santaradar.SantaMapActivity.onClickMeasure (SantaMapActivity.java:417)

Caused by: java.lang.NullPointerException:
at net.dalomo.santaradar.SantaMapActivity.onClickHorn (SantaMapActivity.java:307)

どちらも、エラーが起きた行でsoundpool.playを使っている。おそらく、soundpoolの準備ができてないのに、音を鳴らそうとしてエラーになったと思う。

解決策

そもそもsoundpoolの記述がlolipop以降違ってたのと、準備をちょい早めたので対応した。

…
mapView.onCreate(savedInstanceState);

AudioAttributes audioAttributes = new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .build();

soundPool = new SoundPool.Builder()
        .setAudioAttributes(audioAttributes)
        .setMaxStreams(1)
        .build();
sound = soundPool.load(this, R.raw.se_kirakira, 1);

mAdView = findViewById(R.id.adView);
…
参考
【Android】ロリポップからのSoundPool - Qiita
今までSoundPoolのインスタンス化は下記のような方法でした。final int SOUND_POOL_MAX = 6;SoundPool pool = new SoundPool(SOUN…
SoundPool  |  Android Developers

位置情報の取得タイミング

java.lang.NullPointerException:
at net.dalomo.santaradar.SantaMapActivity$GPSLocationListener.onLocationChanged (SantaMapActivity.java:476)

位置情報を取得したタイミングで、地図にユーザーのマーカーを追加してたのだけど、地図の準備ができてないのにマーカーを追加しようとしていたため、エラーになってたと思われる。

解決策
private class GPSLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        lat = location.getLatitude();
        lng = location.getLongitude();

        userPoint = Point.fromLngLat(lng, lat);

        if (usermarker == null && mapboxMapm != null) { //←ここ
            usermarker = mapboxMapm.addMarker(new MarkerOptions().position(new LatLng(lat, lng)));

            cp = new CameraPosition.Builder().target(new LatLng(lat, lng)).zoom(8).build();
            CameraUpdate cu = CameraUpdateFactory.newCameraPosition(cp);
            mapboxMapm.animateCamera(cu);
        }
    }

nullチェック入れた。

java.lang.IllegalStateException

こっちは分かんないのよね…。ログ見ると、せっかくインスコしてくれた人がいたみたいなんだけど、これのせいで起動もままならなかったのではないかと。

Caused by: java.lang.IllegalStateException:
at net.dalomo.santaradar.BGMService.onStartCommand (BGMService.java:33)

該当箇所のコードは

public int onStartCommand(Intent intent, int flags, int startId) {

    if (r <= 4) {
        mediaFileUriStr = "android.resource://" + getPackageName() + "/" + R.raw.wakuwaku_tanoshii_christmas;
    } else {
        mediaFileUriStr = "android.resource://" + getPackageName() + "/" + R.raw.thats_a_xmas;
    }

    Uri mediaFileUri = Uri.parse(mediaFileUriStr);
    try {
        player.setDataSource(this, mediaFileUri); //←ここ
        player.setOnPreparedListener(new PlayerPreparedListener());
        player.prepareAsync();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return super.onStartCommand(intent, flags, startId);
}

なんだけど、記述もおかしくはないと思うし、なんでなんだろーなと。変にBGMランダムにしなけりゃいいのかな。謎だ。ごめんなさい。

課題

こういうのってどうすれば事前に回避できんだろ。

コメント

タイトルとURLをコピーしました