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

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ランダムにしなけりゃいいのかな。謎だ。ごめんなさい。

課題

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

カテゴリー: したい | タグ: , , , | コメントする

サンタレーダーを更新した

https://play.google.com/store/apps/details?id=net.dalomo.santaradar

サンタレーダー

ぶっちゃけると、今サンタレーダーをインストールしてるのは、世界で俺ただ一人なわけだけど、更新した。

サンタとの距離機能

結局ボタンを付けて、押すとトーストが出るようにした。サンタマーカー押しても反応しないし、ユーザーマーカーはいきなり消えたりするからです。でも直せないんです、分からないんです。

サンタ位置共有機能

twitterしか試してないけど、サンタの位置を投稿できるようになった。ハッシュタグを汚染しないかヒヤヒヤしたけど、ほぼ使ってなさ気なので勝手に使おう。

強制終了

かなり頻繁にクラッシュする。なんでだかが分からん。デバッグの時はなんともないんだけどなぁ、なんでだろ。

一段落

とりあえずやりたいことはできたので、一段落。サンタさんがあなたの上空を通過しましたよ機能はいつかまたモチベが上がったら作ろう。で、広告貼る時に使ったfirebaseっていうのが気になる。なんかチャットとか簡単に作れるらしい。やってみたいからそっちやってこう。

カテゴリー: できた | タグ: , , , | コメントする

共有ボタンを作る

このためだけにtwitterアカとった。

ShareCompat

ShareCompatとかいうのだけでできるみたい。

ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(MapboxActivity.this);
builder.setChooserTitle("サンタさんを共有");
builder.setText("サンタがいるよ");
builder.setType("text/plain");
builder.startChooser();

めちゃめちゃ簡単。ただこれを組み合わせるってなると、とたんになんか難しくなる。

参考

https://dev.classmethod.jp/smartphone/android/android-tips-35-sharecompat/

カテゴリー: のーと | タグ: , , | コメントする

サンタとの距離を測る

簡単。

TurfMeasurement.distance(point1, point2,unit)

だけ。戻り値はdoubleで、unitには”kilometer”とか”mile”っていれれば単位が変わる。

簡単。

なんだけど

こう、うまいことサンタレーダーに組み込めない。

マーカークリックしたときになんかする

mapboxMap.setOnMarkerClickListener(new MapboxMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(@NonNull Marker marker) {
        double km;

        if (!(point_a == null)) {
            km = TurfMeasurement.distance(searchLocationPoint, point_a);

            Toast.makeText(MapboxActivity.this, String.valueOf((int) km), Toast.LENGTH_SHORT).show();
        }


        return false;
    }
});

といった感じのコードを書いて、サンタマーカーをクリックしても、何も反応しない。ただ自分の位置にあるマーカーをクリックするとトーストが表示される。うーん。

自分が思ってる動きと実際の相違

がいっぱいある。どのタイミングで処理を書けばいい感じに動いてくれるのか、やっぱり分からないな。変なところでマーカーが消えたり、消えてほしくないところで消えたり。位置取得ができたと思ったら、その前にその値を必要としている処理が終わってたり。ううむ。

カテゴリー: したい | タグ: , , , , , | コメントする

Mapboxで逆ジオコーディングしたい

https://play.google.com/store/apps/details?id=net.dalomo.santaradar

逆ジオコーディング

ジオコーディングっていうのが、住所から緯度経度を求めるやつで、その逆だから、緯度経度から住所を求める。なるほ。サンプルがあったので、コピペしたろと思ったのだけれど、コピペも一筋縄ではいかなかった。

Point searchLocationPoint = Point.fromLngLat(mll.getLongitude(), mll.getLatitude());
if (!(searchLocationPoint == null)) {
    try {
        MapboxGeocoding reverseGeocode = MapboxGeocoding.builder()
                .accessToken("token")
                .query(searchLocationPoint)
                .country("JP")
                .geocodingTypes(GeocodingCriteria.TYPE_PLACE)
                .build();

        reverseGeocode.enqueueCall(new Callback<GeocodingResponse>() {
            @Override
            public void onResponse(Call<GeocodingResponse> call,
                                   Response<GeocodingResponse> response) {
                List<CarmenFeature> results = response.body().features();
                if (results.size() > 0) {

                    CarmenFeature feature = results.get(0);
                    Log.d("debug", feature.placeName());
                } else {

                }
            }

            @Override
            public void onFailure(Call<GeocodingResponse> call, Throwable throwable) {
                throwable.printStackTrace();
            }
        });

    } catch (ServicesException servicesException) {
        
    }
}

ほぼコピペだー。けどこれが動くまで結構難儀した。

勘違いその①-GeocodingAPI入れてない

MapboxのSDKが入ってりゃ使えるもんだと思ってた。Mapboxgeocodingが赤字になってなんでだーなんでだーっとやっていたのだけれど、それ用のライブラリを追加するために、gradleに追記しなきゃいけなかった。

implementation 'com.mapbox.mapboxsdk:mapbox-sdk-core:4.1.1'
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-geojson:4.1.1'
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-services:4.1.1'

をappレベルのdependencies {}に追記したら使えるようになった。

勘違いその②-Retrofit2が必要だった、多分

サンプルコードをコピペしてAlt+Enterとかやってると、いつの間にか

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

というのがimportされる。勝手にされたので、もう使えるもんだと思っていたらそうじゃないみたい。これもやっぱりgradleに追記しなきゃダメだった。

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

これに気づくまで、サンプル通りに書いてんのになんで取得できんのじゃと思い悩んでいた。初心者には厳しいよう。で、これは何なの、と思い調べてみたけどAPIを使うのを便利にしてくれる、非同期処理もしてくれる。ぐらいしか分からん。頭も追いつかず、いつか分かる日が来るといいな…。

参考

https://www.tsurutan.com/entry/2016/10/04/003929

https://qiita.com/hymmr/items/cbb1013617cd43b8c7c4

https://qiita.com/thdroid/items/f648895b805539a9d620

理解できたと思われること

上から。

  1. Point.fromLngLatで住所を取得したい地点の座標からPointを作る。
  2. MapboxGeocoding.builder()で設定する。
    • accessToken – 自分のトークンを書く。
    • query – 座標をPoint型で書く。
    • country – 国を限定する。自分の場合いらんかも。
    • geocodingTypes – 住所の形式。TYPE_PLACEで市町村名まで。ここ参照。
    • builder – 実行みたいなやつ、多分。
    • 他にもあるけど俺はいんなかった。
  3. encueCallでデータ取りに行く。
  4. onResponceが成功した場合の処理…なのかな。API用のGeoJSON型みたいなので返ってくるので、それを受けてあげて、自分のしたい処理を書く。FeatureのgetplaceNameで住所が取得できる。
  5. onFailureが失敗した時の処理かな。ここで何すればいいのか分からんのでサンプルのまま。

Log.dで見てみたら、ちゃんと取得できてた。上の画像ね。

どっかにLogの代わりにTimberっていうのを使ってるコードを見かけたけど、それ使ったら

Since Timber is included in the project, it is likely that calls to Log should instead be going to Timber.

って嫌味言われるんだけど。import消してもずっと出るんですけど。なんなの。

それから

取得できた住所をマーカーに設定しようとしてもできない。ここはもう全然分からんな。どうやって表現しよっかなー。

参考

https://www.mapbox.com/android-docs/java/overview/geocoder/

https://www.mapbox.com/api-documentation/?language=Java#retrieve-places-near-a-location

https://www.mapbox.com/android-docs/java/examples/geocoding-java-service/

カテゴリー: のーと | タグ: , , , , | コメントする

サンタを呼び寄せる

https://play.google.com/store/apps/details?id=net.dalomo.santaradar

サンタ呼べるようにする。なったけど思ってたのとはちょっとちがくなった。

サンタ呼び

自分の位置から〇〇km以内に呼ぶ

自分の位置は取得してるので、そっから足し引きしてサンタを出現させる範囲を決める。こちらによると31mで0.00027778みたい。30km四方ぐらいでいいやと、足し引きする数は0.277778にした。

    public void onClickHorn(View v){
        double latMax, latMin, santaLat;
        double lngMax, lngMin, santaLng;
        double KM_3 = 0.277778;

        if(lat == 0) {
            Toast.makeText(this, "現在地が取得できません", Toast.LENGTH_SHORT).show();
            return;

        }else if{
            Random r = new Random();
            latMax = lat + KM_3;latMin = lat - KM_3;
            lngMax = lng + KM_3;lngMin = lng - KM_3;
            santaLat = latMin + (latMax - latMin) * r.nextDouble();
            santaLng = lngMin + (lngMax - lngMin) * r.nextDouble();

            mapboxMapm.removeMarker(marker);
            santamll = new LatLng(santaLat,santaLng);
        }
    }

とりあえず呼び寄せることはできたのだけれど、元サンタが消えてくれない。なので、地図上にどんどんサンタが貯まる羽目になった。んー、なんでremovemarkerしてるのに消えないんだろなぁ。

増加するのは楽しいからいいんだけど、こうなるとマーカーをタップした時の処理をどう書けばいいのか分からない。いやそもそも分からないんだけど、もっと分からなくなる。

あ、あと拡声器ボタン押すと音が鳴るようになった。効果音はSoundPoolっていう方を使うと良いみたい。

SoundPool soundPool;
int sound;
soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
sound = soundPool.load(this, R.raw.se_kirakira, 1);
soundPool.play(sound,1,1,0,0,1);

よかよか。

参考

https://qiita.com/Mocacamo/items/1a434c2b25426ffe36b2

http://kirakira-soundeffect.com/index.php

カテゴリー: したい | タグ: , , , | コメントする

サンタレーダーができた

せっかくヘッダー画像作ったのに表示されなくてくやしいからここに貼る。

サンタレーダー

とにかく公開したかったので公開しちゃった!すごいな、ちゃんと表示されてるよ。

GooglePlay

https://play.google.com/store/apps/details?id=net.dalomo.santaradar

さがすボタンを押すと、日本地図上にサンタさんが表示されるよ。

えっと…

うん…

それだけ…

勢いで公開したけど、これクソつまんねぇな。できたことが嬉しすぎて$25パーッと払って公開したけど誰が使うんだこれ。いっか、がっかりアプリとして生きていこう。

それにしても、作った過程を全然残してない。あとで困るの自分だろうし、とりあえずコード書くのは一段落にしてやったこと残しとこう。

あと、11月に思いついて、GooglePlayで検索してみても海外とかでちらほらある感じだったのに、12月に入ったら、あのGoogle先生がサンタアプリ出してるの。

https://play.google.com/store/apps/details?id=com.google.android.apps.santatracker

これ見たらなんかすげぇ恥ずかしくなっちゃって、ちょっと落ち込み中。。。まぁ比べるのもおこがましいんだけどさ。みんな立派なアプリ出してる中で、俺だけクソアプリ出してるってのがなんとも。まぁ気を取り直して。

追加したいこと

サンタさんとの距離

サンタさんのマーカーの位置とユーザーの現在地情報を使ってサンタさんとの距離を測りたい。トーストで表示するかタイトルやらスニペットやらはたまたTextViewかはまた考えよう。

逆ジオコーディング

サンタさんの位置から住所を取得したい。

共有機能

↑ができたら、twitterとかでよく見る#付きのツイートができる機能とか付けたい。ただtwitterやってないし。あれなんなん。まずアカウント取るところからだな。

サンタさんは現在、「東京都 千代田区」にいます!!あなたとサンタさんの距離は30kmです!! #サンタレーダー

みたいな!

サンタさん呼び寄せ機能

どうせランダムで出してるんだし、近くに呼び寄せることだって可能なはず。ユーザーの位置から1km四方でランダムとかでできんじゃないかな。

サンタさんがあなたの上空を通過しましたよ通知機能

これもでっち上げられるはずだ。サンタ思い通りだな。

その他

もっと思いつけ俺!

利用させていただいた素材

http://www.hurtrecord.com/bgm/35/wakuwaku-tanoshii-christmas.html

http://www.music-note.jp/bgm/xmas.html

https://www.irasutoya.com/

カテゴリー: できた | タグ: , , , , | コメントする

Mapboxでもマーカーをgifアニメっぽくする

できた。

記事書くのめんどくさくなってきてるな。

ここまでできたし、まずはGooglePlayに公開してみようかな。

似てるけど違う

  • setIcon()が最初しか効かない

のでmapboxMapm.removeMarker(marker)でマーカーを消して、addMarkerで新たに設置する。

  • setTagが無い

のでsetIdを使う。こっちはint型。

あとMapbox型の変数用意するとか、初期サンタの位置をLatlng型で持っとくとか。あたぁ大体一緒だった。

参考

https://dalomo.net/blog/2018/11/30/203/

カテゴリー: のーと | タグ: , , , , , | コメントする

日本国内にランダムにマーカーを配置する②

とりあえずここまでいった。寝よ。

12/3

できた。

MapBoxで

上のやつはできた勢いで書いただけなので、さらっと流れを書いておく。書く以外にも難儀していたけどそこまで覚えてないや。基本的な流れはこちらを参考にした。道路上とかはやってない。大変ありがたかったです。

日本の範囲内にマーカーを散らばす

参考サイトではturfのrandomを使っていたけど、java版には無いみたいなのでそこは手動でやる。そんでJSONObjectができたと。

JSONObject obj = new JSONObject();
obj = makeJSON();
FeatureCollection featureCollection = FeatureCollection.fromJson(obj.toString());

JSONObjectをtoStringでString型にして、FeatureCollection.fromJsonでMapboxで扱えるようになった。日本範囲内のPointのデータの集まりなので、そこには座標も含まれてる。その座標を元にマーカーを設置していけば、↑の1枚目の画像になる。

参考

https://medium.com/nextome/show-a-geojson-layer-on-google-maps-osm-mapbox-on-android-cd75b8377ba

そういえば↑見るとGoogleMapでもgeoJSON扱えそうなんだよな…。

https://developers.google.com/maps/documentation/android-sdk/utility/geojson

これとか、どうなんだろ。

日本の陸地に含まれてるマーカーだけにする

参考サイトに日本のポリゴンがあったので、それを拝借した。それを同じようにMapboxで扱えるようにして、Turfのinsideメソッドで判定してあげれば、残るのは陸地内ということだ。

アプリローカルにファイルを設置

assetsフォルダを作る。

以前別の記事でraw作る時に上の方のAndroidResourceDirectryを使っていたけど、普通に下の方にそれそのものがあった。えへへ。ちなみになんでassetsなのかは知らない。そんで、その中に落としてきたjapan_outline.geojsonをペースト。

assetsから読み込んでJSONにする

ここがすごーく難儀した。いやちゃんと理解してないままやろうとした自分が全部悪いんだけどさ。

MultiPolygon mp;
StringBuilder builder = new StringBuilder();
InputStream is;
FeatureCollection fc;
AssetManager assetManager = getResources().getAssets();

try {
    is = assetManager.open("japan_outline.geojson");
} catch (IOException e) {
    e.printStackTrace();
}

try {

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
    String str;

    while ((str = bufferedReader.readLine()) != null) {
        builder.append(str);
    }

    JSONObject json = new JSONObject(builder.toString());

動いてくれたコードね。知らなかった言葉がたくさんある。AssetManager, InputStream, BufferedReader, StringBuilder,List<>ふんわり理解していこう。

AssetManager

assetsフォルダにあるファイルを使う時に使用するやつ。getResouce().getAssets()で使う準備。そんでassetManager.open(filename)でファイルを開く。

InputStream, InputStreamReader, BufferedReader
  • InputStream

読み込んだファイルをふわっとした感じにしてくれる。

  • InputStreamReader

ふわっとした感じをJavaで扱える感じにしてくれる。

  • BufferedReader

Javaで扱える感じをゆったり読み込んでくれる。

StringBuilder

文字列を組み立てるんだろうなー。今回は、BufferedReaderで一行ずつ読み込んだやつを、1個にまとめてくれる。そういえば、元のファイルが複数行になっている場合

while ((str = bufferedReader.readLine()) != null) { 
    builder.append(str); 
}

としないと、全部読み込んでくれない。俺ははこれをやってなくて、最初の行しか読み込まれずエラー出まくって、デバックしてやっと気づいた。

ほいでStringBuilderからtoStringして、JSONObjectにすると。

…これはもう定形として覚えるだけでいいかな…。

参考

http://d.hatena.ne.jp/seinzumtode/20130426/1366934641

https://teratail.com/questions/94566

http://ria10.hatenablog.com/entry/20121128/1354081081

turfJoins.insideで扱えるようにgeoJSON型にする

今読み込んでるのは、日本の陸地のポリゴンで、JSONObject型になってる。turfJoins.insideは

public static boolean inside(com.mapbox.geojson.Point point,
                             com.mapbox.geojson.MultiPolygon multiPolygon)

と、引数をMultiPolygon型(もしくはPolygon型)にしないといけない。

    fc = FeatureCollection.fromJson(json.toString());
    List<Feature> featuresjp = fc.features();
    Feature ft = featuresjp.get(0);
    mp = (MultiPolygon) ft.geometry();

} catch (JSONException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

先ほどと同じようにFeatureCollection型にする。FeatureCollectionは.fetures()でList<Feature>を返す。List<>っつーのは動的配列みたいなもんらしい。.get(index)で単体のFeatureが取得できる。indexは0始まりみたい、japan_outline.geojsonの構成を見ながらどこに何が配置されてるか理解しながらやんないとダメだった。ちなみにindexを1にしてエラー出したのが私だ。そんで.geometry()でFeatureの内部を取得できる。geometryはいくつか種類があるので、適切な形(ここではMultiPlygon)にキャストしてあげる。できた。

参考

https://www.mapbox.com/android-docs/api/mapbox-java/libjava-turf/4.1.1/index.html?com/mapbox/turf/TurfJoins.html

https://eng-entrance.com/java-array-list

日本の範囲内のPointデータと日本の範囲を表すデータを比較してマーカーを配置する

やっとturfが使える。

List<Feature> features = featureCollection.features();

mapView.getMapAsync(new OnMapReadyCallback() {
    @Override
    public void onMapReady(@NonNull MapboxMap mapboxMap) {
        mapboxMapm = mapboxMap;

        for (Feature f : features) {
            Point p = (Point) f.geometry();
            if (TurfJoins.inside(p, mp)) {
                marker = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(p.latitude(), p.longitude())));
                marker.setIcon(icon01);
            }
        }
    }
});

これ↓は

mapView.getMapAsync(new OnMapReadyCallback() {
    @Override
    public void onMapReady(@NonNull MapboxMap mapboxMap) { … };

こう書こうねとサンプルがなってたのでこう書いた。

ランダムPointのデータをList<Feature>型にする。Listは拡張for文が使えるみたいなので、それぞれのFeatureをPoint型にキャストし、それが日本の範囲内にあるかどうかをturfjoins.insideで判定する。戻り値がtrueだったらmarkerをその位置に追加し、.setIcon()する。

これで上から2番目の画像になった、と。

カテゴリー: したい | タグ: , , , , , , | コメントする

Mapboxの地図を使う

Mapbox

ここを見ながらやってく。

build.gradleに追記

いきなりbuild.gradleが2つあり、どっちに書けばいいの?となった。

こっちの(Module:app)でいいんだと思う。

android{}内に書く

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

下記は新しいブロックで書く

repositories {
    mavenCentral()
}

dependencies{}内に書く

implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:6.7.1'

AndroidManifest.xmlに追記

<manifest…>…</manifest>ブロック内に書く。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

これはあれだな、GoogleMapでもやったな。

Mapboxactivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.maps.MapView;

public class MapboxActivity extends AppCompatActivity {
    private MapView mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Mapbox.getInstance(this, "Key");
        setContentView(R.layout.activity_mapbox);
        mapView = findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);

    }

    @Override
    public void onStart() {
        super.onStart();
        mapView.onStart();
    }

    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

}

アクセストークンは

Mapbox.getInstance(this, "Key");

に入れる。

activity_mapbox.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:mapbox="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapboxActivity">

    <com.mapbox.mapboxsdk.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        mapbox:mapbox_cameraTargetLat="40.73581"
        mapbox:mapbox_cameraTargetLng="-73.99155"
        mapbox:mapbox_styleUrl="mapbox://styles/mapbox/streets-v10"
        mapbox:mapbox_cameraZoom="11" />

</android.support.constraint.ConstraintLayout>

xmlはまんま。他にどんな設定項目があって、それをするとどうなるのかとか。後回し。

起動してみる

できた。40.73581, -73.99155ってどこじゃろ。

日本語表記にしたい

日本を見てみたら英語表記だったので、日本語にしたい。ここに行って、Styleを編集する。TextFieldの値を全部name_jaにして、

share&useからstyleURLをコピー。shareはprivateとpublicどっちでもいいんかな。んでactivity.xmlの

mapbox:mapbox_styleUrl="mapbox://styles/*****"

に入れる。

…変わらない。あれ?っと思って、とりあえずご飯食べてきたら変わってた。

時間かかるみたいね。

他にプラグインを使う方法もあるみたい。これとかこれ

参考

https://www.mapbox.com/help/change-language/

Turf for Javaの導入

build.gradle(app)のrepositories{}に(↑で入れてるけど)

mavenCentral()

と書いて、dependencies{}に

implementation 'com.mapbox.mapboxsdk:mapbox-sdk-turf:4.1.1'

を追加。

使えるようになった!

あとなんかいつの間にかGeoJSONも使えるようになってた!sdkとturfのどっちに入ってたんだろ?

参考

https://www.mapbox.com/android-docs/java/overview/turf/

どしどしやってこー

カテゴリー: のーと | タグ: , , , , , , , | コメントする