tvLocationTitle이 Null이에요 ㅠ
626
投稿した質問数 8
어떤 부분이 문제인지 혼자 머리 싸매고 고민해봐도 영 답이 없네요 ㅠ
밑에는 Logcat(location), LocationProvider,MainActivity 코드 내용 입니다!
2023-07-09 00:55:07.703 8921-8921 m.dk.airQualit com.dk.airQuality W DexFile /data/data/com.dk.airQuality/code_cache/.studio/instruments-234ebcbd.jar is in boot class path but is not in a known location
2023-07-09 00:55:07.725 8921-8921 m.dk.airQualit com.dk.airQuality W Accessing hidden method Landroid/app/LoadedApk$ReceiverDispatcher;->setUnregisterLocation(Ljava/lang/RuntimeException;)V (greylist-max-o, linking, denied)
2023-07-09 00:55:07.725 8921-8921 m.dk.airQualit com.dk.airQuality W Accessing hidden method Landroid/app/LoadedApk$ReceiverDispatcher;->getUnregisterLocation()Ljava/lang/RuntimeException; (greylist-max-o, linking, denied)
2023-07-09 00:55:07.725 8921-8921 m.dk.airQualit com.dk.airQuality W Accessing hidden method Landroid/app/LoadedApk$ServiceDispatcher;->getUnbindLocation()Ljava/lang/RuntimeException; (greylist-max-o, linking, denied)
2023-07-09 00:55:22.314 8996-8996 m.dk.airQualit com.dk.airQuality W DexFile /data/data/com.dk.airQuality/code_cache/.studio/instruments-234ebcbd.jar is in boot class path but is not in a known location
2023-07-09 00:55:22.341 8996-8996 m.dk.airQualit com.dk.airQuality W Accessing hidden method Landroid/app/LoadedApk$ReceiverDispatcher;->setUnregisterLocation(Ljava/lang/RuntimeException;)V (greylist-max-o, linking, denied)
2023-07-09 00:55:22.341 8996-8996 m.dk.airQualit com.dk.airQuality W Accessing hidden method Landroid/app/LoadedApk$ReceiverDispatcher;->getUnregisterLocation()Ljava/lang/RuntimeException; (greylist-max-o, linking, denied)
回答 3
0
실제로 특정단말(?) 저는 VM사용 안하였고 실제 단말로 개발중인데, 정말 null이 맞는것 같습니다.
아래는 디버깅모드에서 address를 확인해봤습니다.
저는 subLocality를 사용했습니다.
수고하세요.

0
안녕하세요, kbs님~ ^^
혹시 null 이 뜰 때 Toast 문구는 뭐라고 나오나요?
그리고 현재 if 문을 많이 써서 어디서 Null 이 Return 이 되는지를 정확히 알면 에러를 고치는 데에 도움이 될 것 같습니다. Log.d("Debug","여기 1"), Log.d("Debug","여기 2") 이런 식으로 분기마다 로그를 찍어서 어디서 null 이 반환되는지 알려주세요. 같이 에러를 해결해봐요~ㅎㅎ
감사합니다!
0
안녕하세요, 인프런 AI 인턴이에요. tvLocationTitle이 null인 문제를 알려주셨는데요, 로그캣에 있는 내용만으로는 정확한 원인을 파악하기 어렵습니다. 따라서, 코드 내용을 확인해야 정확한 도움을 드릴 수 있을 것 같아요. 코드 내용을 공유해주실 수 있을까요? 로그캣 이외에도 코드 부분을 확인하여 도움을 드리도록 하겠습니다. 감사합니다~
0
MainActivity,locationProvider 코드입니다.
class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding
lateinit var locationProvider : LocationProvider
private val PERMISSON_REQUEST_CODE = 100
val REQUIRED_PERMISSONS = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
lateinit var getGPSPermissionLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
checkAllPermissions()
updateUI()
}
private fun updateUI(){
locationProvider = LocationProvider(this@MainActivity)
val latitude: Double? = locationProvider.getLocationLatitude()
val longitude: Double? = locationProvider.getLocationLongitude()
if (latitude != null && longitude != null) {
val address = getCurrentAddress(latitude, longitude)
address?.let{
binding.tvLocationTitle.text = "${it.thoroughfare}" //현재 위치
binding.tvLocationSubtitle.text = "${it.countryName} ${it.adminArea}"//나라이름
}
} else {
Toast.makeText(this, "위도, 경도를 가져올수 없습니다", Toast.LENGTH_LONG).show()
}
}
private fun getCurrentAddress (latitude : Double, longitude : Double) : Address?{
val geoCoder = Geocoder(this, Locale.KOREA)
val addresses : List<Address>
addresses = try {
geoCoder.getFromLocation(latitude, longitude, 7)
} catch (ioException: IOException) {
Toast.makeText(this, "지오코더 서비스를 이용할수 없습니다.", Toast.LENGTH_LONG).show()
return null
} catch (illegalArgumentException: java.lang.IllegalArgumentException) {
Toast.makeText(this, "잘못된 위도, 경도 입니다.", Toast.LENGTH_LONG).show()
return null
}
if(addresses == null || addresses.size == 0){
Toast.makeText(this, "주소가 발견되지 않았습니다.", Toast.LENGTH_LONG).show()
return null
}
return addresses[0]
}
private fun checkAllPermissions() {
if(!isLocationServicesAvailable()){
showDialogForLocationServicesSetting()
}else{
isRunTimePermissionsGranted()
}
}
private fun isLocationServicesAvailable(): Boolean {
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
return (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
}
private fun isRunTimePermissionsGranted() {
val hasFineLocationPermission = ContextCompat.checkSelfPermission(
this@MainActivity,
Manifest.permission.ACCESS_FINE_LOCATION
)
val hasCoarseLocationPermission = ContextCompat.checkSelfPermission(
this@MainActivity,
Manifest.permission.ACCESS_COARSE_LOCATION
)
if (hasFineLocationPermission != PackageManager.PERMISSION_GRANTED || hasCoarseLocationPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this@MainActivity,
REQUIRED_PERMISSONS,
PERMISSON_REQUEST_CODE
)
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode === PERMISSON_REQUEST_CODE && grantResults.size == REQUIRED_PERMISSONS.size) {
var checkResult = true
for (result in grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
checkResult = false
break;
}
}
if (checkResult) {
updateUI()
}else {
Toast.makeText(this@MainActivity,"퍼미션이 거부되었습니다. 앱을 다시 실행하여 퍼미션을 허용하십시오", Toast.LENGTH_LONG).show()
finish()
}
}
}
private fun showDialogForLocationServicesSetting() {
getGPSPermissionLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
){
result ->
if (result.resultCode == Activity.RESULT_OK) {
if (isLocationServicesAvailable()) {
isRunTimePermissionsGranted()
}else{
Toast.makeText(this@MainActivity,"위치 서비스를 사용할 수 없습니다.", Toast.LENGTH_LONG).show()
finish()
}
}
}
val builder: AlertDialog.Builder = AlertDialog.Builder(this@MainActivity)
builder.setTitle("위치 서비스 비활성화")
builder.setMessage("위치 서비스가 꺼져있습니다. 설정해야 앱을 사용할 수 있습니다.")
builder.setCancelable(true)
builder.setPositiveButton("설정", DialogInterface.OnClickListener{
dialogInterface, i -> val callGPSSettingIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
getGPSPermissionLauncher.launch(callGPSSettingIntent)
})
builder.setNegativeButton("취소", DialogInterface.OnClickListener{
dialogInterface, i -> dialogInterface.cancel()
Toast.makeText(this@MainActivity,"위치 서비스를 사용할 수 없습니다.", Toast.LENGTH_LONG).show()
finish()
})
builder.create().show()
}
}
class LocationProvider(val context: Context) {
private var location: Location? = null
private var locationManager: LocationManager? = null
init{
getLocation()
}
private fun getLocation() : Location?{
try {
locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
var gpsLocation: Location? = null
var networkLocation: Location? = null
var isGPSEnabled = locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER)
var isNetworkEnabled = locationManager!!.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
if (!isGPSEnabled && !isNetworkEnabled) {
return null
}else{
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
return null
}
if (isNetworkEnabled) {
networkLocation = locationManager?.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
}
if (isGPSEnabled) {
gpsLocation = locationManager?.getLastKnownLocation(LocationManager.GPS_PROVIDER)
}
if (gpsLocation != null && networkLocation != null) {
if (gpsLocation.accuracy > networkLocation.accuracy) {
location = gpsLocation
}else{
// location = networkLocation
location = gpsLocation
}
}else{
if (gpsLocation != null) {
location = gpsLocation
}
if (networkLocation != null) {
location = networkLocation
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return location
}
fun getLocationLatitude(): Double? {
return location?.latitude
}
fun getLocationLongitude(): Double? {
return location?.longitude
}
}
안드로이드스튜디오 버전이 어떻게 되는지요?
0
106
1
스크래치 파일 Run 안되는 오류 발생
0
134
1
Git에서 다운받은 폴더가 안열리는 분들
0
136
1
TodoDao Interface 문의
0
78
1
kotlin 버전과 ksp 버전 꼭 맞추셔야 해요!!
0
446
1
아름다운 joyce님께.. runonuithread 문의
0
139
0
viewBinding 관련 질문입니다.
0
206
3
0:30초 질문입니다.
0
179
1
Locationmanager로 타입캐스팅 실패 문의
0
140
1
Todo리스트 dao 구성 시 todo 질문
0
140
1
룸 데이터베이스 구성 시 dao 에러 문의
0
170
1
버튼모양 질문 소스코드 첨부
0
146
1
레이아웃 구성할떄 저는 버튼모양이 원으로 나와요
0
169
1
싱글톤 패턴 구현중 코드가 강의와 일치하지 않습니다.
0
156
1
MainActivity 파일안에 setContencView가 없습니다..
0
201
1
room database 설치 질문
0
174
1
kts로 공부하는 학생도 있는데 갑자기 설명도 없이 kt로 설명하면..
0
313
3
mutable과 var의 차이점
0
201
1
안드로이드 스튜디오 스크래치 파일
0
277
1
추가링크는 어디에 있을까요?
0
285
1
대시보드 설정 마지막 단계 Google Play에 앱 게시
0
675
2
geoCoder.getFromLocation 에러
0
552
2
apirequest.io 로딩 현상 & 사이트 이상함
0
449
1
PrimaryKey를 Nullable하게 만드는 이유
0
267
1

