페이지

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

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

private fun saveCache(data: String) {
        try {
            val file = File(cacheDir, "myCache")
            val outputStream = FileOutputStream(file)
            outputStream.write(data.toByteArray())
            outputStream.close()
            Log.d("data.toByteArray()", "saved")
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }



private fun loadCache(){
              try {
                    val file = File(cacheDir, "myCache")
                    if (!file.exists()) file.createNewFile()
                    val inputStream = FileInputStream(file)
                    val s = Scanner(inputStream)
                    var text = ""
                    while (s.hasNext()) {
                        text += s.nextLine()

                    }

                    inputStream.close()
                    Log.d("FileInputStream",text)
                    loggingData =text
                } catch (e: IOException) {
                    e.printStackTrace()
                }
             }



[Kotlin] 다른 Fragment와 통신, Fragment 사이 데이타 전달 오류

다른 Fragment와 통신

Fragment 사이의 데이타 전달 시 Viewmodel 를 사용하여 프로그램할 경우, 안드로이드 공식 문서에 따르면(참조: 다른 Fragment와 통신 ) 두 개 프레그먼트 간의 직접적인 데이타 전달은 지양된다.




두 Fragment 의   ViewModelProviders 액티비티 설정에 오류가 있었다.

Fragment1.kt 오류발생

 override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(myViewModel::class.java)

    }

일반적으로  ViewModelProviders.of(this) 사용으로 올바른 뷰모델의 사용이 되지 않아서 데이타 전달이 되지 못했다. 프래그멘트 안에서 사용할 경우,


ViewModelProviders.of(activity as MainActivity)

로 수정해야 했었다.

데이타를 업데이트 해야하는 Fragment2 에서는


Model.getText().observe(this, Observer<string> { t -> txtLanguage?.text("$t ,") })

가 아니라

Model.getText().observe(this, androidx.lifecycle.Observer<string> { t -> txtLanguage?.text("$t ,") })

로 수정해야 했었다.

Fragment2.kt

 override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        val Model = ViewModelProviders.of(activity as MainActivity).get(myViewModel::class.java)
        Model.getText().observe(this, androidx.lifecycle.Observer<string> { t -> txtLanguage?.text("$t ,") })

    }



[SVG 이미지] 안드로이드 벡터 이미지 사용 오류

벡터 이미지를 사용하게 되면 크기에 따라 깔금한 이미지를 자동으로 사용할 수 있다.
SVG 벡터 이미지를 app:srcCompact 를 사용하여 불러왔으나 적용되지 않았다 .
이미지가 흐미하게 지속적으로 나타난 바, 
검색해 보니 build.gradle 에    vectorDrawables.useSupportLibrary = true 를 적용했어야 했다 .


android {
    compileSdkVersion 28
    defaultConfig {
        
        minSdkVersion 22
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"


    }


적용하니 바로 이미지가 선명해졌다.
아래 그 차이를 확인할수 있다.




참, vectorDrawables.useSupportLibrary 은 Android 5.0 (API level 21) 부터 적용된다.

참고링크





[파이어베이스] 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'; //독일어 설정


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

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