inflearn logo
강의

講義

知識共有

[初中級編] Androidデーティングアプリ作成(Android Kotlin)

私と異なる性別のユーザーを取得する

나와 다른 성별의 유저 불러오기 강의에서 에뮬레이터에서 앱이 켜졌다가 바로 꺼져요.

456

aksqhqkqh37186

投稿した質問数 17

0

강의 5:19까지 코드 입력완료하고, 오류코드도 식별되지 않는데,

에뮬레이터를 실행시키면 앱이 실행되고 -> 스플릿화면 -> 메인화면이 뜨자말자 앱이 꺼지네요.

 

에뮬레이터 화면 상에는 '앱이름' keeps stopping 문구가 뜨며 종료되네요.

 

어떤 문제일까요?...

 

android kotlin firebase

回答 11

0

aksqhqkqh37186

아............... 답답하네요 해결이 안 되니 ㅠ

0

aksqhqkqh37186

이제는 이렇게 오류코드가 발생합니다.

2024-05-03 23:10:07.067 10337-10337 AndroidRuntime com.example.somethingtalk E FATAL EXCEPTION: main

Process: com.example.somethingtalk, PID: 10337

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.somethingtalk.auth.UserDataModel

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)

at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:202)

at com.example.somethingtalk.MainActivity$getUserDataList$postListener$1.onDataChange(MainActivity.kt:152)

at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)

at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)

at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)

at android.os.Handler.handleCallback(Handler.java:958)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loopOnce(Looper.java:205)

at android.os.Looper.loop(Looper.java:294)

at android.app.ActivityThread.main(ActivityThread.java:8177)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)


 

0

aksqhqkqh37186

다음 강의로 넘어가서 그냥 진행하려 하는데도 앱이 계속 팅기네요.. ㅠㅠ 일부 다음 강의에서 쓰인 코드도 같이 작성되어 있습니다.

package com.example.somethingtalk

import android.content.Intent
import android.os.BatteryManager
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.bumptech.glide.Glide
import com.example.somethingtalk.auth.IntroActivity
import com.example.somethingtalk.auth.UserDataModel
import com.example.somethingtalk.setting.SettingActivity
import com.example.somethingtalk.slider.CardStackAdapter
import com.example.somethingtalk.utils.FirebaseAuthUtils
import com.example.somethingtalk.utils.FirebaseRef
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener
import com.google.firebase.storage.storage
import com.yuyakaido.android.cardstackview.CardStackLayoutManager
import com.yuyakaido.android.cardstackview.CardStackListener
import com.yuyakaido.android.cardstackview.CardStackView
import com.yuyakaido.android.cardstackview.Direction

class MainActivity : AppCompatActivity() {

    lateinit var cardStackAdapter: CardStackAdapter
    lateinit var manager: CardStackLayoutManager

    private val TAG = "MainActivity"

    private val usersDataList = mutableListOf<UserDataModel>()

    private var userCount = 0

    private lateinit var currentUserGender : String

    private val uid = FirebaseAuthUtils.getUid()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //나와 다른 성별 외 유저를 받아와야 하는데
        // 1. 일단 나의 성별을 알아야함
        // 2. 전체 유저 중 다른...

        var setting = findViewById<ImageView>(R.id.settingIcon)
        setting.setOnClickListener {

            val intent = Intent(this, SettingActivity::class.java)
            startActivity(intent)

        }

        var cardStackView = findViewById<CardStackView>(R.id.cardStackView)
        //카드스택뷰 화면 넘기는 기능
        manager = CardStackLayoutManager(baseContext, object : CardStackListener {
            override fun onCardDragging(direction: Direction?, ratio: Float) {
            }

            override fun onCardSwiped(direction: Direction?) {

                //카드스택뷰 오른쪽으로 화면 넘길때
                if(direction == Direction.Right) {
                    //right라는 메세지를 보내라
                     Toast.makeText(this@MainActivity,"right", Toast.LENGTH_SHORT).show()
                    Log.d(TAG, usersDataList[userCount].uid.toString())
                }

                //카드스택뷰 왼쪽으로 화면 넘길때
                if(direction == Direction.Right) {
                    //left라는 메세지를 보내라
                    Toast.makeText(this@MainActivity, "left", Toast.LENGTH_SHORT).show()

                }

                userCount = userCount + 1

                if(userCount == usersDataList.count()) {
                    getUserDataList(currentUserGender)
                    Toast.makeText(this@MainActivity, "새로운 유저를 받아옵니다.", Toast.LENGTH_LONG).show()
                }

            }

            override fun onCardRewound() {
            }

            override fun onCardCanceled() {
            }

            override fun onCardAppeared(view: View?, position: Int) {
            }

            override fun onCardDisappeared(view: View?, position: Int) {
            }

        })

        cardStackAdapter = CardStackAdapter(baseContext, usersDataList)
        cardStackView.layoutManager = manager
        cardStackView.adapter = cardStackAdapter

//        getUserDataList ()
        getMyUserData()

    }

    private fun getMyUserData(){

        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                Log.d(TAG, dataSnapshot.toString())
                val data = dataSnapshot.getValue(UserDataModel::class.java)
                // 파이어 베이스에서 제공하는 코드 구성 내에 gender를 추가해서 내 성별을 찾는 코드
                Log.d(TAG, data?.gender.toString())

                currentUserGender = data?.gender.toString()

                getUserDataList(currentUserGender)


            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)

    }

    //카드스택뷰 화면에서 유저 데이터를 가져오는 코드
    private fun getUserDataList(currentUserGender : String){

        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                for (dataModel in dataSnapshot.children) {

                    //데이터를 가지고 오는데 유저 데이터 모델의 형태로 받겠다.
                    val user = dataModel.getValue(UserDataModel::class.java)

                    if(user!!.gender.toString().equals(currentUserGender)) {

                    } else {

                        usersDataList.add(user!!)

                    }


                }

                cardStackAdapter.notifyDataSetChanged()


            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)


    }

    //유저의 좋아요를 표시하는 부분
    // 데이터에서 값을 저장해야하는데, 어떤 값을 저장할까..?
    // 나의 uid와 내가 좋아요 한 유저의 uid 값
    private fun userLikeOtherUser(myUid : String, otherUid : String){


    }

}


0

aksqhqkqh37186

 getMyUserData()

}

private fun getMyUserData(){

    val postListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {

            Log.d(TAG, dataSnapshot.toString())
            val data = dataSnapshot.getValue(UserDataModel::class.java)

            Log.d(TAG, data?.gender.toString())

            currentUserGender = data?.gender.toString()

            getUserDataList(currentUserGender)


        }

        override fun onCancelled(databaseError: DatabaseError) {
            // Getting Post failed, log a message
            Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
        }
    }
    FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)

}

챗 gpt에 물어보니 위 명령어 코드에서 getMyUserData 명령어 코드에 문제가 있다고 하는거 같아요.

"AppSearch에서 데이터를 가져오는 도중에 발생한 것으로 보입니다."라고 하는데 무슨말인지 모르곘어요

 

0

bokchi

안녕하세요
질문을 여러개 넣어주셨는데 아래의 부분을 순서대로 공유해주시겠어요?

1. 강의 어느부분을 수강중이신가요?
2. 어디까진 잘 되었는데 언제부터 안되시나요?
3. 에러 로그가 어떻게 나오나요? 콘솔창 전체가 아니라 빨간색으로 표시된 부분을 스크린샷으로 공유해주세요.

  1. 전체 코드를 실행해볼 수 있게 깃허브 / 구글 드라이브 등으로 공유해주세요.

0

aksqhqkqh37186

Failed to fetch suggestions from AppSearch, fallback to AGA

java.util.concurrent.CompletionException: java.util.NoSuchElementException: No value present

at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:308)

at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:323)

at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:684)

at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:486)

at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2138)

at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:59)

at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129)

at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1)

at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13)

at android.os.Handler.handleCallback(Handler.java:958)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loopOnce(Looper.java:205)

at android.os.Looper.loop(Looper.java:294)

at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by: java.util.NoSuchElementException: No value present

at java.util.Optional.get(Optional.java:144)

at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:16)

at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129

at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1

at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13) 

at android.os.Handler.handleCallback(Handler.java:958

at android.os.Handler.dispatchMessage(Handler.java:99

at android.os.Looper.loopOnce(Looper.java:205

at android.os.Looper.loop(Looper.java:294

at android.os.HandlerThread.run(HandlerThread.java:67

 

0

aksqhqkqh37186

FATAL EXCEPTION: main

Process: com.example.somethingtalk, PID: 10969

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.somethingtalk.auth.UserDataModel

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)

at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:202)

at com.example.somethingtalk.MainActivity$getUserDataList$postListener$1.onDataChange(MainActivity.kt:149)

at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)

at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)

at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)

at android.os.Handler.handleCallback(Handler.java:958)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loopOnce(Looper.java:205)

at android.os.Looper.loop(Looper.java:294)

at android.app.ActivityThread.main(ActivityThread.java:8177)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)

 

로그캣 오류? 문구입니다.

0

aksqhqkqh37186

package com.example.somethingtalk

import android.content.Intent
import android.os.BatteryManager
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.bumptech.glide.Glide
import com.example.somethingtalk.auth.IntroActivity
import com.example.somethingtalk.auth.UserDataModel
import com.example.somethingtalk.setting.SettingActivity
import com.example.somethingtalk.slider.CardStackAdapter
import com.example.somethingtalk.utils.FirebaseAuthUtils
import com.example.somethingtalk.utils.FirebaseRef
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener
import com.google.firebase.storage.storage
import com.yuyakaido.android.cardstackview.CardStackLayoutManager
import com.yuyakaido.android.cardstackview.CardStackListener
import com.yuyakaido.android.cardstackview.CardStackView
import com.yuyakaido.android.cardstackview.Direction

class MainActivity : AppCompatActivity() {

    lateinit var cardStackAdapter: CardStackAdapter
    lateinit var manager: CardStackLayoutManager

    private val TAG = "MainActivity"

    private val usersDataList = mutableListOf<UserDataModel>()

    private var userCount = 0

    private lateinit var currentUserGender : String

    private val uid = FirebaseAuthUtils.getUid()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //나와 다른 성별 외 유저를 받아와야 하는데
        // 1. 일단 나의 성별을 알아야함
        // 2. 전체 유저 중 다른...

        var setting = findViewById<ImageView>(R.id.settingIcon)
        setting.setOnClickListener {

            val intent = Intent(this, SettingActivity::class.java)
            startActivity(intent)

        }

        var cardStackView = findViewById<CardStackView>(R.id.cardStackView)
        //카드스택뷰 화면 넘기는 기능
        manager = CardStackLayoutManager(baseContext, object : CardStackListener {
            override fun onCardDragging(direction: Direction?, ratio: Float) {
            }

            override fun onCardSwiped(direction: Direction?) {

                //카드스택뷰 오른쪽으로 화면 넘길때
                if(direction == Direction.Right) {
                     Toast.makeText(this@MainActivity,"right", Toast.LENGTH_SHORT).show()
                }

                //카드스택뷰 왼쪽으로 화면 넘길때
                if(direction == Direction.Right) {
                    Toast.makeText(this@MainActivity, "left", Toast.LENGTH_SHORT).show()

                }

                userCount = userCount + 1

                if(userCount == usersDataList.count()) {
                    getUserDataList(currentUserGender)
                    Toast.makeText(this@MainActivity, "새로운 유저를 받아옵니다.", Toast.LENGTH_LONG).show()
                }

            }

            override fun onCardRewound() {
            }

            override fun onCardCanceled() {
            }

            override fun onCardAppeared(view: View?, position: Int) {
            }

            override fun onCardDisappeared(view: View?, position: Int) {
            }

        })

        cardStackAdapter = CardStackAdapter(baseContext, usersDataList)
        cardStackView.layoutManager = manager
        cardStackView.adapter = cardStackAdapter

//        getUserDataList()
        getMyUserData()

    }

    private fun getMyUserData(){

        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                Log.d(TAG, dataSnapshot.toString())
                val data = dataSnapshot.getValue(UserDataModel::class.java)

                Log.d(TAG, data?.gender.toString())

                currentUserGender = data?.gender.toString()

                getUserDataList(currentUserGender)

            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)


    }

    //카드스택뷰 화면에서 유저 데이터를 가져오는 코드
    private fun getUserDataList(currentUserGender : String){

        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                for (dataModel in dataSnapshot.children) {

                    //데이터를 가지고 오는데 유저 데이터 모델의 형태로 받겠다.
                    val user = dataModel.getValue(UserDataModel::class.java)

                    if(user!!.gender.toString().equals(currentUserGender)) {

                    } else {

                        usersDataList.add(user!!)

                    }


                }

                cardStackAdapter.notifyDataSetChanged()


            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)


    }
}

 최종 코드입니다.

0

aksqhqkqh37186

다시 코드를 전체적으로 작성해서 했는데... 다시 팅기네요

0

aksqhqkqh37186

강의를 다시보면서 1번 해당사항인 앱 코드를 다시 수정했습니다.

1:13경에 마이 페이지 액티비티에서 복사해온

위 명령어코드를 메인 액티비티에 다시 입력해서 강의와 같이 수정을 하니 다행히 아래처럼 에뮬레이터는 실행이 되고 최초에 오류가 났던 keeps stopping 문구 뜨는 오류처럼 팅기진 않네요. 근데 사진이 안 뜨는 것 같아요.

0

aksqhqkqh37186

1번은 강의 5번 돌려가면서 했는데 차이점을 찾지 못했습니다. ㅠㅠ

2번 내요은 이번 강의에서 매니패스트 손댄게 없는데, 액티비티가 제대로 선언됐는지 어떻게 확인하나요?...

3번은 우선 최종적으로 안되면 재설치해보겠습니다.

4번은 로그 확인 하는 방법을 몰라서 어떤 부분에서 문제가 발생했는지 모르겠습니다. ㅠㅠ

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.
님의 질문에 답변드립니다.

앱이 바로 꺼지는 이유는 여러 가지가 있을 수 있습니다. 에러 메시지인 ‘앱이름’ keeps stopping은 일반적으로 앱이 예상치 못한 이유로 종료되었음을 나타냅니다. 가장 흔한 문제 중 몇 가지를 짚어보겠습니다.

  1. 앱의 코드에 런타임 에러가 발생했을 수 있습니다.: 강의 내용을 따라했음에도 불구하고 누락된 코드가 없는지, 타이핑 실수는 없는지 확인해보세요.
  2. AndroidManifest.xml 설정 문제: Android 앱의 실행과 관련된 중요 설정이 포함되어 있는 파일입니다. 액티비티가 제대로 선언되었는지 확인하세요.
  3. 에뮬레이터 문제: 때때로 에뮬레이터 자체의 문제로 앱이 제대로 실행되지 않을 수 있습니다. 에뮬레이터를 다시 시작하거나 새로운 에뮬레이터 인스턴스를 생성해 보세요.
  4. 로그 확인: Android Studio의 Logcat을 확인하여 앱이 종료되는 정확한 시점과 그 원인에 대한 로그를 찾아보세요. 이 로그는 앱이 충돌하는 원인을 찾는 데 매우 유용합니다.

위의 방법으로도 문제를 해결하지 못한다면, 코드 일부를 점검해보거나 관련 커뮤니티에 자세한 에러 로그와 함께 질문을 올리시는 것을 추천드립니다. 추가적으로 Kotlin과 관련된 자료를 찾아보시려면 Kotlin 공식 문서Spring Boot와 Kotlin을 활용한 프로젝트 등의 리소스를 활용하시는 것도 도움이 될 것입니다.

CardStackView 라이브러리 추가에 실패합니다.

0

98

1

CardStackView

0

124

2

CardStackView 오류 정상적으로 구현이 되지 않습니다.

0

198

3

최신화 된 강의 요청합니다

0

158

2

auth.currentUser?.uid.toString() 가 null 이 나와요

0

193

1

혹시.. 지금 최신 환경 상, 강의 내용대로 진행이 안 되는 걸까요?

0

240

1

현시점에서 알려주신 방법대로 서버키를 받는것이 안되는것같습니다

0

260

2

3강 firebase 쓰기가 동작하질않아요

0

183

1

강사님 실시간으로 혹시 문의하는 방법은 없을까요??

0

185

1

해당 강의 들으시는 분들 중에 교육관련해서 서로 얘기 나누실 분 있으신가요??

0

156

1

강사님 FCM 단계 진행하면서 오류들이 너무 많이 발생합니다...

0

206

1

FCM 토큰 문의

0

214

1

강사님 FCM 단계에서 전체적으로 앱 문제가 발생해서 혹시 원격으로 조치 해주실 수 있나요?

0

231

1

토큰 정보 유저정보에 저장하기 강의 4분 12초 코드를 동일하게 입력했는데 적용이 잘 안되는 것 같아요.

0

395

3

토큰 받아와서 메세지 보내기 강의 2분 20초 로그캣 확인 하는 창이 다르고 토큰 값이 안떠요.

0

221

1

FCM 강의, firebaseservice 클래스 내 오류코드 해결방안이 궁금합니다.

0

272

2

FCM 강의 중간부터 코드 오류가 발생했는지 앱에서 회원가입을 해도 파이어베이스 Authentication에는 회원등록이 해도 화면이 넘어가지 않고 데이터도 저장이 안 되네요.

0

294

3

섹션 1 CardStackView의 Implement members 질문있습니다.

0

227

1

수업자료 다운로드 후 알집풀기에서 오류가 발생합니다.

0

461

3

Retrofit 사용해보기 강의 2:20 쯤에 작성된 복사된 코드는 어디서 받나요?

0

234

2

강의 FCM 소개 1:56에 디펜던시 추가하는게 최신버전으로 바뀐 듯합니다.

0

274

1

매칭이 되면 알람 띄우기 강의에서 오류문구 해결방안이 궁금합니다.

0

354

3

소스코드 다운이 불가능합니다..

0

142

1

이미지 저장하기 강의에서 회원가입 후 이미지가 파이어 베이스에 저장되지 않습니다.

0

213

2