質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

解決済

Androidアプリで端末内に保存してあるjsonファイルからデータを取得したい

adakatt12
adakatt12

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1回答

0評価

0クリップ

644閲覧

投稿2022/01/20 13:22

編集2022/01/22 16:19

はじめに

AndroidstudioでARアプリを開発しています。言語はjavaを使用しています。
カメラを向けた先に目的地があれば目的地の名称と現在地からの距離をの書かれた吹き出しを表示するというアプリです。

実現したいこと

目的地のデータをandroid端末の内部ストレージに保存してあるjsonファイルから取得し、後のプログラムにて使用したいです。

現状

実行時にエラーは出ないのですが、アプリを起動したときに吹き出しが表示されません。
考えられる原因は、内部ストレージからjsonファイルの取得ができていない、jsonファイルの読み取り方が間違っている、jsonから得た値の受け渡しが出来ていない、などだと思うのですが、初心者の私にはどこが問題なのか分かりませんでした。
知識のある方から見て、どこが問題であるのかご指摘頂けたら幸いです。よろしくお願いします。

sample.json

[{ "info":"ここに目的地の名称が入ります", "latitude":35.xxxxxx, "longitude":138.xxxxx }, { "info":"〇〇〇〇〇〇", "latitude":35.yyyyyy, "longitude":138.yyyyyy }, ~略~ }]

/data/data/[packagename]/files/sample.json のように保存しています。

Overlayview.java

package com.example.secondar6; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.view.Display; import android.view.View; import android.view.WindowManager; import com.google.android.gms.maps.model.LatLng; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class OverlayView extends View { // カメラの画角を指定する private final int ANGLE = 71; // ARテキストの見える範囲を指定する // ここでは3kmほどに指定する private final float VIEW_LIMIT = 3000; //赤道半径 private final double RADIUS = 6378137; // ディスプレイサイズ private int displayX; // コンパスの描画位置を指定する private final float POS_COMPASSX = 100; private final float POS_COMPASSY = 100; // 向きを保持する変数 float direction; // 現在地を保持する変数 float posx; float posy; // ARテキストの情報を保持するオブジェクト private ArrayList<readJson.GPSdata> glist; public OverlayView(Context context) { super(context); // 画面サイズの取得 Display disp = ((WindowManager) context .getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); displayX = disp.getWidth(); } public static class readJson { public static ArrayList<GPSdata> jlist = new ArrayList<>(); public static void main(String[] args) throws JSONException { String data = readFile(); JSONArray jarray = new JSONArray(data); for (int n = 0; n < jarray.length(); n++) { JSONObject jobject = jarray.getJSONObject(n); String info = (String) jobject.get("info"); String slatitude = (String) jobject.get("latitude"); String slongitude = (String) jobject.get("longitude"); double latitude = Double.parseDouble(slatitude); double longitude = Double.parseDouble(slongitude); jlist.add(new GPSdata(info, latitude, longitude)); } } public static class GPSdata { String info; double latitude; double longitude; public GPSdata(String info, double latitude, double longitude) { this.info = info; this.latitude = latitude; this.longitude = longitude; } } } private static String readFile() { Context context = Myapplication.getAppContext(); String fileName = "sample.json"; try { File file = new File(context.getFilesDir(),fileName); BufferedReader br = new BufferedReader(new FileReader(file)); String data = " "; String str = br.readLine(); while (str != null){ data += str; str = br.readLine(); } br.close(); return data; }catch (FileNotFoundException e){ System.out.println(e); return null; }catch (IOException e){ System.out.println(e); return null; } } // (1)描画処理 @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true); // 0.1秒休止 // 吹き出しの高速移動によるちらつきを抑える try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } ArrayList<readJson.GPSdata> glist = readJson.jlist; // 追記:ARテキストの描画 for (int i = 0; i < glist.size(); i++) { // データの読み込み readJson.GPSdata gdata = glist.get(i); String info = gdata.info; double y = gdata.latitude; double x = gdata.longitude; // ARテキストとの距離を求める double dx = (x - posx); double dy = (y - posy); //緯度・経度差を距離(m)に直す double yrad = Math.toRadians(y); double posyrad = Math.toRadians(posy); double dxrad = Math.toRadians(dx); float distance = (float)(RADIUS * Math.acos(Math.sin(yrad)* Math.sin(posyrad) + Math.cos(yrad) * Math.cos(posyrad) * Math.cos(dxrad))); // ARテキストと現在地のなす角を求めて正規化する double angle = Math.atan2(dy, dx); float degree = (float) Math.toDegrees(angle); degree = -degree + 90; if (degree < 0) degree = 360 + degree; // 端末の向きとARテキストとの角度の差を求める float sub = degree - direction; if (sub < -180.0) sub += 360; if (sub > 180.0) sub -= 360; // ARテキストが視野に存在すれば描画処理を行う if (Math.abs(sub) < (ANGLE / 2)) { // 距離によってARテキストのサイズを決める float textSize = 60 * (VIEW_LIMIT - distance) / VIEW_LIMIT; paint.setTextSize(textSize); // ARテキストの描画を描画する String infoDistance = info + " " + (int)distance + "m" ; float textWidth = paint.measureText(infoDistance); float diff = (sub / (ANGLE / 2)) / 2; float left = (displayX / 2 + displayX * diff) - (textWidth / 2); drawBalloonText(canvas, paint, infoDistance, left, 200); } } // コンパスを描画する drawCompass(canvas, paint); } private void drawBalloonText(Canvas canvas, Paint paint, String text, float left, float top) { // 文字列の幅を取得 float textWidth = paint.measureText(text); // フォント情報の取得 Paint.FontMetrics fontMetrics = paint.getFontMetrics(); // 文字列の20ポイント外側を囲む座標を求める float bLeft = left - 20; float bRight = left + textWidth + 20; float bTop = top + fontMetrics.ascent - 20; float bBottom = top + fontMetrics.descent + 20; // 吹き出しの描画 RectF rectF = new RectF(bLeft, bTop, bRight, bBottom); paint.setColor(Color.argb(100,0,255,0)); canvas.drawRoundRect(rectF, 50, 50, paint); // 三角形の描画 paint.setStyle(Paint.Style.FILL_AND_STROKE); Path path = new Path(); float center = left + textWidth / 2; float triangleSize = paint.getTextSize() / 2; path.moveTo(center, bBottom + triangleSize); path.lineTo(center - triangleSize , bBottom ); path.lineTo(center + triangleSize , bBottom ); path.lineTo(center, bBottom + triangleSize); canvas.drawPath(path, paint); // 文字列の描画 paint.setColor(Color.WHITE); canvas.drawText(text, left, top, paint); } // (2)コンパスの描画 private void drawCompass(Canvas canvas, Paint paint) { Path path = new Path(); path.moveTo(POS_COMPASSX, POS_COMPASSY - 40); path.lineTo(POS_COMPASSX + 20, POS_COMPASSY + 20); path.lineTo(POS_COMPASSX - 20, POS_COMPASSY + 20); path.moveTo(POS_COMPASSX, POS_COMPASSY - 40); paint.setColor(Color.RED); canvas.rotate(-direction, POS_COMPASSX, POS_COMPASSY); canvas.drawPath(path, paint); canvas.rotate(direction, POS_COMPASSX, POS_COMPASSY); } // (3)センサー値の取得と再描画 public void drawScreen(float preDirection,LatLng latlng) { // センサーの値から端末の向きを計算する direction = (preDirection + 450) % 360; // 座標情報の取得 if(latlng != null){ posy = (float) latlng.latitude; posx = (float) latlng.longitude; } // onDrawを呼び出して再描画 invalidate(); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hoshi-takanori

2022/01/20 14:50

その json ファイルはアプリに組み込んで配布するものでしょうか? あと、吹き出しが出ない件は、Logcat やデバッガなどを使って、何がどこまでできてるかを確認すると良いのでは。
adakatt12

2022/01/20 15:11

jsonファイルを組み込んで配布は行わないです。 アプリケーション内でファイルをダウンロードする機能があり、そのファイルの保存先が/data/data/[packagename]/files/なのでそこからダウンロードしたjsonファイルを使用したい、といった感じです。
hoshi-takanori

2022/01/20 15:25

Json クラス (名前が微妙だし、static ってことは内部クラスかな…) に main という名前のメソッド (main って名前はどうかと思います…) は呼ばれてますか? あと、インデントや中括弧の対応が微妙だし…。
adakatt12

2022/01/20 16:25

おっしゃる通りJsonクラスは内部クラスになっています。インデントと中括弧に関してはここに書き込む際に一括でコピーペーストすれば良かったのですが部分的にコピーペーストしてしまったのでおかしくなってしまっています。すみません。 加えてメソッドの件なのですが、メソッドが呼ばれているかを確認するにはどういった手順を踏めばいいのでしょうか?勉強不足で申し訳ありません、ご教授頂けたら幸いです。
jimbe

2022/01/20 17:55

クラス名やメソッド名は既存のものと被らない・勘違いされないように命名して頂けると助かります。 特に本件のようにクラス階層が分からず import も無くコードの一部のみのご提示では、どれが既存でどれが作成中のものかの区別が付きにくく、再現テストもし難くなります。
adakatt12

2022/01/21 00:42

ご指摘いただきありがとうございます。import文を含めたコード全体を掲載しました。ご覧いただけたら幸いです。
Wind

2022/01/21 01:08

カメラとかセンサーとか画像処理は今回の質問に不要なので、/data/data/[packagename]/files/sample.jsonを読むだけのシンプルなソースコードを作成してみてください。 どこに問題があるか、切り分ける必要があります。
hoshi-takanori

2022/01/21 01:43

Activity じゃなくて View の内部クラスだったんですね。そして、readJson というクラス名はむしろ悪化してますね…。 それはさておき、肝心の main メソッドが呼ばれてるかどうかは確認しましたか? また、その後の処理についても何が起きてるのかをひとつひとつ確認する必要があるでしょうね。
adakatt12

2022/01/21 05:33

mainメソッドは呼ばれていませんでした。 readJsonクラスを実行したところ下記のエラーが出ていました。gradleまわりのエラーのようです。 FAILURE: Build failed with an exception. * Where: Initialization script 'C:\Users\******\AppData\Local\Temp\readJson_main__.gradle' line: 21 * What went wrong: A problem occurred configuring project ':app'. > Could not create task ':app:readJson.main()'. > SourceSet with name 'main' not found. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
hoshi-takanori

2022/01/21 05:35

gradle から実行しようとしたんですか? Android アプリの中で呼び出すのではなく?
adakatt12

2022/01/21 08:24

すみません勘違いしていたようです。 今度はAndroidアプリの中から呼び出しました。 public static void main(String[] args) throws JSONException { この行の真下に Log.d("debug", "main start"); を入れてデバッグしたのですがlogcatには表示されていませんでした。 main メソッドが呼ばれていない、ということでしょうか?
hoshi-takanori

2022/01/21 08:53

そのメソッドを呼び出すためのコードを、どこにどのように書きましたか?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。