Electronic Frame

Electronic Frame

사용 기술: Layout(landscape), Android Permission, Activity Lifecycle, Content Provider - SAF

// MainActivity.kt package oh.hee.electronicframe import android.app.Activity import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.ImageView import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import javax.security.auth.callback.PasswordCallback class MainActivity : AppCompatActivity() { private val addPhotoButton by lazy { findViewById(R.id.addPhotoButton) } private val startPhotoFrameModeButton by lazy { findViewById(R.id.startPhotoFrameModeButton) } private val imageViewList: List by lazy { mutableListOf().apply { add(findViewById(R.id.imageView11)) add(findViewById(R.id.imageView12)) add(findViewById(R.id.imageView13)) add(findViewById(R.id.imageView21)) add(findViewById(R.id.imageView22)) add(findViewById(R.id.imageView23)) } } private val imageUriList: MutableList = mutableListOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) initAddPhotoButton() initStartPhotoFrameModeButton() } private fun initAddPhotoButton() { addPhotoButton.setOnClickListener { when { ContextCompat.checkSelfPermission( this, android.Manifest.permission.READ_EXTERNAL_STORAGE ) == PackageManager.PERMISSION_GRANTED -> { // todo 권한이 잘 부여되었을 때 갤러리에서 사진을 선택하는 기능 navigatePhotos() } shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE) -> { //todo 교육용 팝업 확인 후 권한 팝업 띄우는 기능 showPermissionContextPopup() } else -> { requestPermissions( arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1000 ) } } } } private fun initStartPhotoFrameModeButton() { startPhotoFrameModeButton.setOnClickListener { val intent = Intent(this, PhotoFrameActivity::class.java) imageUriList.forEachIndexed { index, uri -> intent.putExtra("photo$index", uri.toString()) } intent.putExtra("photoListSize",imageUriList.size) startActivity(intent) } } private fun navigatePhotos() { val intent = Intent(Intent.ACTION_GET_CONTENT) intent.type = "image/*" startActivityForResult(intent, 2000) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode != Activity.RESULT_OK) { return } when (requestCode) { 2000 -> { val selectedImageUri: Uri? = data?.data if (selectedImageUri != null) { if (imageUriList.size == 6) { Toast.makeText(this, "이미 사진이 꽉 찼습니다.", Toast.LENGTH_SHORT).show() return } imageUriList.add(selectedImageUri) imageViewList[imageUriList.size - 1].setImageURI(selectedImageUri) } else { Toast.makeText(this, "사진을 가져오지 못했습니다.", Toast.LENGTH_SHORT).show() } } else -> { Toast.makeText(this, "사진을 가져오지 못했습니다.", Toast.LENGTH_SHORT).show() } } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when (requestCode) { 1000 -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // todo 권한이 부여된 것입니다. navigatePhotos() } else { Toast.makeText(this, "권한을 거부하였습니다.", Toast.LENGTH_SHORT).show() } } else -> { // } } } private fun showPermissionContextPopup() { AlertDialog.Builder(this) .setTitle("권한이 필요합니다.") .setMessage("전자액자 앱에서 사진을 불러오기 위해 권한이 필요합니다.") .setPositiveButton("동의") { _, _ -> requestPermissions(arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1000) } .setNegativeButton("취소") { _, _ -> } .create() .show() } }

// activity_main.xml

// PhotoFrameActivity.kt package oh.hee.electronicframe import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.core.net.toUri import java.util.* import kotlin.concurrent.timer class PhotoFrameActivity : AppCompatActivity() { private val photoList = mutableListOf() private var currentPosition = 0 private var timer : Timer? = null private val photoImageView: ImageView by lazy { findViewById(R.id.PhotoImageView) } private val backgroundPhotoImageView: ImageView by lazy { findViewById(R.id.backgroundPhotoImageView) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_photo_frame) getPhotoUriFromIntent() } private fun getPhotoUriFromIntent() { val size = intent.getIntExtra("photoListSize", 0) for (i in 0..size) { intent.getStringExtra("photo$i")?.let { photoList.add(Uri.parse(it)) } } } private fun startTimer() { timer = timer(period = 5000) { Log.d("timer","timer") runOnUiThread { val current = currentPosition val next = if (photoList.size <= currentPosition +1 ) 0 else currentPosition + 1 backgroundPhotoImageView.setImageURI(photoList[current]) photoImageView.alpha = 0f photoImageView.setImageURI(photoList[next]) photoImageView.animate() .alpha(1.0f) .setDuration(1000) .start() currentPosition = next } } } override fun onStop() { super.onStop() timer?.cancel() } override fun onStart() { super.onStart() startTimer() } override fun onDestroy() { super.onDestroy() Log.d("destroy","파괴") timer?.cancel() } }

// activity_photo_frame.xml

from http://jhg3410.tistory.com/42 by ccl(A) rewrite - 2021-12-29 09:28:07