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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Android Studio

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

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

Q&A

解決済

1回答

1653閲覧

AndroidStudio4.1 エミュレータについて

fox8

総合スコア2

Android Studio

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

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

0グッド

0クリップ

投稿2020/11/19 12:57

実現したいこと

AndroidStudioを使用して現在位置の緯度と経度を画面に出力するアプリを作成しています。しかしビルド、実行ともに成功しているのですがエミュレータに実行結果が反映されません。
つまり、エミュレータが真っ白になります。画面上部のLTEなどの表記はでています。
参考書を見ながらやっているのですがうまくいきません。

参考書の実行結果

LocationEx>
緯度:xx.xxxxxxx
経度:yyy.yyyyyyy

###ソースコード

LocationEx

1{ 2 public final static String BR = System.getProperty("line.separator"); 3 private final static int WC = ViewGroup.LayoutParams.WRAP_CONTENT; 4 private final static String[] PERMISSIONS = { 5 Manifest.permission.ACCESS_COARSE_LOCATION, 6 Manifest.permission.ACCESS_FINE_LOCATION}; 7 private final static int REQUEST_PERMISSION = 1; 8 private TextView textView;//テキストビュー 9 private LocationManager manager; 10 11 @Override 12 public void onCreate(Bundle bundle){ 13 super.onCreate(bundle); 14 requestWindowFeature(Window.FEATURE_NO_TITLE); 15 16 //レイアウトの作成 17 LinearLayout layout = new LinearLayout(this); 18 layout.setBackgroundColor(Color.WHITE); 19 layout.setOrientation(LinearLayout.VERTICAL); 20 21 //テキストビューの生成 22 textView = new TextView(this); 23 textView.setText("LocationEx"); 24 textView.setTextSize(24); 25 textView.setTextColor(Color.BLACK); 26 textView.setLayoutParams(new LinearLayout.LayoutParams(WC,WC)); 27 28 //ロケーションマネージャーの取得 29 manager 30 =(LocationManager)getSystemService(Context.LOCATION_SERVICE); 31 32 //ユーザー利用許可のチェック 33 checkPermissions(); 34 35 } 36 37 //アクティビティ再開時に呼ばれる 38 @Override 39 public void onResume() { 40 super.onResume(); 41 42 //位置情報更新の開始 43 setLocationUpdateEnabled(true); 44 } 45 46 //アクティビティ一時停止時に呼ばれる 47 @Override 48 public void onPause() { 49 super.onPause(); 50 51 //位置情報更新の開始 52 setLocationUpdateEnabled(false); 53 } 54 55 //位置情報を通知する時に呼ばれる 56 public void onLocationChanged(Location location) { 57 //緯度と経度の取得 58 textView.setText(String.format("LocationEx>%s緯度:%s%s経度:%s", BR, location.getLatitude(), BR, location.getLongitude())); 59 } 60 61 //位置情報取得有効化を通知する時に呼ばれる 62 public void onProviderEnabled(String provider) { 63 } 64 65 //位置情報取得無効化を通知する時に呼ばれる 66 public void onProviderDisabled(String provider) { 67 } 68 69 //位置情報更新の開始・停止 70 private void setLocationUpdateEnabled(boolean enabled) { 71 //パーミッションのチェック 72 if (isGranted()) { 73 return; 74 } 75 76 //ロケーションマネージャの登録と解除 77 try { 78 if (enabled) { 79 manager.requestLocationUpdates( 80 LocationManager.NETWORK_PROVIDER, 0, 0, this); 81 } else { 82 manager.removeUpdates(this); 83 } 84 } catch (SecurityException e) { 85 e.printStackTrace(); 86 } 87 } 88 89 //ユーザーの利用許可のチェック 90 private void checkPermissions() { 91 //未許可 92 if(!isGranted()) { 93 //許可ダイアログの表示 94 ActivityCompat.requestPermissions(this, PERMISSIONS, 95 REQUEST_PERMISSION); 96 } 97 } 98 99 //ユーザーの利用許可が済かどうかの取得 100 private boolean isGranted() 101 { 102 for (String permission : PERMISSIONS) { 103 if (ContextCompat.checkSelfPermission(LocationEx.this, permission) != 104 PackageManager.PERMISSION_GRANTED) { 105 return false; 106 } 107 } 108 return true; 109 } 110 111 //許可ダイアログ選択時に呼ばれる 112 @Override 113 public void onRequestPermissionsResult(int requestCode, 114 String[] permissions, int[] results) { 115 if (requestCode == REQUEST_PERMISSION) { 116 //未許可 117 if (isGranted()) textView.setText(String.format("LocationEx>%s位置情報の取得が未許可です", BR)); 118 } else{ 119 super.onRequestPermissionsResult( 120 requestCode, permissions, results); 121 } 122 } 123}

AndroidManifest

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="net.npaka.locationex"> 4 5 6 <uses-permission android:name="android.permission.INTERNET"/> 7 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 8 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 9 10 <application 11 android:allowBackup="false" 12 android:icon="@mipmap/ic_launcher" 13 android:label="@string/app_name" 14 android:supportsRtl="false" 15 android:theme="@style/Theme.LocationEx" 16 android:fullBackupContent="@xml/backup_descriptor"> 17 18 <activity 19 android:label="@string/app_name" 20 android:name=".LocationEx"> 21 <intent-filter> 22 <action android:name="android.intent.action.MAIN" /> 23 <category android:name="android.intent.category.LAUNCHER" /> 24 </intent-filter> 25 </activity> 26 </application> 27 28</manifest>

補足

開発環境はAndroidStudio4.1、Windows10、Android Gradle Plugin Ver4.1.0、Gradle Ver6.5.1、エミュレーターはPixel 3a_API30_x86、使用言語はJavaです。その他質問などございましたらどうぞお聞きください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ミスが2点見受けられます。

まずレイアウトを作成している箇所ですが、LinearLayoutを作成して、その中にTextViewを配置してActivityに描画したいのでしょうが、ご提示のコードではLinearLayoutにTextViewが配置する処理と、そのLinearLayoutがActivityに描画する処理が抜けています。これでは何も表示されません。

java

1 //レイアウトの作成 2 LinearLayout layout = new LinearLayout(this); 3 layout.setBackgroundColor(Color.WHITE); 4 layout.setOrientation(LinearLayout.VERTICAL); 5 6 //テキストビューの生成 7 textView = new TextView(this); 8 textView.setText("LocationEx"); 9 textView.setTextSize(24); 10 textView.setTextColor(Color.BLACK); 11 textView.setLayoutParams(new LinearLayout.LayoutParams(WC,WC)); 12 13 layout.addView(textView); // LinearLayoutにTextViewを配置 14 setContentView(layout); // ActivityにLinearLayoutを描画 15

のように2行追加しましょう。

それから、

java

1 //位置情報更新の開始・停止 2 private void setLocationUpdateEnabled(boolean enabled) { 3 //パーミッションのチェック 4 if (isGranted()) { 5 return; 6 } 7

という処理が見られますが、これだと「権限を有していると即return」されてしまうように思います。それではその先にあるrequestLocationUpdates()に処理が進みませんから、測位が開始されません。逆ではありませんか?


それからもう一点、エミュレーターで動作を試みているのだとしたら、Extended controlsのLocationを使って緯度経度の情報を送ろうとしているのでしょうか。そうであるとしたら、requestLocationUpdates()で指定するプロバイダーをGPSに指定しなければonLocationChanged()は呼び出されないと思います。

java

1 manager.requestLocationUpdates( 2 LocationManager.GPS_PROVIDER, 0, 0, this);

のように、LocationManager.GPS_PROVIDERに設定する必要があるでしょう。

投稿2020/11/19 13:45

編集2020/11/19 13:51
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fox8

2020/11/19 14:34

ご指摘ありがとうございます。言われた通りに直して実行してみたのですがエミュレーター上には「LocationEx」としか表示されませんでした。 ほかに怪しいと思うところはあるでしょうか?
keicha_hrs

2020/11/19 15:06

setLocationUpdateEnabled()の冒頭は修正しましたか?ここを直せば、私の手元では緯度経度の情報が表示できています。
keicha_hrs

2020/11/19 16:02

onRequestPermissionsResult()で記述している「位置情報の取得が未許可です」という表示をするための判定も逆のような。isGranted()の戻り値がfalseのときに表示すべき文言ではありませんか?
fox8

2020/11/21 13:08

ありがとうございました。解決いたしました。 しかし、次は違う問題が起きたので新しく質問していますので、よろしければご回答のほどよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問