이전글
2020/12/29 - [안드로이드] - [WindowManger] 윈도우 매니저 개선하기 2 (환경 구성하기)
이번 화에서 프로젝트에서 만든 앱에서 FIrebase 로 데이터를 저장을 하였는데 그 구성을 법을 적어보고자 합니다.
Firebase
파이어베이스는 구글에서 사용을 할 수 있는 개발 플랫폼으로써 직접적인 백엔드의 구현없이 빠르게
사용을 할 수 있는 플랫폼입니다. 물론 비즈니스적으로 확장적으로 사용할 수 있다. (개인적으로 그렇게 생각한다.)
위 사진처럼 다양한 서비스를 사용할 수 있습니다. 제가 이것을 사용을 하고자 했던 이유는 애플리케이션에서 측정한 데이터를 빠르고 간편하게 저장하고 외부로 빼냈으면 했습니다. 그래서 저는 Firebase 에서 Storage 를 사용했습니다.
프로젝트 만들기
안드로이드 스튜디오를 사용을 한다면 정말 빠르게 설정을 할 수 있습니다. 저는 웹 환경에서 프로젝트를 설정하는 방법을 알려드립니다.
https://console.firebase.google.com/
위 링크로 접속을 하시어 파이어베이스 콘솔로 이동을 하여 웹페이지 상단에 보이는 프로젝트 추가를 눌러 줍니다.
위 설치 과정에 대로 설치를 해주시면 됩니다.
본인의 패키지 파일 형식에 맞추어 기입을 해줍니다.
특히 디버그 서명 인증서 SHA-1 를 기입을 하는 부분을 제일 어려워 하십니다.
문서에서는 자바에서 실행을 하는 방법, 따로 keytool 를 이용하는 방법이 있지만
저는 gradle task를 이용하는 방법이 제일 간편한것 같아 이를 소개합니다.
우선 안드로이드 스튜디오를 여시고 gradle task 를 실행해줍니다.
(shift*2 번을 누르시고 execute gradle task 를 눌러 주시면 됩니다.)
signinReport
기입해주시면 gradle task 가 실행이 되고 원하시는 값을 확인 할 수 있습니다.
Variant: debug 를 잘 확인을 하시면 됩니다.
이제 storage 를 쓰는 방법은 간단 합니다. -> 안드로이드 스튜디오의 firebase storage 관한 dependency
를 설정을 해주시고 코드를 작성해주시면 됩니다.
보안 설정이 기본인 경우는 따로 코드를 조작을 할 필요가 없이 접근만으로 파일 등을 업로드 할 수 있습니다.
onCreate 에서 인스턴스를 받아주셔야 합니다.
그리고 원하시는 부분에 아래 함수처럼 코드 로직을 작성을 하시고 버튼이나 따른 비즈니로직에서 붙여주시면
원하시는 데이터 파일이 바로 Firebase 스토리지의 저장이 되고 이를 확인할 수 있습니다.
예시 코드
- package com.keelim.testing.ui.result
- import android.app.ProgressDialog
- import android.net.Uri
- import android.os.Bundle
- import android.view.View
- import android.view.animation.Animation
- import android.view.animation.AnimationUtils
- import android.widget.Toast
- import androidx.appcompat.app.AppCompatActivity
- import androidx.recyclerview.widget.LinearLayoutManager
- import com.google.android.material.snackbar.Snackbar
- import com.google.firebase.storage.FirebaseStorage
- import com.google.firebase.storage.StorageReference
- import com.keelim.testing.R
- import kotlinx.android.synthetic.main.activity_result.*
- import java.io.BufferedWriter
- import java.io.File
- import java.nio.charset.Charset
- import java.text.SimpleDateFormat
- import java.util.*
- class ResultActivity : AppCompatActivity(), View.OnClickListener {
- private lateinit var resultArray: ArrayList<Long>
- private lateinit var fab_open: Animation
- private lateinit var fab_close: Animation
- private lateinit var writer: BufferedWriter
- private lateinit var ref: StorageReference
- private var isFabOpen = true
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_result)
- ref = FirebaseStorage.getInstance().reference // 파이어베이스 스토리지지
- fab_open = AnimationUtils.loadAnimation(applicationContext, R.anim.fab_open);
- fab_close = AnimationUtils.loadAnimation(applicationContext, R.anim.fab_close);
- resultArray = intent.getSerializableExtra("result") as ArrayList<Long>
- // array List 를 받는다.
- result_recycler.apply {
- setHasFixedSize(true)
- layoutManager = LinearLayoutManager(this@ResultActivity)
- adapter = ResultAdapter(resultArray)
- }
- fab1.setOnClickListener(this);
- fab2.setOnClickListener(this);
- fab3.setOnClickListener(this);
- }
- override fun onClick(v: View) {
- val id = v.id
- when (id) {
- R.id.fab1 -> {anim()}
- R.id.fab2 -> {makingData()}
- R.id.fab3 -> {uploadToServer()}
- }
- }
- fun anim() {
- if (isFabOpen) {
- fab2.startAnimation(fab_close)
- fab3.startAnimation(fab_close)
- fab2.isClickable = false
- fab3.isClickable = false
- isFabOpen = false
- } else {
- fab2.startAnimation(fab_open)
- fab3.startAnimation(fab_open)
- fab2.isClickable = true
- fab3.isClickable = true
- isFabOpen = true
- }
- }
- private fun uploadToServer() { // 서버에 올린다 파이어 스토어
- //if there is a file to upload
- val file = File(application.filesDir, getString(R.string.file))
- if (!file.exists()) {
- Toast.makeText(this, "데이터 파일을 확인해세요", Toast.LENGTH_SHORT).show()
- return
- }
- val filePath = Uri.fromFile(file)
- //displaying a progress dialog while upload is going on
- val progressDialog = ProgressDialog(this)
- .setTitle("Uploading...")
- .show()
- val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.KOREA).format(Date())
- val riversRef: StorageReference = ref.child("data/data${timestamp}.csv")
- riversRef.putFile(filePath)
- .addOnSuccessListener {
- progressDialog.dismiss()
- Toast.makeText(this, "File Uploaded", Toast.LENGTH_LONG).show()
- }
- .addOnFailureListener { exception ->
- progressDialog.dismiss()
- Toast.makeText(this, exception.message, Toast.LENGTH_LONG).show()
- }
- .addOnProgressListener { taskSnapshot ->
- val progress = 100.0 * taskSnapshot.bytesTransferred / taskSnapshot.totalByteCount
- progressDialog.setMessage("Uploaded " + progress.toInt() + "%...")
- }
- }
- private fun makingData() {
- val lineSeparator = System.getProperty("line.separator")
- val fOut = openFileOutput(getString(R.string.file), MODE_PRIVATE)
- for (i in resultArray) {
- fOut.apply {
- write(i.toString().toByteArray(Charset.defaultCharset()))
- write(lineSeparator.toByteArray(Charset.defaultCharset()))
- fOut.flush()
- }
- }
- fOut.close()
- val file = File(application.filesDir, getString(R.string.file))
- if (file.exists()) Snackbar.make(result_container, "파일이 정상적으로 생성되었습니다. ", Snackbar.LENGTH_SHORT).show()
- else Snackbar.make(result_container, "파일 생성에 오류가 있습니다.", Snackbar.LENGTH_SHORT).show()
- }
- }
🧶 모든 문서는 수정될 수 있습니다.
'안드로이드' 카테고리의 다른 글
[WindowManager] 윈도우 매니저 개선하기 5 실험 결과 (0) | 2021.01.07 |
---|---|
[WindowManger] 윈도우 매니저 개선하기 4 빌드와 포팅 (0) | 2021.01.04 |
[WindowManger] 윈도우 매니저 개선하기 2 (환경 구성하기) (0) | 2020.12.29 |
[WindowManager] 윈도우 매니저 개선하기 1 (0) | 2020.12.29 |
[안드로이드] 코드랩 시리즈(1) Using Android Notifications (알림1) (0) | 2020.12.04 |
댓글