Merge branch 'master' into weblate-simple-mobile-tools-simple-camera

This commit is contained in:
Tibor Kaputa 2022-07-13 21:48:37 +02:00 committed by GitHub
commit 44bc8af55e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 451 additions and 121 deletions

View File

@ -34,7 +34,7 @@ android {
buildTypes {
debug {
applicationIdSuffix ".debugcamerax"
applicationIdSuffix ".debug"
}
release {
minifyEnabled true

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--TODO Revert to Camera_debug -->
<string name="app_launcher_name">CameraX_debug</string>
<string name="app_launcher_name">Camera_debug</string>
</resources>

View File

@ -7,8 +7,8 @@ import android.hardware.SensorManager
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.provider.MediaStore
import android.util.Log
import android.view.*
import android.widget.RelativeLayout
import com.bumptech.glide.Glide
@ -31,9 +31,10 @@ import java.util.concurrent.TimeUnit
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, CameraXPreviewListener {
private val TAG = "MainActivity"
private val FADE_DELAY = 5000L
private val CAPTURE_ANIMATION_DURATION = 100L
companion object {
private const val FADE_DELAY = 5000L
private const val CAPTURE_ANIMATION_DURATION = 100L
}
lateinit var mTimerHandler: Handler
private lateinit var mOrientationEventListener: OrientationEventListener
@ -49,14 +50,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
private var mCurrVideoRecTimer = 0
var mLastHandledOrientation = 0
@Suppress("DEPRECATION")
override fun onCreate(savedInstanceState: Bundle?) {
window.addFlags(
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON or
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
useDynamicTheme = false
super.onCreate(savedInstanceState)
appLaunched(BuildConfig.APPLICATION_ID)
@ -67,6 +62,22 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
supportActionBar?.hide()
checkWhatsNewDialog()
setupOrientationEventListener()
if (isRPlus()) {
setShowWhenLocked(true)
setTurnScreenOn(true)
window.insetsController?.hide(WindowInsets.Type.statusBars())
} else if (isOreoMr1Plus()) {
setShowWhenLocked(true)
setTurnScreenOn(true)
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
} else {
window.addFlags(
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON or
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
}
}
override fun onResume() {
@ -109,15 +120,12 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
private fun initVariables() {
mIsInPhotoMode = if (isVideoCaptureIntent()) {
Log.w(TAG, "initializeCamera: video capture")
false
} else if (isImageCaptureIntent()) {
Log.w(TAG, "initializeCamera: image capture mode")
true
} else {
config.initPhotoMode
}
Log.w(TAG, "initInPhotoMode = $mIsInPhotoMode")
mIsCameraAvailable = false
mIsHardwareShutterHandled = false
mCurrVideoRecTimer = 0
@ -189,7 +197,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
private fun checkImageCaptureIntent() {
if (isImageCaptureIntent()) {
Log.i(TAG, "isImageCaptureIntent: ")
hideIntentButtons()
val output = intent.extras?.get(MediaStore.EXTRA_OUTPUT)
if (output != null && output is Uri) {
@ -200,7 +207,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
private fun checkVideoCaptureIntent() {
if (intent?.action == MediaStore.ACTION_VIDEO_CAPTURE) {
Log.i(TAG, "checkVideoCaptureIntent: ")
mIsInPhotoMode = false
hideIntentButtons()
shutter.setImageResource(R.drawable.ic_video_rec)
@ -238,8 +244,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
mFocusCircleView = FocusCircleView(applicationContext)
view_holder.addView(mFocusCircleView)
mTimerHandler = Handler()
mFadeHandler = Handler()
mTimerHandler = Handler(Looper.getMainLooper())
mFadeHandler = Handler(Looper.getMainLooper())
setupPreviewImage(true)
val initialFlashlightState = FLASH_OFF
@ -389,7 +395,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
mPreviewUri = Uri.withAppendedPath(uri, lastMediaId.toString())
Log.e(TAG, "mPreviewUri= $mPreviewUri")
loadLastTakenMedia(mPreviewUri)
}
@ -439,8 +444,13 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
view.isClickable = value != .0f
}
@Suppress("DEPRECATION")
private fun hideNavigationBarIcons() {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE
if (isRPlus()) {
window.insetsController?.hide(WindowInsets.Type.systemBars())
} else {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE
}
}
private fun showTimer() {
@ -567,7 +577,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
setResult(Activity.RESULT_OK, this)
}
Log.w(TAG, "onMediaCaptured: exiting uri=$uri")
finish()
} else if (isVideoCaptureIntent()) {
Intent().apply {
@ -575,7 +584,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
setResult(Activity.RESULT_OK, this)
}
Log.w(TAG, "onMediaCaptured: video exiting uri=$uri")
finish()
}
}
@ -586,7 +594,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
putExtra("data", bitmap)
setResult(Activity.RESULT_OK, this)
}
Log.w(TAG, "onImageCaptured: exiting bitmap size=${bitmap.byteCount}")
finish()
}
}
@ -645,7 +652,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
fun drawFocusCircle(x: Float, y: Float) = mFocusCircleView.drawFocusCircle(x, y)
override fun mediaSaved(path: String) {
Log.e(TAG, "mediaSaved: $path")
rescanPaths(arrayListOf(path)) {
setupPreviewImage(true)
Intent(BROADCAST_REFRESH_MEDIA).apply {

View File

@ -1,8 +1,10 @@
package com.simplemobiletools.camera.activities
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.core.content.res.ResourcesCompat
import com.simplemobiletools.camera.BuildConfig
import com.simplemobiletools.camera.R
import com.simplemobiletools.camera.extensions.config
@ -14,6 +16,7 @@ import com.simplemobiletools.commons.helpers.NavigationIcon
import com.simplemobiletools.commons.models.FAQItem
import com.simplemobiletools.commons.models.RadioItem
import java.util.Locale
import kotlin.system.exitProcess
import kotlinx.android.synthetic.main.activity_settings.*
class SettingsActivity : SimpleActivity() {
@ -77,7 +80,7 @@ class SettingsActivity : SimpleActivity() {
// make sure the corners at ripple fit the stroke rounded corners
if (settings_purchase_thank_you_holder.isGone()) {
settings_use_english_holder.background = resources.getDrawable(R.drawable.ripple_top_corners, theme)
settings_use_english_holder.background = ResourcesCompat.getDrawable(resources, R.drawable.ripple_top_corners, theme)
}
settings_purchase_thank_you_holder.setOnClickListener {
@ -97,13 +100,13 @@ class SettingsActivity : SimpleActivity() {
settings_use_english.isChecked = config.useEnglish
if (settings_use_english_holder.isGone() && settings_purchase_thank_you_holder.isGone()) {
settings_keep_settings_visible_holder.background = resources.getDrawable(R.drawable.ripple_all_corners, theme)
settings_keep_settings_visible_holder.background = ResourcesCompat.getDrawable(resources, R.drawable.ripple_all_corners, theme)
}
settings_use_english_holder.setOnClickListener {
settings_use_english.toggle()
config.useEnglish = settings_use_english.isChecked
System.exit(0)
exitProcess(0)
}
}
@ -172,8 +175,8 @@ class SettingsActivity : SimpleActivity() {
settings_save_photos_holder.setOnClickListener {
FilePickerDialog(this, config.savePhotosFolder, false, showFAB = true) {
val path = it
handleSAFDialog(it) {
if (it) {
handleSAFDialog(it) { success ->
if (success) {
config.savePhotosFolder = path
settings_save_photos.text = getLastPart(config.savePhotosFolder)
}
@ -206,6 +209,7 @@ class SettingsActivity : SimpleActivity() {
}
}
@SuppressLint("SetTextI18n")
private fun updatePhotoQuality(quality: Int) {
settings_photo_quality.text = "$quality%"
}

View File

@ -1,7 +1,6 @@
package com.simplemobiletools.camera.dialogs
import android.app.Activity
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import androidx.appcompat.app.AlertDialog
@ -28,7 +27,6 @@ class ChangeResolutionDialogX(
private var dialog: AlertDialog? = null
private val config = activity.config
private val TAG = "ChangeResolutionDialogX"
init {
val view = LayoutInflater.from(activity).inflate(R.layout.dialog_change_resolution, null).apply {
setupPhotoResolutionPicker(this)
@ -57,7 +55,6 @@ class ChangeResolutionDialogX(
view.change_resolution_photo_holder.setOnClickListener {
RadioGroupDialog(activity, ArrayList(items), selectionIndex) {
selectionIndex = it as Int
Log.w(TAG, "setupPhotoResolutionPicker: selectionIndex=$it")
view.change_resolution_photo.text = items[selectionIndex].title
if (isFrontCamera) {
config.frontPhotoResIndex = it
@ -80,8 +77,6 @@ class ChangeResolutionDialogX(
var selectionIndex = if (isFrontCamera) config.frontVideoResIndex else config.backVideoResIndex
selectionIndex = selectionIndex.coerceAtLeast(0)
Log.i(TAG, "videoResolutions=$videoResolutions")
Log.i(TAG, "setupVideoResolutionPicker: selectionIndex=$selectionIndex")
view.change_resolution_video_holder.setOnClickListener {
RadioGroupDialog(activity, ArrayList(items), selectionIndex) {
@ -91,7 +86,7 @@ class ChangeResolutionDialogX(
if (isFrontCamera) {
config.frontVideoResIndex = selectionIndex
} else {
config.backPhotoResIndex = selectionIndex
config.backVideoResIndex = selectionIndex
}
dialog?.dismiss()
callback.invoke()
@ -99,6 +94,5 @@ class ChangeResolutionDialogX(
}
val selectedItem = items.getOrNull(selectionIndex)
view.change_resolution_video.text = selectedItem?.title
Log.i(TAG, "setupVideoResolutionPicker: selectedItem=$selectedItem")
}
}

View File

@ -2,14 +2,12 @@ package com.simplemobiletools.camera.helpers
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.util.Log
import kotlin.math.ceil
import kotlin.math.floor
import kotlin.math.sqrt
//inspired by https://android.googlesource.com/platform/packages/apps/Camera2/+/refs/heads/master/src/com/android/camera/util/CameraUtil.java#244
object BitmapUtils {
private const val TAG = "BitmapUtils"
private const val INLINE_BITMAP_MAX_PIXEL_NUM = 50 * 1024
fun makeBitmap(jpegData: ByteArray, maxNumOfPixels: Int = INLINE_BITMAP_MAX_PIXEL_NUM): Bitmap? {
@ -31,7 +29,6 @@ object BitmapUtils {
options
)
} catch (ex: OutOfMemoryError) {
Log.e(TAG, "Got oom exception ", ex)
null
}
}

View File

@ -6,20 +6,19 @@ import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager
import android.hardware.camera2.params.StreamConfigurationMap
import android.media.MediaRecorder
import android.util.Log
import android.util.Size
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.CameraSelector
import com.simplemobiletools.camera.extensions.config
import com.simplemobiletools.camera.models.CameraSelectorImageQualities
import com.simplemobiletools.camera.models.MySize
import com.simplemobiletools.commons.extensions.showErrorToast
class ImageQualityManager(
activity: AppCompatActivity,
private val activity: AppCompatActivity,
) {
companion object {
private const val TAG = "ImageQualityManager"
private const val MAX_VIDEO_WIDTH = 4096
private const val MAX_VIDEO_HEIGHT = 2160
private val CAMERA_LENS = arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK)
@ -39,11 +38,10 @@ class ImageQualityManager(
val imageSizes = configMap.getOutputSizes(ImageFormat.JPEG).map { MySize(it.width, it.height) }
val cameraSelector = lens.toCameraSelector()
imageQualities.add(CameraSelectorImageQualities(cameraSelector, imageSizes))
Log.i(TAG, "initQualities: imageSizes=$imageSizes")
}
}
} catch (e: Exception) {
Log.e(TAG, "Camera ID=$cameraId is not supported", e)
activity.showErrorToast(e)
}
}
}
@ -69,12 +67,7 @@ class ImageQualityManager(
.sortedByDescending { it.pixels }
.distinctBy { it.pixels }
.map { Size(it.width, it.height) }
.also {
Log.i(TAG, "Resolutions: $it, index=$index")
}
.getOrNull(index).also {
Log.i(TAG, "getUserSelectedResolution: $it, index=$index")
}
.getOrNull(index)
}
fun getSupportedResolutions(cameraSelector: CameraSelector): List<MySize> {

View File

@ -5,13 +5,14 @@ import android.net.Uri
import android.os.Environment
import android.os.ParcelFileDescriptor
import android.provider.MediaStore
import android.util.Log
import com.simplemobiletools.camera.extensions.config
import com.simplemobiletools.camera.extensions.getOutputMediaFile
import com.simplemobiletools.camera.extensions.getRandomMediaName
import com.simplemobiletools.camera.models.MediaOutput
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.commons.helpers.isQPlus
import java.io.File
import java.io.OutputStream
@ -23,8 +24,8 @@ class MediaOutputHelper(
) {
companion object {
private const val TAG = "MediaOutputHelper"
private const val MODE = "rw"
private const val EXTERNAL_VOLUME = "external"
private const val IMAGE_MIME_TYPE = "image/jpeg"
private const val VIDEO_MIME_TYPE = "video/mp4"
}
@ -53,44 +54,62 @@ class MediaOutputHelper(
fun getVideoMediaOutput(): MediaOutput {
return if (is3rdPartyIntent) {
if (outputUri != null) {
val fileDescriptor = openFileDescriptor(outputUri)
if (fileDescriptor != null) {
MediaOutput.FileDescriptorMediaOutput(fileDescriptor, outputUri)
if (isOreoPlus()) {
val fileDescriptor = openFileDescriptor(outputUri)
if (fileDescriptor != null) {
MediaOutput.FileDescriptorMediaOutput(fileDescriptor, outputUri)
} else {
errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = false)
}
} else {
errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = false)
val path = activity.getRealPathFromURI(outputUri)
if (path != null) {
MediaOutput.FileMediaOutput(File(path), outputUri)
} else {
errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = false)
}
}
} else {
getMediaStoreOutput(isPhoto = false)
}
} else {
getFileDescriptorMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
if (isOreoPlus()) {
getFileDescriptorMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
} else {
getFileMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
}
}
}
private fun getMediaStoreOutput(isPhoto: Boolean): MediaOutput.MediaStoreOutput {
val contentValues = getContentValues(isPhoto)
val contentUri = if (isPhoto) {
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
MediaStore.Images.Media.getContentUri(EXTERNAL_VOLUME)
} else {
MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
MediaStore.Video.Media.getContentUri(EXTERNAL_VOLUME)
}
return MediaOutput.MediaStoreOutput(contentValues, contentUri)
}
@Suppress("DEPRECATION")
private fun getContentValues(isPhoto: Boolean): ContentValues {
val mimeType = if (isPhoto) IMAGE_MIME_TYPE else VIDEO_MIME_TYPE
return ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, getRandomMediaName(isPhoto))
put(MediaStore.MediaColumns.MIME_TYPE, mimeType)
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM)
if (isQPlus()) {
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM)
} else {
put(MediaStore.MediaColumns.DATA, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString())
}
}
}
private fun getOutputStreamMediaOutput(): MediaOutput.OutputStreamMediaOutput? {
var mediaOutput: MediaOutput.OutputStreamMediaOutput? = null
val canWrite = canWriteToFilePath(mediaStorageDir)
Log.i(TAG, "getMediaOutput: canWrite=${canWrite}")
if (canWrite) {
val path = activity.getOutputMediaFile(true)
val uri = getUriForFilePath(path)
@ -99,16 +118,14 @@ class MediaOutputHelper(
mediaOutput = MediaOutput.OutputStreamMediaOutput(outputStream, uri)
}
}
Log.i(TAG, "OutputStreamMediaOutput: $mediaOutput")
return mediaOutput
}
private fun openOutputStream(uri: Uri): OutputStream? {
return try {
Log.i(TAG, "uri: $uri")
contentResolver.openOutputStream(uri)
} catch (e: Exception) {
e.printStackTrace()
activity.showErrorToast(e)
null
}
}
@ -116,7 +133,6 @@ class MediaOutputHelper(
private fun getFileDescriptorMediaOutput(): MediaOutput.FileDescriptorMediaOutput? {
var mediaOutput: MediaOutput.FileDescriptorMediaOutput? = null
val canWrite = canWriteToFilePath(mediaStorageDir)
Log.i(TAG, "getMediaOutput: canWrite=${canWrite}")
if (canWrite) {
val path = activity.getOutputMediaFile(false)
val uri = getUriForFilePath(path)
@ -127,16 +143,27 @@ class MediaOutputHelper(
}
}
}
Log.i(TAG, "FileDescriptorMediaOutput: $mediaOutput")
return mediaOutput
}
private fun getFileMediaOutput(): MediaOutput.FileMediaOutput? {
var mediaOutput: MediaOutput.FileMediaOutput? = null
val canWrite = canWriteToFilePath(mediaStorageDir)
if (canWrite) {
val path = activity.getOutputMediaFile(false)
val uri = getUriForFilePath(path)
if (uri != null) {
mediaOutput = MediaOutput.FileMediaOutput(File(path), uri)
}
}
return mediaOutput
}
private fun openFileDescriptor(uri: Uri): ParcelFileDescriptor? {
return try {
Log.i(TAG, "uri: $uri")
contentResolver.openFileDescriptor(uri, MODE)
} catch (e: Exception) {
e.printStackTrace()
activity.showErrorToast(e)
null
}
}
@ -178,7 +205,6 @@ class MediaOutputHelper(
documentFile.createFile(path.getMimeType(), path.getFilenameFromPath())?.uri
}
} catch (e: Exception) {
e.printStackTrace()
null
}
}
@ -187,7 +213,6 @@ class MediaOutputHelper(
try {
activity.createDocumentUriUsingFirstParentTreeUri(path)
} catch (e: Exception) {
e.printStackTrace()
null
} ?: Uri.fromFile(targetFile)
}

View File

@ -1,6 +1,5 @@
package com.simplemobiletools.camera.helpers
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.CameraSelector
import androidx.camera.lifecycle.ProcessCameraProvider
@ -11,13 +10,13 @@ import com.simplemobiletools.camera.extensions.toCameraXQuality
import com.simplemobiletools.camera.extensions.toVideoQuality
import com.simplemobiletools.camera.models.CameraSelectorVideoQualities
import com.simplemobiletools.camera.models.VideoQuality
import com.simplemobiletools.commons.extensions.showErrorToast
class VideoQualityManager(
private val activity: AppCompatActivity,
) {
companion object {
private const val TAG = "VideoQualityHelper"
private val QUALITIES = listOf(Quality.UHD, Quality.FHD, Quality.HD, Quality.SD)
private val CAMERA_SELECTORS = arrayOf(CameraSelector.DEFAULT_BACK_CAMERA, CameraSelector.DEFAULT_FRONT_CAMERA)
}
@ -37,12 +36,10 @@ class VideoQualityManager(
.also { allQualities ->
val qualities = allQualities.map { it.toVideoQuality() }
videoQualities.add(CameraSelectorVideoQualities(camSelector, qualities))
}
Log.i(TAG, "bindCameraUseCases: videoQualities=$videoQualities")
}
} catch (e: Exception) {
Log.e(TAG, "Camera Face $camSelector is not supported", e)
activity.showErrorToast(e)
}
}
}
@ -51,7 +48,7 @@ class VideoQualityManager(
fun getUserSelectedQuality(cameraSelector: CameraSelector): Quality {
var selectionIndex = if (cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA) config.frontVideoResIndex else config.backVideoResIndex
selectionIndex = selectionIndex.coerceAtLeast(0)
return getSupportedQualities(cameraSelector)[selectionIndex].toCameraXQuality()
return getSupportedQualities(cameraSelector).getOrElse(selectionIndex) { VideoQuality.HD }.toCameraXQuality()
}
fun getSupportedQualities(cameraSelector: CameraSelector): List<VideoQuality> {

View File

@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import android.content.Context
import android.hardware.SensorManager
import android.hardware.display.DisplayManager
import android.util.Log
import android.util.Size
import android.view.*
import android.view.GestureDetector.SimpleOnGestureListener
@ -43,7 +42,6 @@ class CameraXPreview(
) : MyPreview, DefaultLifecycleObserver {
companion object {
private const val TAG = "CameraXPreview"
private const val RATIO_4_3_VALUE = 4.0 / 3.0
private const val RATIO_16_9_VALUE = 16.0 / 9.0
@ -75,7 +73,6 @@ class CameraXPreview(
in 225 until 315 -> Surface.ROTATION_90
else -> Surface.ROTATION_0
}
Log.i(TAG, "onOrientationChanged: rotation=$rotation")
preview?.targetRotation = rotation
imageCapture?.targetRotation = rotation
videoCapture?.targetRotation = rotation
@ -91,9 +88,7 @@ class CameraXPreview(
private var recordingState: VideoRecordEvent? = null
private var cameraSelector = config.lastUsedCameraLens.toCameraSelector()
private var flashMode = FLASH_MODE_OFF
private var isPhotoCapture = initInPhotoMode.also {
Log.i(TAG, "initInPhotoMode= $it")
}
private var isPhotoCapture = initInPhotoMode
init {
bindToLifeCycle()
@ -108,7 +103,6 @@ class CameraXPreview(
}
private fun startCamera(switching: Boolean = false) {
Log.i(TAG, "startCamera: ")
imageQualityManager.initSupportedQualities()
val cameraProviderFuture = ProcessCameraProvider.getInstance(activity)
@ -120,7 +114,6 @@ class CameraXPreview(
bindCameraUseCases()
setupCameraObservers()
} catch (e: Exception) {
Log.e(TAG, "startCamera: ", e)
val errorMessage = if (switching) R.string.camera_switch_error else R.string.camera_open_error
activity.toast(errorMessage)
}
@ -197,9 +190,6 @@ class CameraXPreview(
.apply {
imageQualityManager.getUserSelectedResolution(cameraSelector)?.let { resolution ->
val rotatedResolution = getRotatedResolution(rotation, resolution)
Log.i(TAG, "buildImageCapture: rotation=$rotation")
Log.i(TAG, "buildImageCapture: resolution=$resolution")
Log.i(TAG, "buildImageCapture: rotatedResolution=$rotatedResolution")
setTargetResolution(rotatedResolution)
} ?: setTargetAspectRatio(aspectRatio)
}
@ -255,7 +245,6 @@ class CameraXPreview(
@SuppressLint("ClickableViewAccessibility")
// source: https://stackoverflow.com/a/60095886/10552591
private fun setupZoomAndFocus() {
Log.i(TAG, "camera controller: ${previewView.controller}")
val scaleGesture = camera?.let { ScaleGestureDetector(activity, PinchToZoomOnScaleGestureListener(it.cameraInfo, it.cameraControl)) }
val gestureDetector = GestureDetector(activity, object : SimpleOnGestureListener() {
override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
@ -263,7 +252,6 @@ class CameraXPreview(
val display = displayManager.getDisplay(Display.DEFAULT_DISPLAY)
val width = previewView.width.toFloat()
val height = previewView.height.toFloat()
Log.i(TAG, "onSingleTapConfirmed: width=$width,height=$height")
val factory = DisplayOrientedMeteringPointFactory(display, it, width, height)
val xPos = event.x
val yPos = event.y
@ -275,13 +263,11 @@ class CameraXPreview(
.build()
camera?.cameraControl?.startFocusAndMetering(focusMeteringAction)
listener.onFocusCamera(xPos, yPos)
Log.i(TAG, "start focus")
true
} ?: false
}
})
previewView.setOnTouchListener { _, event ->
Log.i(TAG, "setOnTouchListener: x=${event.x}, y=${event.y}")
gestureDetector.onTouchEvent(event)
scaleGesture?.onTouchEvent(event)
true
@ -405,7 +391,6 @@ class CameraXPreview(
}
private fun handleImageCaptureError(exception: ImageCaptureException) {
Log.e(TAG, "Error", exception)
listener.toggleBottomButtons(false)
cameraErrorHandler.handleImageCaptureError(exception.imageCaptureError)
}
@ -421,17 +406,15 @@ class CameraXPreview(
}
override fun toggleRecording() {
Log.d(TAG, "toggleRecording: currentRecording=$currentRecording, recordingState=$recordingState")
if (currentRecording == null || recordingState is VideoRecordEvent.Finalize) {
startRecording()
} else {
currentRecording?.stop()
currentRecording = null
Log.d(TAG, "Recording stopped")
}
}
@SuppressLint("MissingPermission")
@SuppressLint("MissingPermission", "NewApi")
private fun startRecording() {
val videoCapture = videoCapture ?: throw IllegalStateException("Camera initialization failed.")
@ -441,6 +424,10 @@ class CameraXPreview(
FileDescriptorOutputOptions.Builder(mediaOutput.fileDescriptor).build()
.let { videoCapture.output.prepareRecording(activity, it) }
}
is MediaOutput.FileMediaOutput -> {
FileOutputOptions.Builder(mediaOutput.file).build()
.let { videoCapture.output.prepareRecording(activity, it) }
}
is MediaOutput.MediaStoreOutput -> {
MediaStoreOutputOptions.Builder(contentResolver, mediaOutput.contentUri).setContentValues(mediaOutput.contentValues).build()
.let { videoCapture.output.prepareRecording(activity, it) }
@ -450,7 +437,6 @@ class CameraXPreview(
currentRecording = recording.withAudioEnabled()
.start(mainExecutor) { recordEvent ->
Log.d(TAG, "recordEvent=$recordEvent ")
recordingState = recordEvent
when (recordEvent) {
is VideoRecordEvent.Start -> {
@ -466,7 +452,6 @@ class CameraXPreview(
playStopVideoRecordingSoundIfEnabled()
listener.onVideoRecordingStopped()
if (recordEvent.hasError()) {
Log.e(TAG, "recording failed:", recordEvent.cause)
cameraErrorHandler.handleVideoRecordingError(recordEvent.error)
} else {
listener.onMediaSaved(mediaOutput.uri ?: recordEvent.outputResults.outputUri)
@ -474,7 +459,6 @@ class CameraXPreview(
}
}
}
Log.d(TAG, "Recording started")
}
private fun playShutterSoundIfEnabled() {

View File

@ -3,6 +3,7 @@ package com.simplemobiletools.camera.models
import android.content.ContentValues
import android.net.Uri
import android.os.ParcelFileDescriptor
import java.io.File
import java.io.OutputStream
sealed class MediaOutput(
@ -23,5 +24,10 @@ sealed class MediaOutput(
override val uri: Uri,
) : MediaOutput(uri)
data class FileMediaOutput(
val file: File,
override val uri: Uri,
) : MediaOutput(uri)
object BitmapOutput : MediaOutput(null)
}

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/view_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -10,7 +11,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
<View
android:id="@+id/capture_black_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -21,7 +22,8 @@
android:id="@+id/settings"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:contentDescription="@string/settings"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_settings_cog_vector" />
@ -30,7 +32,8 @@
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_below="@+id/settings"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:contentDescription="@string/toggle_photo_video"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_video_vector" />
@ -39,7 +42,8 @@
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_below="@+id/toggle_photo_video"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:contentDescription="@string/resolution"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_resolution_vector" />
@ -48,13 +52,15 @@
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_below="@+id/change_resolution"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:contentDescription="@string/view_last_media"
android:padding="@dimen/medium_margin" />
<LinearLayout
android:id="@+id/btn_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center_horizontal|bottom">
@ -63,6 +69,7 @@
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_weight="1"
android:contentDescription="@string/toggle_camera"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_camera_front_vector" />
@ -71,6 +78,7 @@
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_weight="1"
android:contentDescription="@string/shutter"
android:src="@drawable/ic_shutter_vector" />
<ImageView
@ -78,6 +86,7 @@
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_weight="1"
android:contentDescription="@string/toggle_flash"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_flash_off_vector" />
@ -89,8 +98,8 @@
android:layout_height="wrap_content"
android:layout_above="@+id/btn_holder"
android:layout_centerHorizontal="true"
android:text="00:00"
android:textColor="@android:color/white"
android:visibility="gone" />
android:visibility="gone"
tools:text="00:00" />
</RelativeLayout>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">تم تمكين وضع عدم الإزعاج. يرجى تعطيله والمحاولة مرة أخرى</string>
<string name="photo_capture_failed">فشل التقاط الصور</string>
<string name="video_capture_insufficient_storage_error">فشل تسجيل الفيديو بسبب عدم كفاية مساحة التخزين</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">ما هي جودة ضغط الصور التي يجب تعيينها؟</string>
<string name="faq_1_text">ذلك يعتمد على هدفك. لأغراض عامة ينصح معظم الناس باستخدام 75٪ -80٪، عندما تكون الصورة لا تزال ذات نوعية جيدة حقا، ولكن يتم تقليل حجم الملف بشكل كبير مقارنة مع 100٪.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Şəkli hansı keyfiyyətdə yaddaşa salmalıyam?</string>
<string name="faq_1_text">Ümumiyyətlə, özünüzdən asılıdır. Gündəlik istifadə üçün çoxları 75%-80%\'i tövsiyyə edir, hansı ki, bu parametrdə şəkil hələ də yaxşı görünür, amma fayl ölçüsü 100%\'ə nəzərən kiçilmişdir.</string>

View File

@ -21,6 +21,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">What photo compression quality should I set?</string>
<string name="faq_1_text">It depends on your goal. For generic purposes most people advise using 75%-80%, when the image is still really good quality, but the file size is reduced drastically compared to 100%.</string>

View File

@ -18,6 +18,13 @@
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Колко трябва да компресирам качеството на снимките\?</string>
<string name="faq_1_text">Зависи. За общо ползване повечето хора съветват да 75%-80%, като изображението все още е с наистина добро качество, но размерът на файла е драстично намален в сравнение със 100%.</string>
@ -42,4 +49,4 @@
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -12,12 +12,20 @@
<string name="photo_not_saved">No s\'ha pogut desar la foto</string>
<string name="setting_resolution_failed">No s\'ha pogut establir la resolució adequada</string>
<string name="video_recording_failed">Ha fallat la gravació de vídeo, proveu d\'utilitzar una resolució diferent</string>
<string name="camera_in_use_error">Una altra aplicació està utilitzant la càmera; tanqueu l\'aplicació i torneu-ho a provar</string>
<string name="camera_configure_error">S\'ha produït un error en configurar la càmera</string>
<string name="camera_disabled_by_admin_error">L\'administrador ha desactivat la càmera</string>
<string name="camera_dnd_error">El mode «No molestis» està activat. Desactiveu-lo i torneu-ho a provar</string>
<string name="photo_capture_failed">Ha fallat la captura de la foto</string>
<string name="video_capture_insufficient_storage_error">Ha fallat la gravació del vídeo a causa d\'un emmagatzematge insuficient</string>
<string name="camera_in_use_error">Camera is in use by another app, please close the app and try again</string>
<string name="camera_configure_error">An error occurred while configuring the camera</string>
<string name="camera_disabled_by_admin_error">Camera is disabled by the admin</string>
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Quina qualitat de compressió fotogràfica he d\'establir\?</string>
<string name="faq_1_text">Depèn del vostre objectiu. Amb finalitats genèriques, la majoria de la gent aconsella utilitzar un 75%-80%, quan la imatge encara és de molt bona qualitat, però la mida del fitxer es redueix dràsticament en comparació amb el 100%.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Jakou kvalitu fotek bych měl použít?</string>
<string name="faq_1_text">Záleží to na vášem cíli. Pro obecné účely doporučuje většina lidí 75%-80%, kdy je kvalita fotek stále vysoká, ale výsledný soubor má o mnoho menší velikost v porovnání se 100% kvalitou.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Pa ansawdd cywasgu llun dylwn ei osod?</string>
<string name="faq_1_text">Mae\'n dibynnu ar dy bwrpas. Ar gyfer defnydd cyffredin, argymhellir defnyddio 75%-80% fel bod safon y llun yn dal i fod yn dda iawn ond bydd maint y ffeil yn dipyn llai na 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Hvilken fotokomprimeringskvalitet skal jeg anvende\?</string>
<string name="faq_1_text">Det afhænger af dit mål. Til almindelige formål anbefaler de fleste at bruge 75-80 %, hvor billedet stadig har en rigtig god kvalitet, men hvor filstørrelsen er reduceret drastisk i forhold til 100 %.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">Der „Bitte nicht stören“-Modus ist aktiviert. Bitte deaktivieren Sie ihn und versuchen Sie es erneut</string>
<string name="photo_capture_failed">Fotoaufnahme fehlgeschlagen</string>
<string name="video_capture_insufficient_storage_error">Videoaufzeichnung aufgrund unzureichender Speicherkapazität fehlgeschlagen</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Was für eine Fotokomprimierungsqualität soll ich einstellen?</string>
<string name="faq_1_text">Das hängt von deinem Ziel ab. Für allgemeine Zwecke empfehlen die meisten 75 - 80 %, wodurch die Qualität immer noch sehr gut bleibt, aber die Dateigrösse drastisch reduziert ist im Vergleich zu 100 %.</string>
@ -42,4 +50,4 @@
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Αποτυχία λήψης φωτογραφιών</string>
<string name="video_capture_insufficient_storage_error">Η εγγραφή βίντεο απέτυχε λόγω ανεπαρκούς αποθηκευτικού χώρου</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Ποια ποιότητα συμπίεσης φωτογραφιών πρέπει να ορίσω;</string>
<string name="faq_1_text">Εξαρτάται από το στόχο σας. Για γενικούς σκοπούς, οι περισσότεροι συμβουλεύουν τη χρήση του 75%-80%, όταν η εικόνα εξακολουθεί να είναι πραγματικά καλής ποιότητας, αλλά το μέγεθος του αρχείου μειώνεται δραστικά σε σύγκριση με το 100%.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">What photo compression quality should I set?</string>
<string name="faq_1_text">It depends on your goal. For generic purposes most people advise using 75%-80%, when the image is still really good quality, but the file size is reduced drastically compared to 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">¿Qué calidad de compresión de foto debería establecer?</string>
<string name="faq_1_text">Depende de tu objetivo. Para propósitos generales, la mayoría de las personas aconsejan usar 75%-80%, y la imagen seguirá siendo de calidad realmente buena, pero el tamaño del archivo es reducido drásticamente comparado con el 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">Ära häiri režiim on sisse lülitatud. Palun lülita see välja ja proovi uuesti</string>
<string name="photo_capture_failed">Foto jäädvustamine ei õnnestunud</string>
<string name="video_capture_insufficient_storage_error">Video salvestamine ei õnnestunud ebapiisava salvestusruumi tõttu</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Missugust piltide pakkimise kvaliteeti peaksin kasutama\?</string>
<string name="faq_1_text">See sõltub sinu eesmärkidest. Üldiselt soovitame 75-80-protsendilist pakkimist, mispuhul piltide kvaliteet on jätkuvalt mõistlik, kuid piltide suurus on 100-protsendilise kvaliteediga võrreldes väiksem.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Mitä valokuvan pakkauslaatua minun pitäisi käyttää?</string>
<string name="faq_1_text">Se riippuu tarkoituksestasi. Yleisissä tarkoituksissa useimmat ihmiset suosittelevat käyttämään 75-80%, kun kuva on edelleen todella hyvälaatuinen, mutta tiedoston koko pienenee huomattavasti verrattuna 100%:iin.</string>
@ -42,4 +50,4 @@
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">Le mode Ne pas déranger est activé. Veuillez le désactiver et réessayer</string>
<string name="photo_capture_failed">Échec de la prise de photo</string>
<string name="video_capture_insufficient_storage_error">L\'enregistrement vidéo a échoué en raison d\'un stockage insuffisant</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Quelle valeur devrais-je mettre pour la qualité des photos \?</string>
<string name="faq_1_text">Tout dépend de ce que vous voulez en faire. Pour la plupart des usages, il est recommandé entre 75 et 80 %, ce qui est reste de qualité acceptable, tout en générant un fichier de taille bien inférieure à une photo avec une qualité de 100 %.</string>
@ -42,4 +50,4 @@
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Que calidade de compresión debo escoller para a foto?</string>
<string name="faq_1_text">Depende do obxectivo. Para uso xeral a maioría das persoas usuarias recomendan entre un 75%-80%, que é un valor bastante bo, pero o tamaño do ficheiro redúcese drasticamente comparado co 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">Modus „Ne smetaj” je aktiviran. Deaktiviraj ga i pokušaj ponovo</string>
<string name="photo_capture_failed">Snimanje fotografije nije uspjelo</string>
<string name="video_capture_insufficient_storage_error">Snimanje videa nije uspjelo zbog nedovoljne memorije</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Koju kvalitetu kompresije fotografija trebam postaviti\?</string>
<string name="faq_1_text">Ovisi o tvom cilju. Za opće namjene, većina ljudi savjetuje korištenje 75 do 80 % kad je slika dobre kvalitete, ali se veličina datoteke drastično smanjuje u usporedbi sa 100 %.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">What photo compression quality should I set?</string>
<string name="faq_1_text">It depends on your goal. For generic purposes most people advise using 75%-80%, when the image is still really good quality, but the file size is reduced drastically compared to 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">Mode Jangan Ganggu diaktifkan. Silakan nonaktifkan dan coba lagi</string>
<string name="photo_capture_failed">Gagal mengambil foto</string>
<string name="video_capture_insufficient_storage_error">Gagal merekam video karena penyimpanan tidak cukup</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Kualitas kompresi foto mana yang harus saya gunakan?</string>
<string name="faq_1_text">Tergantung tujuan anda. Untuk hal-hal yang umum direkomendasikan menggunakan 75%-80%, kualitas gambar masih sangat bagus, tetapi ukuran berkas berkurang signifikan dibandingkan dengan 100%.</string>
@ -42,4 +50,4 @@
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">La modalità non disturbare è abilitata. Disabilitare e riprovare</string>
<string name="photo_capture_failed">Acquisizione di foto non riuscita</string>
<string name="video_capture_insufficient_storage_error">Registrazione video non riuscita a causa dello spazio d\'archiviazione insufficiente</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Che qualità di compressione dovrei impostare?</string>
<string name="faq_1_text">Dipende dal proprio obiettivo. In genere si consiglia di utilizzare una qualità del 75%-80%, in modo che l\'immagine sia ancora di ottima qualità, ma la dimensione del file viene ridotta drasticamente rispetto al 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">איזו איכות דחיסת תמונה עלי להגדיר\?</string>
<string name="faq_1_text">זה תלוי במטרה שלך. למטרות כלליות רוב האנשים ממליצים להשתמש ב-75%-80%, כאשר התמונה עדיין באיכות טובה, אך גודל הקובץ מצטמצם באופן דרסטי בהשוואה ל-100%.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">写真の圧縮品質はどのように設定すればよいですか?</string>
<string name="faq_1_text">これはあなたの求める目標によります。一般的な用途には、75%80%の使用をおすすめします。この設定でも画像は十分に良い品質ですが、ファイルサイズは100%と比べて大幅に削減することができます。</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">사진 압축품질을 무엇으로 설정해야 하나요?</string>
<string name="faq_1_text">압축품질은 촬영용도에 따라 달라질 수 있지만, 일반적으로 75% -80%를 사용하도록 권고합니다. 75% -80%로 압축 품질을 설정하면 파일 크기는 100%에 비해 크게 줄어듭니다.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Kokią nuotraukos suspaudimo kokybę turėčiau nustatyti?</string>
<string name="faq_1_text">Tai priklauso nuo Jūsų tikslų. Įprastiems tikslams dauguma žmonių pataria naudoti 75%-80%, kai nuotrauka vistiek yra geros kokybės, bet bylos dydis sumažėja kardinaliai palyginus su 100%.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">ഏത് ഫോട്ടോ കംപ്രഷനാണ് ഞാൻ ഉപയോഗിക്കേണ്ടത്?</string>
<string name="faq_1_text">It depends on your goal. For generic purposes most people advise using 75%-80%, when the image is still really good quality, but the file size is reduced drastically compared to 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Hvilket bildekomprimeringsnivå bør jeg bruke\?</string>
<string name="faq_1_text">Det avhenger av hva du vil. Til alminnelige formål anbefales 75%-80%. Fremdeles god kvalitet, men vesentlig redusert filstørrelse sammenlignet med 100%.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">मैले कस्तो फोटो खदाईको गुणस्तर स्थापित गर्नुपर्छ ?</string>
<string name="faq_1_text">यो तपाईको चाहानामा भर पर्छ । सामान्यतया सबैले 75%-80% मा प्रयोग गर्छन, जब तस्बिर राम्रो गुणस्तरको छ, तर 100% को तुलनामा फाईल साईज अस्वभाविक रुपले घट्छ </string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">De modus \"Niet storen\" is ingeschakeld. Schakel deze uit en probeer het nog eens.</string>
<string name="photo_capture_failed">Foto-opname mislukt</string>
<string name="video_capture_insufficient_storage_error">Video-opname mislukt door onvoldoende opslag</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Welke kwaliteit voor foto\'s moet ik instellen?</string>
<string name="faq_1_text">Voor normaal gebruik adviseren de meeste mensen een compressie van 75%-80%. De afbeelding zal dan nog steeds van goede kwaliteit zijn en de bestandsgrootte zal enorm veel kleiner zijn dan met 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">Tryb Nie przeszkadzać jest włączony. Wyłącz go i spróbuj ponownie.</string>
<string name="photo_capture_failed">Nie udało się zrobić zdjęcia</string>
<string name="video_capture_insufficient_storage_error">Nagrywanie wideo nie powiodło się z powodu niewystarczającej ilości miejsca</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Jaką jakość kompresji zdjęć powinienem ustawić\?</string>
<string name="faq_1_text">Zależy to od Twojego celu. Do celów ogólnych większość ludzi zaleca poziom 75-80% — wtedy obraz jest nadal w dobrej jakości, ale rozmiar pliku znacznie zmniejsza się w porównaniu do 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">O modo Não perturbe está ativado. Desative e tente novamente</string>
<string name="photo_capture_failed">Erro ao tirar foto</string>
<string name="video_capture_insufficient_storage_error">Erro ao gravar vídeo devido a armazenamento insuficiente</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Que qualidade de compressão de imagem devo definir\?</string>
<string name="faq_1_text">Depende de seu objetivo. Para fins genéricos, aconselha-se o uso de 75%-80%, no qual a imagem ainda apresenta boa qualidade, porém tamanho drasticamente reduzido em comparação a 100%.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">What photo compression quality should I set?</string>
<string name="faq_1_text">It depends on your goal. For generic purposes most people advise using 75%-80%, when the image is still really good quality, but the file size is reduced drastically compared to 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Que qualidade de compressão de imagem devo definir?</string>
<string name="faq_1_text">Depende de seu objetivo. Para fins genéricos, aconselha-se o uso de 75%-80%, no qual a imagem ainda apresenta boa qualidade, porém tamanho drasticamente reduzido em comparação a 100%.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Ce calitate de compresie a fotografiilor ar trebui să setez?</string>
<string name="faq_1_text">Depinde de obiectivul dumneavoastră. În general, majoritatea oamenilor recomandă utilizarea a 75%-80%, atunci când calitatea imaginii este foarte bună, dar dimensiunea fișierului este redusă drastic în comparație cu 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">Включён режим \"Не беспокоить\", отключите и повторите попытку</string>
<string name="photo_capture_failed">Не удалось сделать снимок</string>
<string name="video_capture_insufficient_storage_error">Запись видео не удалась из-за нехватки памяти</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Какое качество сжатия фото нужно установить?</string>
<string name="faq_1_text">Это зависит от вашей цели. В общем случае большинство людей советуют использовать 75%-80%, тогда изображение всё ещё действительно хорошего качества, но размер файла резко уменьшается по сравнению со 100%.</string>

View File

@ -19,6 +19,13 @@
<string name="photo_capture_failed">Snímanie fotografie zlyhalo</string>
<string name="video_capture_insufficient_storage_error">Nahrávanie videa zlyhalo pre nedostatok miesta</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Akú kvalitu fotiek by som mal použiť?</string>
<string name="faq_1_text">Záleží to od vášho cieľa. Pre všeobecné použitie odporúča väčšina ľudí 75%-80% kedy je kvalita fotiek stále vysoká, ale výsledný súbor má oveľa menšiu veľkosť v porovnaní so 100% kvalitou.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Vilken kvalitet för fotokomprimering ska jag ställa in\?</string>
<string name="faq_1_text">Det beror på ditt mål. För generiska ändamål rekommenderar de flesta att man använder 75-80 %, då bilden fortfarande har riktigt bra kvalitet, men filstorleken minskar drastiskt jämfört med 100 %.</string>

View File

@ -21,6 +21,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">What photo compression quality should I set?</string>
<string name="faq_1_text">It depends on your goal. For generic purposes most people advise using 75%-80%, when the image is still really good quality, but the file size is reduced drastically compared to 100%.</string>

View File

@ -18,6 +18,13 @@
<string name="camera_dnd_error">Rahatsız Etmeyin modu etkinleştirildi. Lütfen devre dışı bırakın ve tekrar deneyin</string>
<string name="photo_capture_failed">Fotoğraf çekimi başarısız oldu</string>
<string name="video_capture_insufficient_storage_error">Yetersiz depolama alanı nedeniyle video kaydı başarısız oldu</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Hangi fotoğraf sıkıştırma kalitesini ayarlamalıyım?</string>
<string name="faq_1_text">Hedefinize bağlı. Genel amaçlar için çoğu kişi %75-%80\'i kullanmanızı önerir, görüntü hala gerçekten kaliteliyken, dosya boyutu %100\'e göre büyük ölçüde azalır.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">Увімкнено режим «Не турбувати». Будь ласка, вимкніть і спробуйте знову</string>
<string name="photo_capture_failed">Не вдалося зняти світлину</string>
<string name="video_capture_insufficient_storage_error">Через нестачу пам’яті не вдалося записати відео</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">Який ступінь стиснення фото слід встановити?</string>
<string name="faq_1_text">Це залежить від вашої мети. Загалом більшість людей радять використовувати 75%-80%, тоді зображення ще дійсно гарної якості, але розмір файлу істотно зменшується порівняно зі 100%.</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">勿扰模式处于开启状态。 请禁用并重试</string>
<string name="photo_capture_failed">照片拍摄失败</string>
<string name="video_capture_insufficient_storage_error">由于存储空间不足,视频录制失败</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">我应该选用怎样的照片压缩率呢?</string>
<string name="faq_1_text">这取决于您的目的。对大多数人的一般用途来说,建议使用 75%-80%,此时图片仍有不错的品质,而文件大小相比 100% 时大幅减小。</string>

View File

@ -18,6 +18,14 @@
<string name="camera_dnd_error">零打擾模式已啟用,請將其停用後再試一次</string>
<string name="photo_capture_failed">拍照失敗</string>
<string name="video_capture_insufficient_storage_error">儲存空間不足,錄影失敗</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">我應該設定什麼相片壓縮品質?</string>
<string name="faq_1_text">視你目標而定。對大多數一般人而言建議使用75%-80%圖片依然是相當高品質但檔案大小比100%大幅減少很多。</string>
@ -42,4 +50,4 @@
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -21,6 +21,13 @@
<string name="photo_capture_failed">Photo capture failed</string>
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</string>
<!--Camera Screen Icons Content Description-->
<string name="toggle_photo_video">Toggle photo/video mode</string>
<string name="change_resolution">Change Resolution</string>
<string name="view_last_media">View last captured media</string>
<string name="toggle_camera">Toggle front/back camera</string>
<string name="toggle_flash">Toggle the flashlight mode</string>
<!-- FAQ -->
<string name="faq_1_title">What photo compression quality should I set?</string>
<string name="faq_1_text">It depends on your goal. For generic purposes most people advise using 75%-80%, when the image is still really good quality, but the file size is reduced drastically compared to 100%.</string>