こちらの記事を参考に、Kotlinでアプリに速度計測の機能を追加したのですが(運転中にアプリの操作をブロックする機能のためです。)、アクティビティ開始時から速度を取得するまでに約3分もかかってしまっています。
コードは以下のようになっています。
Kotlin
1 2class MainActivity : AppCompatActivity(), LocationListener { 3 4 private var locationManager: LocationManager? = null 5 private var speed: Float = 0f 6 private var alert: AlertDialog? = null 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 setContentView(R.layout.activity_main) 11 locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager 12 } 13 14 override fun onLocationChanged(location: Location) { 15 16 if (location.hasSpeed()) { 17 speed = location.speed * 3.6f 18 if(speed >= 30f) { 19 if(alert == null) { 20 speedDialog(speed) 21 } 22 }else{ 23 alert?.dismiss() 24 alert = null 25 } 26 }else{ 27 speed = 0f 28 } 29 30 val text = "現在のスピード: ${speed} km/h" 31 println(text) 32 Toast.makeText(applicationContext, text, Toast.LENGTH_SHORT).show() 33 } 34 35 override fun onProviderDisabled(provider: String?) {} 36 override fun onProviderEnabled(provider: String?) {} 37 override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {} 38 39 private fun speedDialog(km: Float) { 40 val msg = "現在の速度: 時速 ${km} km\n" + 41 "運転中は画面を操作できません。\n" + 42 "画面を操作したいときは、OKを選択してください。" 43 alert = AlertDialog.Builder(this) 44 .setTitle("速度検知") 45 .setMessage(msg) 46 .setPositiveButton("OK") { dialog, _ -> 47 dialog.dismiss() 48 alert = null 49 } 50 .setNegativeButton("次回から表示しない") { dialog, _ -> 51 dialog.dismiss() 52 } 53 .show() 54 } 55 56 override fun onStart() { 57 super.onStart() 58 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 59 != PackageManager.PERMISSION_GRANTED 60 && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) 61 != PackageManager.PERMISSION_GRANTED) { 62 ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 0) 63 ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), 0) 64 } 65 locationManager!!.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0f, this) 66 } 67 68 override fun onPause() { 69 super.onPause() 70 locationManager?.removeUpdates(this) 71 } 72 73 74}
5秒間隔で現在速度を表示した確認用のトーストが画面に出力されるようになっているのですが、
このトーストを、アクティビティ開始時すぐに表示されるようになってほしいです。
ちなみに遅れて表示されるのは実機のみで、エミュレーターではアクティビティ開始時にすぐに表示されました。
何故表示までに三分もの遅れが出てくるのか。
すぐにスピードメーターを使えるようにするにはどうすればよいのか。
どなたか知見をお持ちの方がいらっしゃいましたら、ご教示頂けると幸いです。
宜しくお願い致します。
開発環境
Windows 10
Android Studio 4.0
Kotlin プラグインバージョン 1.3.72
テスト実機のAPIレベル 28
あなたの回答
tips
プレビュー