https://play.google.com/store/apps/details?id=net.dalomo.santaradar
エラーを(できるだけ)直そう
何がおかしくて強制終了になってしまうのか分からなかったのだけれども、自分で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);
…
参考
https://qiita.com/totem2048/items/1fb00e8e7e9a683c89ea
https://developer.android.com/reference/android/media/SoundPool
位置情報の取得タイミング
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ランダムにしなけりゃいいのかな。謎だ。ごめんなさい。
課題
こういうのってどうすれば事前に回避できんだろ。
