Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .idea/codeStyles/Project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions .idea/jarRepositories.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

56 changes: 30 additions & 26 deletions app/src/main/java/com/example/firstapp/CameraActivity.kt
Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
package com.example.firstapp


import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.Manifest
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.util.concurrent.Executors
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.*
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.camera_main.*
import java.io.File
import java.nio.ByteBuffer
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.ExecutorService
typealias LumaListener = (luma: Double) -> Unit
import java.util.concurrent.Executors

class CameraActivity : AppCompatActivity() {
private var preview: Preview? = null
Expand All @@ -36,18 +32,22 @@ class CameraActivity : AppCompatActivity() {

override fun onRequestPermissionsResult(
requestCode: Int, permissions: Array<String>, grantResults:
IntArray) {
IntArray
) {
if (requestCode == REQUEST_CODE_PERMISSIONS) {
if (allPermissionsGranted()) {
startCamera()
} else {
Toast.makeText(this,
Toast.makeText(
this,
"Permissions not granted by the user.",
Toast.LENGTH_SHORT).show()
Toast.LENGTH_SHORT
).show()
finish()
}
}
}

@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -58,7 +58,8 @@ class CameraActivity : AppCompatActivity() {
startCamera()
} else {
ActivityCompat.requestPermissions(
this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS
)
}

// Setup the listener for take photo button
Expand All @@ -71,30 +72,27 @@ class CameraActivity : AppCompatActivity() {

private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

cameraProviderFuture.addListener(Runnable {
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

// Preview
preview = Preview.Builder()
.build()

imageCapture = ImageCapture.Builder()
.build()

// Select back camera
val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()

val cameraSelector =
CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()

// Bind use cases to camera
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture)
this, cameraSelector, preview, imageCapture
)
preview?.setSurfaceProvider(viewFinder.createSurfaceProvider(camera?.cameraInfo))
} catch(exc: Exception) {
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}

Expand All @@ -108,16 +106,20 @@ class CameraActivity : AppCompatActivity() {
// Create timestamped output file to hold the image
val photoFile = File(
outputDirectory,
SimpleDateFormat(FILENAME_FORMAT, Locale.US
).format(System.currentTimeMillis()) + ".jpg")
SimpleDateFormat(
FILENAME_FORMAT, Locale.US
).format(System.currentTimeMillis()) + ".jpg"
)

// Create output options object which contains file + metadata
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()

// Setup image capture listener which is triggered after photo has
// been taken
imageCapture.takePicture(
outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
outputOptions,
ContextCompat.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
Expand All @@ -133,13 +135,15 @@ class CameraActivity : AppCompatActivity() {

private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
baseContext, it) == PackageManager.PERMISSION_GRANTED
baseContext, it
) == PackageManager.PERMISSION_GRANTED
}

@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
fun getOutputDirectory(): File {
val mediaDir = externalMediaDirs.firstOrNull()?.let {
File(it, resources.getString(R.string.app_name)).apply { mkdirs() } }
File(it, resources.getString(R.string.app_name)).apply { mkdirs() }
}
return if (mediaDir != null && mediaDir.exists())
mediaDir else filesDir
}
Expand Down
62 changes: 36 additions & 26 deletions app/src/main/java/com/example/firstapp/FotoActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,40 @@ package com.example.firstapp
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Environment
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import io.fotoapparat.Fotoapparat
import io.fotoapparat.configuration.CameraConfiguration
import io.fotoapparat.log.logcat
import io.fotoapparat.log.loggers
import io.fotoapparat.parameter.ScaleType
import io.fotoapparat.selector.*
import io.fotoapparat.selector.back
import io.fotoapparat.selector.front
import io.fotoapparat.selector.off
import io.fotoapparat.selector.torch
import io.fotoapparat.view.CameraView
import kotlinx.android.synthetic.main.activity_foto.*
import java.io.File



class FotoActivity : AppCompatActivity() {

private var fotoapparat: Fotoapparat? = null
private val filename = "test.png"
private val sd = Environment.getExternalStorageDirectory()
private val dest = File(sd, filename)
private var fotoapparatState : FotoapparatState? = null
private var cameraStatus : CameraState? = null
private var fotoapparatState: FotoapparatState? = null
private var cameraStatus: CameraState? = null
private var flashState: FlashState? = null

private val permissions = arrayOf(android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
private val permissions = arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -58,7 +62,7 @@ class FotoActivity : AppCompatActivity() {
}
}

private fun createFotoapparat(){
private fun createFotoapparat() {
val cameraView = findViewById<CameraView>(R.id.camera_view)

fotoapparat = Fotoapparat(
Expand All @@ -78,28 +82,28 @@ class FotoActivity : AppCompatActivity() {
private fun changeFlashState() {
fotoapparat?.updateConfiguration(
CameraConfiguration(
flashMode = if(flashState == FlashState.TORCH) off() else torch()
flashMode = if (flashState == FlashState.TORCH) off() else torch()
)
)

flashState = if(flashState == FlashState.TORCH) FlashState.OFF
flashState = if (flashState == FlashState.TORCH) FlashState.OFF
else FlashState.TORCH
}

private fun switchCamera() {
fotoapparat?.switchTo(
lensPosition = if (cameraStatus == CameraState.BACK) front() else back(),
lensPosition = if (cameraStatus == CameraState.BACK) front() else back(),
cameraConfiguration = CameraConfiguration()
)

cameraStatus = if(cameraStatus == CameraState.BACK) CameraState.FRONT
cameraStatus = if (cameraStatus == CameraState.BACK) CameraState.FRONT
else CameraState.BACK
}

private fun takePhoto() {
if (hasNoPermissions()) {
requestPermission()
}else{
} else {
fotoapparat
?.takePicture()
?.saveToFile(dest)
Expand All @@ -110,21 +114,27 @@ class FotoActivity : AppCompatActivity() {
super.onStart()
if (hasNoPermissions()) {
requestPermission()
}else{
} else {
fotoapparat?.start()
fotoapparatState = FotoapparatState.ON
}
}

private fun hasNoPermissions(): Boolean{
return ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
private fun hasNoPermissions(): Boolean {
return ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
}

private fun requestPermission(){
ActivityCompat.requestPermissions(this, permissions,0)
private fun requestPermission() {
ActivityCompat.requestPermissions(this, permissions, 0)
}

override fun onStop() {
Expand All @@ -135,7 +145,7 @@ class FotoActivity : AppCompatActivity() {

override fun onResume() {
super.onResume()
if(!hasNoPermissions() && fotoapparatState == FotoapparatState.OFF){
if (!hasNoPermissions() && fotoapparatState == FotoapparatState.OFF) {
val intent = Intent(baseContext, MainActivity::class.java)
startActivity(intent)
finish()
Expand All @@ -144,14 +154,14 @@ class FotoActivity : AppCompatActivity() {

}

enum class CameraState{
enum class CameraState {
FRONT, BACK
}

enum class FlashState{
enum class FlashState {
TORCH, OFF
}

enum class FotoapparatState{
enum class FotoapparatState {
ON, OFF
}