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

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

ただいまの
回答率

88.78%

Activityからデータを移動させてGoogleMapAPIを起動させたいです。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 470

NiinaDjm

score 12

前提・実現したいこと

windows Android studioです。javaです。開発超ド級初心者です。
経度と緯度を入力したら、指定した場所でグーグルの地図が出てくるアプリを作っています。
GoogleMapAPIを利用したいため、画面構成は以下の三つと考えています。
1.入力画面
2.入力された数字の確認画面
3.入力された経度と緯度のGoogleMapのアクティビティ

3で詰まってしまいました。
GoogleMapが開かずに、強制終了してしまいます。
入力データの移動がうまくいってないのかと思い、データを媒介せずにGoogleMapを開こうとすると、最初の画面に戻ってしまいます。

しかし、errorメッセージの見方も今一つ分からず、困ってしまいました。
質問の仕方や文章も読みづらく分かりにくいとは思うのですが、なにか解決につながるアドバイスを頂けたらと思います。

発生している問題・エラーメッセージ

このエラーメッセージは一部ですが、こうなります。

  at java.lang.Integer.parseInt(Integer.java:627)
        at java.lang.Integer.parseInt(Integer.java:650)
        at com.example.googlemap2.ResultPage.onClickMap(ResultPage.java:42)
        at java.lang.reflect.Method.invoke(Native Method) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
        at android.view.View.performClick(View.java:6597) 
        at android.view.View.performClickInternal(View.java:6574) 
        at android.view.View.access$3100(View.java:778) 
        at android.view.View$PerformClick.run(View.java:25885) 
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

MapsActivityのコードです。

package com.example.googlemap2;

import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        Intent intent = getIntent();
        double keido = (double) intent.getIntExtra("mkeido", (int) -34);
        double ido = (double) intent.getIntExtra("mrido", (int) 151);
        // Add a marker in Sydney and move the camera
        LatLng place = new LatLng(keido,ido );
        mMap.addMarker(new MarkerOptions().position(place).title("Marker in Your Place"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(place));
    }

入力画面のActivityです。

package com.example.googlemap2;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import static android.provider.AlarmClock.EXTRA_MESSAGE;


public class MainActivity extends AppCompatActivity {

    private EditText keido;
    private EditText ido;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //経度と緯度のビュー変数を初期化する
        keido =findViewById(R.id.editText1);
        ido =  findViewById(R.id.editText3);


        Log.d("MainActivity","");
    }
    public void StartButton(View view){
        //startボタンが押された時の処理
        Intent intent = new Intent(this,ResultPage.class);

        String eKeido = keido.getText().toString();
        String eido = ido.getText().toString();
        intent.putExtra("keido",eKeido);
        intent.putExtra("ido",eido);
        startActivity(intent);

    }
}

入力数字の確認画面のActivityです。

package com.example.googlemap2;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import static android.provider.AlarmClock.EXTRA_MESSAGE;

public class ResultPage extends AppCompatActivity {
    String rkeido;
    String rido;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result_page);
        Intent intent = this.getIntent();

        rkeido =intent.getStringExtra("keido");
        rido = intent.getStringExtra("ido");
        TextView keidoView = findViewById(R.id.result1);
        TextView idoView = findViewById(R.id.result2);
        keidoView.setText(rkeido);
        idoView.setText(rido);
        Log.d("Result_keido:", String.valueOf(rkeido));
        Log.d("Result_ido:",String.valueOf(rido));

    }
    public void onClickMap(View view){
//APIを利用しないで地図を表示させる試み→変数に直した途端行き詰まり断念
//        double atai =Integer.parseInt(rkeido);
//        double atai2 =Integer.parseInt(rido);
//        Log.d("Result_atai:", String.valueOf(atai));
//        Log.d("Result_atai2:",String.valueOf(atai2));
//
//        Uri uri = Uri.parse("geo:"+atai+","+atai2+"?z=16");
//        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
//        startActivity(intent);

        Intent intent = new Intent(this,MapsActivity.class);
        double mkeido = Integer.parseInt(rkeido);
        double mido = Integer.parseInt(rido);
        Log.d("Result_mkeido:", String.valueOf(mkeido));
        Log.d("Result_mido:",String.valueOf(mido));

        intent.putExtra("mkeido",mkeido);
        intent.putExtra("mido",mido);
        startActivity(intent);

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

先輩に助けていただき、なんとか解決しました。
doubleの変換もそうですが、型が諸々あっていませんでした。
まずはそこを直します。

型をDoubleにあわせる

//public class ResultPage extends AppCompatActivity
//省略
public void onClickMap(View view){
//以下の部分をintからDoubleにしました。
double mkeido = Double.parseDouble(rkeido);
double mido = Double.parseDouble(rido);
intent.putExtra("mkeido",mkeido);
intent.putExtra("mido",mido);
startActivity(intent);
//省略
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

//省略
 public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        Intent intent = getIntent();
//以下の部分をintExtraからDouboleExtraにしました。
   double keido =intent.getDoubleExtra("mkeido", (int) -34);
   double ido = intent.getDoubleExtra("mrido", (int) 151);

次にAPIKeyをもう一度取得して設定します。

ここは省略します。

最後に文字列の値がゼロの時にデフォルト値を入れる設定を足します。

public class ResultPage extends AppCompatActivity {
//省略

rkeido =intent.getStringExtra("keido");
        if (rkeido.isEmpty())
        {
            rkeido ="-34";
        }
        rido = intent.getStringExtra("ido");
        if (rido.isEmpty()){
            rido="151";
        }


これで画面遷移も無事に通り、かつGoogleMapAPIも落ちずに起動いたしました。
原因としては、おそらく3点です。
1.型がバラバラキャストミス
2.APIKey取得ミス
3.空文字列の時にデフォルト値を入れるコードの抜け

ご回答いただいた方、見てくださった方、どうもありがとうございました。
そして初歩的なミスがたくさんで申し訳ありません。
今後に活かして頑張ります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

        double mkeido = Integer.parseInt(rkeido);
        double mido = Integer.parseInt(rido);

この2行、double型の変数に値を入れたいのに、Integer.parseInt()を用いているのはおかしくないですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/30 09:34

    回答ありがとうございます。

    MapsActivityの以下の部分の、デフォルトで入らせたい数字をイントにしたまま、ご指摘いただいた部分をイントにしてしまっていました。

    double keido = (double) intent.getIntExtra("mkeido", (int) -34); double ido = (double) intent.getIntExtra("mrido", (int) 151);

    早速どちらもダブル型にして、型を合わせました。
    結果、いまだGoogleMapが開かず、最初の画面に戻ってしまいます(´;ω;`)
    ご指摘ありがとうございました。

    今度はAPIが正しく起動するかのテストの方法を探して試してみます。

    キャンセル

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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