페이지

[파이어베이스] DataSnapshot 의 구조 가져오기


파이어베이스 에서 데이터베이스를 불러올경우,
구조에 추가된 데이터를 뽑아낼 때, 순차적으로 DataSnapshot 을 내려가면서 불러올수 있다.

단, 하위 구조의 데이터가 추가되는 것을 인식하지 못하며
하위구조 변경에 따른 데이터를 출력시 다시한번 전체를 불러오게 된다



  @Override
 public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
         Log.i("ALARM_onChildChanged", "main:" + dataSnapshot.getKey());
                for (DataSnapshot MoantSnapshot :  dataSnapshot.getChildren()) {
                    MoantSnapshot.getKey();
                    Log.i("ALARM_onChildChanged", "Monat:" + MoantSnapshot.getValue());
                    for (DataSnapshot DaySnapshot :   MoantSnapshot.getChildren()) {
                        DaySnapshot.getKey();
                        Log.i("ALARM_onChildChanged", "Day:" + DaySnapshot.getValue());
                        for (DataSnapshot TimeSnapshot : DaySnapshot.getChildren()) {
                            DaySnapshot.getKey();
                            Log.i("ALARM_onChildChanged", "Time:" +  DaySnapshot.getValue());
                            textview_Alarm.append("" +TimeSnapshot.getValue() + "\n");
                        }
                    }
                }

       alarm_text_scroll.fullScroll(View.FOCUS_DOWN);
 }

[안드로이드 스튜디오] AppCompatActivity 오류

안드로이드 스튜디오가 버젼 2.2 이나 2.3에서 3.2나 3.3 으로 업데이트되게 되면 기존에 프로젝트에서 사용하던 'AppCompatActivity' 가 붉은 색 오류로 뜨게 된다.


Cannot resolve symbol 'AppCompatActivity'

라고 뜨면서 build.gradle 파일을 업데이트 하거나

 implementation 'com.android.support:appcompat-v7:27.1.1'

프로젝트를 클린 빌드나 재 빌드 해도 해결 할수 없었다.





하지만 프로젝트를 닫고 해당 프로젝트 폴더에 들어가 .idea 폴더를 클릭, libraries 폴더의 이름을 변경하던지 삭제하면 된다.




이후 해당 프로젝트를 다시 불러오게 되면 자동으로 libraries 폴더가 생성되면서 오류가 해결된다.




참고링크



[파이어베이스] user.isEmailVerified() 쓰임새, 이메일 인증

파이어베이스의 이메일 로그인을 구성한 후 해당 이메일 유효한 이메일인지 가입자가 올바른 메일을 사용하고 있는 지 확인할 필요성이 생겼다.

해당 파이어베이스 인증창에서는 이메일이 승인되었는지 알수가 없었다.


검색한 결과, 이메일 인증을 위한 메일 보낸 후 해당 링크를 클릭하게 되면

다음과 같은 인증완료 창을 볼수 있다.

이후 파이어베이스에서 사용자정보를 불러와 user.isEmailVerified() 를 사용하여 메일이 인증되었는지 확인하면 true 또는 false 값으로 반환된다.

  mFirebaseAuth = FirebaseAuth.getInstance();

  final FirebaseUser User = mFirebaseAuth.getCurrentUser();
  if (user.isEmailVerified()) {

                      // 이메일이 인증 되었을 때

  }else{

                    // 이메일 미인증시

  }
인증한 후 다시 사용자정보를 다시 불러와야 하는 데,

mFirebaseAuth.getCurrentUser().reload()

방법으로만은 빠른 응답을 기대하기 어려웠다.
  @Override
    protected void onStart() {
        super.onStart();

        mFirebaseAuth = FirebaseAuth.getInstance();
        final FirebaseUser mFirebaseUser = mFirebaseAuth.getCurrentUser();


        if (mFirebaseUser == null) {  //사용자 없을시 

            Toast.makeText(this, getResources().getString(R.string.login_need), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(this, Activity_Login.class);
            startActivity(intent);
            finish();

        } else { // 사용자 있을 시 다시 불러옴

            mFirebaseAuth.getCurrentUser().reload().addOnSuccessListener(new OnSuccessListener() {
                @Override
                public void onSuccess(Void aVoid) {
                    updateUI(mFirebaseUser);
                }
            });



        }

    }


onStart() 를 이용하여 다시 화면을 사용할 때마다 다시 사용자정보를 업데이트 하도록 했다.


참고링크






[파이어베이스] 이메일 인증을 위한 메일보내기

이메일 인증을 위해 메일을 보내야 한다면 다음과 같이 진행한다.

 user = mFirebaseAuth.getCurrentUser();

 mFirebaseAuth.useAppLanguage();                //해당기기의 언어 설정

 user.sendEmailVerification().addOnCompleteListener(new OnCompleteListener<Void>() {
   @Override
   public void onComplete(@NonNull Task<Void> task) {
      if (task.isSuccessful()) {                         //해당 이메일에 확인메일을 보냄
             Log.d(TAG, "Email sent.");
             Toast.makeText(Activity_SignUp.this,
                "Verification email sent to " + user.getEmail(),
                Toast.LENGTH_SHORT).show();
      } else {                                             //메일 보내기 실패
              Log.e(TAG, "sendEmailVerification", task.getException());
              Toast.makeText(Activity_SignUp.this,
                "Failed to send verification email.",
                Toast.LENGTH_SHORT).show();
      }
    }
 });
이메일 언어를 설정하기 위해서 언어설정에 관련 명령어


mFirebaseAuth.useAppLanguage();

를 추가하여 사용하는 기기의 언어설정과 동일한 언어의 인증 메일을 보낼수 있다. 또는 다음과 같이 언어코드를 직접  설정하여 보낼 수 있다.

mFirebaseAuth.languageCode = 'de'; //독일어 설정


[파이어베이스] 구글로그인에 이어 페이스북 로그인 오류

파이어베이스를 이용하여 구글로그인을 성공한 후 페이스북을 이용한 로그인 시도 중
로그인은 성공했으나 메인 액티비티에 적용되지 못한채

onAuthStateChanged() 

에 진입하지 못해서 고심하던 중


파이어베이스 인증 창 중 하단의 고급설정에






이메일 주소당 계정 1개
사용자가 다른 인증 제공업체를 통해 동일한 이메일 주소를 사용하여 여러 계정을 만들 수 없습니다.







를 발견..


이것이 문제 였다..

구글로그인 이메일과 페이스북 로그인 이메일이 동일해서 인증받지 못한 점..
이메일 주소당 계정 1개를 비활성 하니까 제대로 작동한다.




AppCompat 의 문제들

  • You need to use a Theme.AppCompat theme (or descendant) with this activity
  • Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null


둘 다 액티비티 테마 적용에 문제 및 액션바 설정 관련 문제.

기본적으로 테마는 styles 에서 아래와 같이 설정


<!-- Base application theme. -->

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">



MainActivity extend Activity 의 확장을 

public class MainActivity extends AppCompatActivity {

로 수정한다
getActionBar().setDisplayHomeAsUpEnabled(true);//Action Bar back button

였던 액션바 설정들은 

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
로 수정한다.



참고링크
  • http://stackoverflow.com/questions/21814825/you-need-to-use-a-theme-appcompat-theme-or-descendant-with-this-activity
  • http://stackoverflow.com/questions/30681918/nullpointerexception-with-actionbar-setdisplayhomeasupenabledboolean-on-a-nu

앱의 SHA-1 지문

우선 처음으로 자바가 설치 되어야 하고


java 폴더엣 jdk 로 이동, 다시 bin 폴더에 들어가면 keytool이 보인다



상단의 주소를 복사하고 cmd로 들어간다

기존 디렉토리를 처음으로 가고
cd Program Files\Java\jdk1.8.0_101\bin

디렉토리로 이동

  • 디버그용 키 파일 만들기
원도우즈 경우
keytool -list -keystore [경로 + 이름]  -alias androiddebugkey  -storepass android -keypass android

keytool -list  -keystore C:\Users\SJ\.android\debug.keystore -alias androiddebugkey  -storepass android -keypass android

실행한다.







맥의 경우

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android






참고로 cmd  복사는 

편집 > 모두 선택 후, 엔터키를 부르면 복사되고 메모장에 붙여넣기를 하면 된다

  • 릴리스용 키 파일 만들기
keytool -list -keystore [ 경로 + 이름]

keytool -list -keystore E:\0_Android\Key\bermokeystore


맥용

keytool -list -v  -keystore /Volumes/32GB_SJ/0_Android/Key/bermokeystore -alias bermo



[Kotlin] 안드로이드 내부저장소 캐시에 저장하기

안드로이드 내부에 임시적으로 데이터를 저장하기 위해 캐시에 저장한다. 따로 퍼미션이 필요없고 보안이 필요없는 부분에서 잠시 저장할 때 유리하다 내부적으로 저장소가 부족할때 자동으로 지워질수 있다는 경고 private fun saveCache(d...