mirror of
https://github.com/SimpleMobileTools/Simple-Camera.git
synced 2025-02-01 07:46:43 +01:00
Merge pull request #332 from KryptKode/feat/camera-x
CameraX - Fix some warnings
This commit is contained in:
commit
b9c4d38465
@ -34,7 +34,7 @@ android {
|
|||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
debug {
|
debug {
|
||||||
applicationIdSuffix ".debugcamerax"
|
applicationIdSuffix ".debug"
|
||||||
}
|
}
|
||||||
release {
|
release {
|
||||||
minifyEnabled true
|
minifyEnabled true
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<!--TODO Revert to Camera_debug -->
|
<string name="app_launcher_name">Camera_debug</string>
|
||||||
<string name="app_launcher_name">CameraX_debug</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -7,8 +7,8 @@ import android.hardware.SensorManager
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import android.util.Log
|
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import android.widget.RelativeLayout
|
import android.widget.RelativeLayout
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
@ -31,9 +31,10 @@ import java.util.concurrent.TimeUnit
|
|||||||
import kotlinx.android.synthetic.main.activity_main.*
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
|
|
||||||
class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, CameraXPreviewListener {
|
class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, CameraXPreviewListener {
|
||||||
private val TAG = "MainActivity"
|
companion object {
|
||||||
private val FADE_DELAY = 5000L
|
private const val FADE_DELAY = 5000L
|
||||||
private val CAPTURE_ANIMATION_DURATION = 100L
|
private const val CAPTURE_ANIMATION_DURATION = 100L
|
||||||
|
}
|
||||||
|
|
||||||
lateinit var mTimerHandler: Handler
|
lateinit var mTimerHandler: Handler
|
||||||
private lateinit var mOrientationEventListener: OrientationEventListener
|
private lateinit var mOrientationEventListener: OrientationEventListener
|
||||||
@ -49,14 +50,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
private var mCurrVideoRecTimer = 0
|
private var mCurrVideoRecTimer = 0
|
||||||
var mLastHandledOrientation = 0
|
var mLastHandledOrientation = 0
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
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
|
useDynamicTheme = false
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
appLaunched(BuildConfig.APPLICATION_ID)
|
appLaunched(BuildConfig.APPLICATION_ID)
|
||||||
@ -67,6 +62,22 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
supportActionBar?.hide()
|
supportActionBar?.hide()
|
||||||
checkWhatsNewDialog()
|
checkWhatsNewDialog()
|
||||||
setupOrientationEventListener()
|
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() {
|
override fun onResume() {
|
||||||
@ -109,15 +120,12 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
|
|
||||||
private fun initVariables() {
|
private fun initVariables() {
|
||||||
mIsInPhotoMode = if (isVideoCaptureIntent()) {
|
mIsInPhotoMode = if (isVideoCaptureIntent()) {
|
||||||
Log.w(TAG, "initializeCamera: video capture")
|
|
||||||
false
|
false
|
||||||
} else if (isImageCaptureIntent()) {
|
} else if (isImageCaptureIntent()) {
|
||||||
Log.w(TAG, "initializeCamera: image capture mode")
|
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
config.initPhotoMode
|
config.initPhotoMode
|
||||||
}
|
}
|
||||||
Log.w(TAG, "initInPhotoMode = $mIsInPhotoMode")
|
|
||||||
mIsCameraAvailable = false
|
mIsCameraAvailable = false
|
||||||
mIsHardwareShutterHandled = false
|
mIsHardwareShutterHandled = false
|
||||||
mCurrVideoRecTimer = 0
|
mCurrVideoRecTimer = 0
|
||||||
@ -189,7 +197,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
|
|
||||||
private fun checkImageCaptureIntent() {
|
private fun checkImageCaptureIntent() {
|
||||||
if (isImageCaptureIntent()) {
|
if (isImageCaptureIntent()) {
|
||||||
Log.i(TAG, "isImageCaptureIntent: ")
|
|
||||||
hideIntentButtons()
|
hideIntentButtons()
|
||||||
val output = intent.extras?.get(MediaStore.EXTRA_OUTPUT)
|
val output = intent.extras?.get(MediaStore.EXTRA_OUTPUT)
|
||||||
if (output != null && output is Uri) {
|
if (output != null && output is Uri) {
|
||||||
@ -200,7 +207,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
|
|
||||||
private fun checkVideoCaptureIntent() {
|
private fun checkVideoCaptureIntent() {
|
||||||
if (intent?.action == MediaStore.ACTION_VIDEO_CAPTURE) {
|
if (intent?.action == MediaStore.ACTION_VIDEO_CAPTURE) {
|
||||||
Log.i(TAG, "checkVideoCaptureIntent: ")
|
|
||||||
mIsInPhotoMode = false
|
mIsInPhotoMode = false
|
||||||
hideIntentButtons()
|
hideIntentButtons()
|
||||||
shutter.setImageResource(R.drawable.ic_video_rec)
|
shutter.setImageResource(R.drawable.ic_video_rec)
|
||||||
@ -238,8 +244,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
mFocusCircleView = FocusCircleView(applicationContext)
|
mFocusCircleView = FocusCircleView(applicationContext)
|
||||||
view_holder.addView(mFocusCircleView)
|
view_holder.addView(mFocusCircleView)
|
||||||
|
|
||||||
mTimerHandler = Handler()
|
mTimerHandler = Handler(Looper.getMainLooper())
|
||||||
mFadeHandler = Handler()
|
mFadeHandler = Handler(Looper.getMainLooper())
|
||||||
setupPreviewImage(true)
|
setupPreviewImage(true)
|
||||||
|
|
||||||
val initialFlashlightState = FLASH_OFF
|
val initialFlashlightState = FLASH_OFF
|
||||||
@ -389,7 +395,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
|
|
||||||
mPreviewUri = Uri.withAppendedPath(uri, lastMediaId.toString())
|
mPreviewUri = Uri.withAppendedPath(uri, lastMediaId.toString())
|
||||||
|
|
||||||
Log.e(TAG, "mPreviewUri= $mPreviewUri")
|
|
||||||
|
|
||||||
loadLastTakenMedia(mPreviewUri)
|
loadLastTakenMedia(mPreviewUri)
|
||||||
}
|
}
|
||||||
@ -439,8 +444,13 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
view.isClickable = value != .0f
|
view.isClickable = value != .0f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
private fun hideNavigationBarIcons() {
|
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() {
|
private fun showTimer() {
|
||||||
@ -567,7 +577,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||||
setResult(Activity.RESULT_OK, this)
|
setResult(Activity.RESULT_OK, this)
|
||||||
}
|
}
|
||||||
Log.w(TAG, "onMediaCaptured: exiting uri=$uri")
|
|
||||||
finish()
|
finish()
|
||||||
} else if (isVideoCaptureIntent()) {
|
} else if (isVideoCaptureIntent()) {
|
||||||
Intent().apply {
|
Intent().apply {
|
||||||
@ -575,7 +584,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||||
setResult(Activity.RESULT_OK, this)
|
setResult(Activity.RESULT_OK, this)
|
||||||
}
|
}
|
||||||
Log.w(TAG, "onMediaCaptured: video exiting uri=$uri")
|
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -586,7 +594,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
putExtra("data", bitmap)
|
putExtra("data", bitmap)
|
||||||
setResult(Activity.RESULT_OK, this)
|
setResult(Activity.RESULT_OK, this)
|
||||||
}
|
}
|
||||||
Log.w(TAG, "onImageCaptured: exiting bitmap size=${bitmap.byteCount}")
|
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -645,7 +652,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
fun drawFocusCircle(x: Float, y: Float) = mFocusCircleView.drawFocusCircle(x, y)
|
fun drawFocusCircle(x: Float, y: Float) = mFocusCircleView.drawFocusCircle(x, y)
|
||||||
|
|
||||||
override fun mediaSaved(path: String) {
|
override fun mediaSaved(path: String) {
|
||||||
Log.e(TAG, "mediaSaved: $path")
|
|
||||||
rescanPaths(arrayListOf(path)) {
|
rescanPaths(arrayListOf(path)) {
|
||||||
setupPreviewImage(true)
|
setupPreviewImage(true)
|
||||||
Intent(BROADCAST_REFRESH_MEDIA).apply {
|
Intent(BROADCAST_REFRESH_MEDIA).apply {
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package com.simplemobiletools.camera.activities
|
package com.simplemobiletools.camera.activities
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
|
import androidx.core.content.res.ResourcesCompat
|
||||||
import com.simplemobiletools.camera.BuildConfig
|
import com.simplemobiletools.camera.BuildConfig
|
||||||
import com.simplemobiletools.camera.R
|
import com.simplemobiletools.camera.R
|
||||||
import com.simplemobiletools.camera.extensions.config
|
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.FAQItem
|
||||||
import com.simplemobiletools.commons.models.RadioItem
|
import com.simplemobiletools.commons.models.RadioItem
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
import kotlin.system.exitProcess
|
||||||
import kotlinx.android.synthetic.main.activity_settings.*
|
import kotlinx.android.synthetic.main.activity_settings.*
|
||||||
|
|
||||||
class SettingsActivity : SimpleActivity() {
|
class SettingsActivity : SimpleActivity() {
|
||||||
@ -77,7 +80,7 @@ class SettingsActivity : SimpleActivity() {
|
|||||||
|
|
||||||
// make sure the corners at ripple fit the stroke rounded corners
|
// make sure the corners at ripple fit the stroke rounded corners
|
||||||
if (settings_purchase_thank_you_holder.isGone()) {
|
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 {
|
settings_purchase_thank_you_holder.setOnClickListener {
|
||||||
@ -97,13 +100,13 @@ class SettingsActivity : SimpleActivity() {
|
|||||||
settings_use_english.isChecked = config.useEnglish
|
settings_use_english.isChecked = config.useEnglish
|
||||||
|
|
||||||
if (settings_use_english_holder.isGone() && settings_purchase_thank_you_holder.isGone()) {
|
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_holder.setOnClickListener {
|
||||||
settings_use_english.toggle()
|
settings_use_english.toggle()
|
||||||
config.useEnglish = settings_use_english.isChecked
|
config.useEnglish = settings_use_english.isChecked
|
||||||
System.exit(0)
|
exitProcess(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,8 +175,8 @@ class SettingsActivity : SimpleActivity() {
|
|||||||
settings_save_photos_holder.setOnClickListener {
|
settings_save_photos_holder.setOnClickListener {
|
||||||
FilePickerDialog(this, config.savePhotosFolder, false, showFAB = true) {
|
FilePickerDialog(this, config.savePhotosFolder, false, showFAB = true) {
|
||||||
val path = it
|
val path = it
|
||||||
handleSAFDialog(it) {
|
handleSAFDialog(it) { success ->
|
||||||
if (it) {
|
if (success) {
|
||||||
config.savePhotosFolder = path
|
config.savePhotosFolder = path
|
||||||
settings_save_photos.text = getLastPart(config.savePhotosFolder)
|
settings_save_photos.text = getLastPart(config.savePhotosFolder)
|
||||||
}
|
}
|
||||||
@ -206,6 +209,7 @@ class SettingsActivity : SimpleActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
private fun updatePhotoQuality(quality: Int) {
|
private fun updatePhotoQuality(quality: Int) {
|
||||||
settings_photo_quality.text = "$quality%"
|
settings_photo_quality.text = "$quality%"
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.simplemobiletools.camera.dialogs
|
package com.simplemobiletools.camera.dialogs
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
@ -28,7 +27,6 @@ class ChangeResolutionDialogX(
|
|||||||
private var dialog: AlertDialog? = null
|
private var dialog: AlertDialog? = null
|
||||||
private val config = activity.config
|
private val config = activity.config
|
||||||
|
|
||||||
private val TAG = "ChangeResolutionDialogX"
|
|
||||||
init {
|
init {
|
||||||
val view = LayoutInflater.from(activity).inflate(R.layout.dialog_change_resolution, null).apply {
|
val view = LayoutInflater.from(activity).inflate(R.layout.dialog_change_resolution, null).apply {
|
||||||
setupPhotoResolutionPicker(this)
|
setupPhotoResolutionPicker(this)
|
||||||
@ -57,7 +55,6 @@ class ChangeResolutionDialogX(
|
|||||||
view.change_resolution_photo_holder.setOnClickListener {
|
view.change_resolution_photo_holder.setOnClickListener {
|
||||||
RadioGroupDialog(activity, ArrayList(items), selectionIndex) {
|
RadioGroupDialog(activity, ArrayList(items), selectionIndex) {
|
||||||
selectionIndex = it as Int
|
selectionIndex = it as Int
|
||||||
Log.w(TAG, "setupPhotoResolutionPicker: selectionIndex=$it")
|
|
||||||
view.change_resolution_photo.text = items[selectionIndex].title
|
view.change_resolution_photo.text = items[selectionIndex].title
|
||||||
if (isFrontCamera) {
|
if (isFrontCamera) {
|
||||||
config.frontPhotoResIndex = it
|
config.frontPhotoResIndex = it
|
||||||
@ -80,8 +77,6 @@ class ChangeResolutionDialogX(
|
|||||||
|
|
||||||
var selectionIndex = if (isFrontCamera) config.frontVideoResIndex else config.backVideoResIndex
|
var selectionIndex = if (isFrontCamera) config.frontVideoResIndex else config.backVideoResIndex
|
||||||
selectionIndex = selectionIndex.coerceAtLeast(0)
|
selectionIndex = selectionIndex.coerceAtLeast(0)
|
||||||
Log.i(TAG, "videoResolutions=$videoResolutions")
|
|
||||||
Log.i(TAG, "setupVideoResolutionPicker: selectionIndex=$selectionIndex")
|
|
||||||
|
|
||||||
view.change_resolution_video_holder.setOnClickListener {
|
view.change_resolution_video_holder.setOnClickListener {
|
||||||
RadioGroupDialog(activity, ArrayList(items), selectionIndex) {
|
RadioGroupDialog(activity, ArrayList(items), selectionIndex) {
|
||||||
@ -91,7 +86,7 @@ class ChangeResolutionDialogX(
|
|||||||
if (isFrontCamera) {
|
if (isFrontCamera) {
|
||||||
config.frontVideoResIndex = selectionIndex
|
config.frontVideoResIndex = selectionIndex
|
||||||
} else {
|
} else {
|
||||||
config.backPhotoResIndex = selectionIndex
|
config.backVideoResIndex = selectionIndex
|
||||||
}
|
}
|
||||||
dialog?.dismiss()
|
dialog?.dismiss()
|
||||||
callback.invoke()
|
callback.invoke()
|
||||||
@ -99,6 +94,5 @@ class ChangeResolutionDialogX(
|
|||||||
}
|
}
|
||||||
val selectedItem = items.getOrNull(selectionIndex)
|
val selectedItem = items.getOrNull(selectionIndex)
|
||||||
view.change_resolution_video.text = selectedItem?.title
|
view.change_resolution_video.text = selectedItem?.title
|
||||||
Log.i(TAG, "setupVideoResolutionPicker: selectedItem=$selectedItem")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,14 +2,12 @@ package com.simplemobiletools.camera.helpers
|
|||||||
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.util.Log
|
|
||||||
import kotlin.math.ceil
|
import kotlin.math.ceil
|
||||||
import kotlin.math.floor
|
import kotlin.math.floor
|
||||||
import kotlin.math.sqrt
|
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
|
//inspired by https://android.googlesource.com/platform/packages/apps/Camera2/+/refs/heads/master/src/com/android/camera/util/CameraUtil.java#244
|
||||||
object BitmapUtils {
|
object BitmapUtils {
|
||||||
private const val TAG = "BitmapUtils"
|
|
||||||
private const val INLINE_BITMAP_MAX_PIXEL_NUM = 50 * 1024
|
private const val INLINE_BITMAP_MAX_PIXEL_NUM = 50 * 1024
|
||||||
|
|
||||||
fun makeBitmap(jpegData: ByteArray, maxNumOfPixels: Int = INLINE_BITMAP_MAX_PIXEL_NUM): Bitmap? {
|
fun makeBitmap(jpegData: ByteArray, maxNumOfPixels: Int = INLINE_BITMAP_MAX_PIXEL_NUM): Bitmap? {
|
||||||
@ -31,7 +29,6 @@ object BitmapUtils {
|
|||||||
options
|
options
|
||||||
)
|
)
|
||||||
} catch (ex: OutOfMemoryError) {
|
} catch (ex: OutOfMemoryError) {
|
||||||
Log.e(TAG, "Got oom exception ", ex)
|
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,20 +6,19 @@ import android.hardware.camera2.CameraCharacteristics
|
|||||||
import android.hardware.camera2.CameraManager
|
import android.hardware.camera2.CameraManager
|
||||||
import android.hardware.camera2.params.StreamConfigurationMap
|
import android.hardware.camera2.params.StreamConfigurationMap
|
||||||
import android.media.MediaRecorder
|
import android.media.MediaRecorder
|
||||||
import android.util.Log
|
|
||||||
import android.util.Size
|
import android.util.Size
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.camera.core.CameraSelector
|
import androidx.camera.core.CameraSelector
|
||||||
import com.simplemobiletools.camera.extensions.config
|
import com.simplemobiletools.camera.extensions.config
|
||||||
import com.simplemobiletools.camera.models.CameraSelectorImageQualities
|
import com.simplemobiletools.camera.models.CameraSelectorImageQualities
|
||||||
import com.simplemobiletools.camera.models.MySize
|
import com.simplemobiletools.camera.models.MySize
|
||||||
|
import com.simplemobiletools.commons.extensions.showErrorToast
|
||||||
|
|
||||||
class ImageQualityManager(
|
class ImageQualityManager(
|
||||||
activity: AppCompatActivity,
|
private val activity: AppCompatActivity,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "ImageQualityManager"
|
|
||||||
private const val MAX_VIDEO_WIDTH = 4096
|
private const val MAX_VIDEO_WIDTH = 4096
|
||||||
private const val MAX_VIDEO_HEIGHT = 2160
|
private const val MAX_VIDEO_HEIGHT = 2160
|
||||||
private val CAMERA_LENS = arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK)
|
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 imageSizes = configMap.getOutputSizes(ImageFormat.JPEG).map { MySize(it.width, it.height) }
|
||||||
val cameraSelector = lens.toCameraSelector()
|
val cameraSelector = lens.toCameraSelector()
|
||||||
imageQualities.add(CameraSelectorImageQualities(cameraSelector, imageSizes))
|
imageQualities.add(CameraSelectorImageQualities(cameraSelector, imageSizes))
|
||||||
Log.i(TAG, "initQualities: imageSizes=$imageSizes")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} 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 }
|
.sortedByDescending { it.pixels }
|
||||||
.distinctBy { it.pixels }
|
.distinctBy { it.pixels }
|
||||||
.map { Size(it.width, it.height) }
|
.map { Size(it.width, it.height) }
|
||||||
.also {
|
.getOrNull(index)
|
||||||
Log.i(TAG, "Resolutions: $it, index=$index")
|
|
||||||
}
|
|
||||||
.getOrNull(index).also {
|
|
||||||
Log.i(TAG, "getUserSelectedResolution: $it, index=$index")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getSupportedResolutions(cameraSelector: CameraSelector): List<MySize> {
|
fun getSupportedResolutions(cameraSelector: CameraSelector): List<MySize> {
|
||||||
|
@ -5,13 +5,14 @@ import android.net.Uri
|
|||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import android.os.ParcelFileDescriptor
|
import android.os.ParcelFileDescriptor
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import android.util.Log
|
|
||||||
import com.simplemobiletools.camera.extensions.config
|
import com.simplemobiletools.camera.extensions.config
|
||||||
import com.simplemobiletools.camera.extensions.getOutputMediaFile
|
import com.simplemobiletools.camera.extensions.getOutputMediaFile
|
||||||
import com.simplemobiletools.camera.extensions.getRandomMediaName
|
import com.simplemobiletools.camera.extensions.getRandomMediaName
|
||||||
import com.simplemobiletools.camera.models.MediaOutput
|
import com.simplemobiletools.camera.models.MediaOutput
|
||||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
|
import com.simplemobiletools.commons.helpers.isOreoPlus
|
||||||
|
import com.simplemobiletools.commons.helpers.isQPlus
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
|
|
||||||
@ -23,8 +24,8 @@ class MediaOutputHelper(
|
|||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "MediaOutputHelper"
|
|
||||||
private const val MODE = "rw"
|
private const val MODE = "rw"
|
||||||
|
private const val EXTERNAL_VOLUME = "external"
|
||||||
private const val IMAGE_MIME_TYPE = "image/jpeg"
|
private const val IMAGE_MIME_TYPE = "image/jpeg"
|
||||||
private const val VIDEO_MIME_TYPE = "video/mp4"
|
private const val VIDEO_MIME_TYPE = "video/mp4"
|
||||||
}
|
}
|
||||||
@ -53,44 +54,62 @@ class MediaOutputHelper(
|
|||||||
fun getVideoMediaOutput(): MediaOutput {
|
fun getVideoMediaOutput(): MediaOutput {
|
||||||
return if (is3rdPartyIntent) {
|
return if (is3rdPartyIntent) {
|
||||||
if (outputUri != null) {
|
if (outputUri != null) {
|
||||||
val fileDescriptor = openFileDescriptor(outputUri)
|
if (isOreoPlus()) {
|
||||||
if (fileDescriptor != null) {
|
val fileDescriptor = openFileDescriptor(outputUri)
|
||||||
MediaOutput.FileDescriptorMediaOutput(fileDescriptor, outputUri)
|
if (fileDescriptor != null) {
|
||||||
|
MediaOutput.FileDescriptorMediaOutput(fileDescriptor, outputUri)
|
||||||
|
} else {
|
||||||
|
errorHandler.showSaveToInternalStorage()
|
||||||
|
getMediaStoreOutput(isPhoto = false)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
errorHandler.showSaveToInternalStorage()
|
val path = activity.getRealPathFromURI(outputUri)
|
||||||
getMediaStoreOutput(isPhoto = false)
|
if (path != null) {
|
||||||
|
MediaOutput.FileMediaOutput(File(path), outputUri)
|
||||||
|
} else {
|
||||||
|
errorHandler.showSaveToInternalStorage()
|
||||||
|
getMediaStoreOutput(isPhoto = false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
getMediaStoreOutput(isPhoto = false)
|
getMediaStoreOutput(isPhoto = false)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
getFileDescriptorMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
|
if (isOreoPlus()) {
|
||||||
|
getFileDescriptorMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
|
||||||
|
} else {
|
||||||
|
getFileMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getMediaStoreOutput(isPhoto: Boolean): MediaOutput.MediaStoreOutput {
|
private fun getMediaStoreOutput(isPhoto: Boolean): MediaOutput.MediaStoreOutput {
|
||||||
val contentValues = getContentValues(isPhoto)
|
val contentValues = getContentValues(isPhoto)
|
||||||
val contentUri = if (isPhoto) {
|
val contentUri = if (isPhoto) {
|
||||||
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
|
MediaStore.Images.Media.getContentUri(EXTERNAL_VOLUME)
|
||||||
} else {
|
} else {
|
||||||
MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
|
MediaStore.Video.Media.getContentUri(EXTERNAL_VOLUME)
|
||||||
}
|
}
|
||||||
return MediaOutput.MediaStoreOutput(contentValues, contentUri)
|
return MediaOutput.MediaStoreOutput(contentValues, contentUri)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
private fun getContentValues(isPhoto: Boolean): ContentValues {
|
private fun getContentValues(isPhoto: Boolean): ContentValues {
|
||||||
val mimeType = if (isPhoto) IMAGE_MIME_TYPE else VIDEO_MIME_TYPE
|
val mimeType = if (isPhoto) IMAGE_MIME_TYPE else VIDEO_MIME_TYPE
|
||||||
return ContentValues().apply {
|
return ContentValues().apply {
|
||||||
put(MediaStore.MediaColumns.DISPLAY_NAME, getRandomMediaName(isPhoto))
|
put(MediaStore.MediaColumns.DISPLAY_NAME, getRandomMediaName(isPhoto))
|
||||||
put(MediaStore.MediaColumns.MIME_TYPE, mimeType)
|
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? {
|
private fun getOutputStreamMediaOutput(): MediaOutput.OutputStreamMediaOutput? {
|
||||||
var mediaOutput: MediaOutput.OutputStreamMediaOutput? = null
|
var mediaOutput: MediaOutput.OutputStreamMediaOutput? = null
|
||||||
val canWrite = canWriteToFilePath(mediaStorageDir)
|
val canWrite = canWriteToFilePath(mediaStorageDir)
|
||||||
Log.i(TAG, "getMediaOutput: canWrite=${canWrite}")
|
|
||||||
if (canWrite) {
|
if (canWrite) {
|
||||||
val path = activity.getOutputMediaFile(true)
|
val path = activity.getOutputMediaFile(true)
|
||||||
val uri = getUriForFilePath(path)
|
val uri = getUriForFilePath(path)
|
||||||
@ -99,16 +118,14 @@ class MediaOutputHelper(
|
|||||||
mediaOutput = MediaOutput.OutputStreamMediaOutput(outputStream, uri)
|
mediaOutput = MediaOutput.OutputStreamMediaOutput(outputStream, uri)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.i(TAG, "OutputStreamMediaOutput: $mediaOutput")
|
|
||||||
return mediaOutput
|
return mediaOutput
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openOutputStream(uri: Uri): OutputStream? {
|
private fun openOutputStream(uri: Uri): OutputStream? {
|
||||||
return try {
|
return try {
|
||||||
Log.i(TAG, "uri: $uri")
|
|
||||||
contentResolver.openOutputStream(uri)
|
contentResolver.openOutputStream(uri)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
activity.showErrorToast(e)
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -116,7 +133,6 @@ class MediaOutputHelper(
|
|||||||
private fun getFileDescriptorMediaOutput(): MediaOutput.FileDescriptorMediaOutput? {
|
private fun getFileDescriptorMediaOutput(): MediaOutput.FileDescriptorMediaOutput? {
|
||||||
var mediaOutput: MediaOutput.FileDescriptorMediaOutput? = null
|
var mediaOutput: MediaOutput.FileDescriptorMediaOutput? = null
|
||||||
val canWrite = canWriteToFilePath(mediaStorageDir)
|
val canWrite = canWriteToFilePath(mediaStorageDir)
|
||||||
Log.i(TAG, "getMediaOutput: canWrite=${canWrite}")
|
|
||||||
if (canWrite) {
|
if (canWrite) {
|
||||||
val path = activity.getOutputMediaFile(false)
|
val path = activity.getOutputMediaFile(false)
|
||||||
val uri = getUriForFilePath(path)
|
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
|
return mediaOutput
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openFileDescriptor(uri: Uri): ParcelFileDescriptor? {
|
private fun openFileDescriptor(uri: Uri): ParcelFileDescriptor? {
|
||||||
return try {
|
return try {
|
||||||
Log.i(TAG, "uri: $uri")
|
|
||||||
contentResolver.openFileDescriptor(uri, MODE)
|
contentResolver.openFileDescriptor(uri, MODE)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
activity.showErrorToast(e)
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -178,7 +205,6 @@ class MediaOutputHelper(
|
|||||||
documentFile.createFile(path.getMimeType(), path.getFilenameFromPath())?.uri
|
documentFile.createFile(path.getMimeType(), path.getFilenameFromPath())?.uri
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -187,7 +213,6 @@ class MediaOutputHelper(
|
|||||||
try {
|
try {
|
||||||
activity.createDocumentUriUsingFirstParentTreeUri(path)
|
activity.createDocumentUriUsingFirstParentTreeUri(path)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
|
||||||
null
|
null
|
||||||
} ?: Uri.fromFile(targetFile)
|
} ?: Uri.fromFile(targetFile)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.simplemobiletools.camera.helpers
|
package com.simplemobiletools.camera.helpers
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.camera.core.CameraSelector
|
import androidx.camera.core.CameraSelector
|
||||||
import androidx.camera.lifecycle.ProcessCameraProvider
|
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.extensions.toVideoQuality
|
||||||
import com.simplemobiletools.camera.models.CameraSelectorVideoQualities
|
import com.simplemobiletools.camera.models.CameraSelectorVideoQualities
|
||||||
import com.simplemobiletools.camera.models.VideoQuality
|
import com.simplemobiletools.camera.models.VideoQuality
|
||||||
|
import com.simplemobiletools.commons.extensions.showErrorToast
|
||||||
|
|
||||||
class VideoQualityManager(
|
class VideoQualityManager(
|
||||||
private val activity: AppCompatActivity,
|
private val activity: AppCompatActivity,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "VideoQualityHelper"
|
|
||||||
private val QUALITIES = listOf(Quality.UHD, Quality.FHD, Quality.HD, Quality.SD)
|
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)
|
private val CAMERA_SELECTORS = arrayOf(CameraSelector.DEFAULT_BACK_CAMERA, CameraSelector.DEFAULT_FRONT_CAMERA)
|
||||||
}
|
}
|
||||||
@ -37,12 +36,10 @@ class VideoQualityManager(
|
|||||||
.also { allQualities ->
|
.also { allQualities ->
|
||||||
val qualities = allQualities.map { it.toVideoQuality() }
|
val qualities = allQualities.map { it.toVideoQuality() }
|
||||||
videoQualities.add(CameraSelectorVideoQualities(camSelector, qualities))
|
videoQualities.add(CameraSelectorVideoQualities(camSelector, qualities))
|
||||||
|
|
||||||
}
|
}
|
||||||
Log.i(TAG, "bindCameraUseCases: videoQualities=$videoQualities")
|
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} 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 {
|
fun getUserSelectedQuality(cameraSelector: CameraSelector): Quality {
|
||||||
var selectionIndex = if (cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA) config.frontVideoResIndex else config.backVideoResIndex
|
var selectionIndex = if (cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA) config.frontVideoResIndex else config.backVideoResIndex
|
||||||
selectionIndex = selectionIndex.coerceAtLeast(0)
|
selectionIndex = selectionIndex.coerceAtLeast(0)
|
||||||
return getSupportedQualities(cameraSelector)[selectionIndex].toCameraXQuality()
|
return getSupportedQualities(cameraSelector).getOrElse(selectionIndex) { VideoQuality.HD }.toCameraXQuality()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getSupportedQualities(cameraSelector: CameraSelector): List<VideoQuality> {
|
fun getSupportedQualities(cameraSelector: CameraSelector): List<VideoQuality> {
|
||||||
|
@ -4,7 +4,6 @@ import android.annotation.SuppressLint
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.hardware.SensorManager
|
import android.hardware.SensorManager
|
||||||
import android.hardware.display.DisplayManager
|
import android.hardware.display.DisplayManager
|
||||||
import android.util.Log
|
|
||||||
import android.util.Size
|
import android.util.Size
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import android.view.GestureDetector.SimpleOnGestureListener
|
import android.view.GestureDetector.SimpleOnGestureListener
|
||||||
@ -43,7 +42,6 @@ class CameraXPreview(
|
|||||||
) : MyPreview, DefaultLifecycleObserver {
|
) : MyPreview, DefaultLifecycleObserver {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "CameraXPreview"
|
|
||||||
private const val RATIO_4_3_VALUE = 4.0 / 3.0
|
private const val RATIO_4_3_VALUE = 4.0 / 3.0
|
||||||
private const val RATIO_16_9_VALUE = 16.0 / 9.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
|
in 225 until 315 -> Surface.ROTATION_90
|
||||||
else -> Surface.ROTATION_0
|
else -> Surface.ROTATION_0
|
||||||
}
|
}
|
||||||
Log.i(TAG, "onOrientationChanged: rotation=$rotation")
|
|
||||||
preview?.targetRotation = rotation
|
preview?.targetRotation = rotation
|
||||||
imageCapture?.targetRotation = rotation
|
imageCapture?.targetRotation = rotation
|
||||||
videoCapture?.targetRotation = rotation
|
videoCapture?.targetRotation = rotation
|
||||||
@ -91,9 +88,7 @@ class CameraXPreview(
|
|||||||
private var recordingState: VideoRecordEvent? = null
|
private var recordingState: VideoRecordEvent? = null
|
||||||
private var cameraSelector = config.lastUsedCameraLens.toCameraSelector()
|
private var cameraSelector = config.lastUsedCameraLens.toCameraSelector()
|
||||||
private var flashMode = FLASH_MODE_OFF
|
private var flashMode = FLASH_MODE_OFF
|
||||||
private var isPhotoCapture = initInPhotoMode.also {
|
private var isPhotoCapture = initInPhotoMode
|
||||||
Log.i(TAG, "initInPhotoMode= $it")
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
bindToLifeCycle()
|
bindToLifeCycle()
|
||||||
@ -108,7 +103,6 @@ class CameraXPreview(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun startCamera(switching: Boolean = false) {
|
private fun startCamera(switching: Boolean = false) {
|
||||||
Log.i(TAG, "startCamera: ")
|
|
||||||
imageQualityManager.initSupportedQualities()
|
imageQualityManager.initSupportedQualities()
|
||||||
|
|
||||||
val cameraProviderFuture = ProcessCameraProvider.getInstance(activity)
|
val cameraProviderFuture = ProcessCameraProvider.getInstance(activity)
|
||||||
@ -120,7 +114,6 @@ class CameraXPreview(
|
|||||||
bindCameraUseCases()
|
bindCameraUseCases()
|
||||||
setupCameraObservers()
|
setupCameraObservers()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "startCamera: ", e)
|
|
||||||
val errorMessage = if (switching) R.string.camera_switch_error else R.string.camera_open_error
|
val errorMessage = if (switching) R.string.camera_switch_error else R.string.camera_open_error
|
||||||
activity.toast(errorMessage)
|
activity.toast(errorMessage)
|
||||||
}
|
}
|
||||||
@ -197,9 +190,6 @@ class CameraXPreview(
|
|||||||
.apply {
|
.apply {
|
||||||
imageQualityManager.getUserSelectedResolution(cameraSelector)?.let { resolution ->
|
imageQualityManager.getUserSelectedResolution(cameraSelector)?.let { resolution ->
|
||||||
val rotatedResolution = getRotatedResolution(rotation, 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)
|
setTargetResolution(rotatedResolution)
|
||||||
} ?: setTargetAspectRatio(aspectRatio)
|
} ?: setTargetAspectRatio(aspectRatio)
|
||||||
}
|
}
|
||||||
@ -255,7 +245,6 @@ class CameraXPreview(
|
|||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
// source: https://stackoverflow.com/a/60095886/10552591
|
// source: https://stackoverflow.com/a/60095886/10552591
|
||||||
private fun setupZoomAndFocus() {
|
private fun setupZoomAndFocus() {
|
||||||
Log.i(TAG, "camera controller: ${previewView.controller}")
|
|
||||||
val scaleGesture = camera?.let { ScaleGestureDetector(activity, PinchToZoomOnScaleGestureListener(it.cameraInfo, it.cameraControl)) }
|
val scaleGesture = camera?.let { ScaleGestureDetector(activity, PinchToZoomOnScaleGestureListener(it.cameraInfo, it.cameraControl)) }
|
||||||
val gestureDetector = GestureDetector(activity, object : SimpleOnGestureListener() {
|
val gestureDetector = GestureDetector(activity, object : SimpleOnGestureListener() {
|
||||||
override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
|
override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
|
||||||
@ -263,7 +252,6 @@ class CameraXPreview(
|
|||||||
val display = displayManager.getDisplay(Display.DEFAULT_DISPLAY)
|
val display = displayManager.getDisplay(Display.DEFAULT_DISPLAY)
|
||||||
val width = previewView.width.toFloat()
|
val width = previewView.width.toFloat()
|
||||||
val height = previewView.height.toFloat()
|
val height = previewView.height.toFloat()
|
||||||
Log.i(TAG, "onSingleTapConfirmed: width=$width,height=$height")
|
|
||||||
val factory = DisplayOrientedMeteringPointFactory(display, it, width, height)
|
val factory = DisplayOrientedMeteringPointFactory(display, it, width, height)
|
||||||
val xPos = event.x
|
val xPos = event.x
|
||||||
val yPos = event.y
|
val yPos = event.y
|
||||||
@ -275,13 +263,11 @@ class CameraXPreview(
|
|||||||
.build()
|
.build()
|
||||||
camera?.cameraControl?.startFocusAndMetering(focusMeteringAction)
|
camera?.cameraControl?.startFocusAndMetering(focusMeteringAction)
|
||||||
listener.onFocusCamera(xPos, yPos)
|
listener.onFocusCamera(xPos, yPos)
|
||||||
Log.i(TAG, "start focus")
|
|
||||||
true
|
true
|
||||||
} ?: false
|
} ?: false
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
previewView.setOnTouchListener { _, event ->
|
previewView.setOnTouchListener { _, event ->
|
||||||
Log.i(TAG, "setOnTouchListener: x=${event.x}, y=${event.y}")
|
|
||||||
gestureDetector.onTouchEvent(event)
|
gestureDetector.onTouchEvent(event)
|
||||||
scaleGesture?.onTouchEvent(event)
|
scaleGesture?.onTouchEvent(event)
|
||||||
true
|
true
|
||||||
@ -405,7 +391,6 @@ class CameraXPreview(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleImageCaptureError(exception: ImageCaptureException) {
|
private fun handleImageCaptureError(exception: ImageCaptureException) {
|
||||||
Log.e(TAG, "Error", exception)
|
|
||||||
listener.toggleBottomButtons(false)
|
listener.toggleBottomButtons(false)
|
||||||
cameraErrorHandler.handleImageCaptureError(exception.imageCaptureError)
|
cameraErrorHandler.handleImageCaptureError(exception.imageCaptureError)
|
||||||
}
|
}
|
||||||
@ -421,17 +406,15 @@ class CameraXPreview(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun toggleRecording() {
|
override fun toggleRecording() {
|
||||||
Log.d(TAG, "toggleRecording: currentRecording=$currentRecording, recordingState=$recordingState")
|
|
||||||
if (currentRecording == null || recordingState is VideoRecordEvent.Finalize) {
|
if (currentRecording == null || recordingState is VideoRecordEvent.Finalize) {
|
||||||
startRecording()
|
startRecording()
|
||||||
} else {
|
} else {
|
||||||
currentRecording?.stop()
|
currentRecording?.stop()
|
||||||
currentRecording = null
|
currentRecording = null
|
||||||
Log.d(TAG, "Recording stopped")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("MissingPermission")
|
@SuppressLint("MissingPermission", "NewApi")
|
||||||
private fun startRecording() {
|
private fun startRecording() {
|
||||||
val videoCapture = videoCapture ?: throw IllegalStateException("Camera initialization failed.")
|
val videoCapture = videoCapture ?: throw IllegalStateException("Camera initialization failed.")
|
||||||
|
|
||||||
@ -441,6 +424,10 @@ class CameraXPreview(
|
|||||||
FileDescriptorOutputOptions.Builder(mediaOutput.fileDescriptor).build()
|
FileDescriptorOutputOptions.Builder(mediaOutput.fileDescriptor).build()
|
||||||
.let { videoCapture.output.prepareRecording(activity, it) }
|
.let { videoCapture.output.prepareRecording(activity, it) }
|
||||||
}
|
}
|
||||||
|
is MediaOutput.FileMediaOutput -> {
|
||||||
|
FileOutputOptions.Builder(mediaOutput.file).build()
|
||||||
|
.let { videoCapture.output.prepareRecording(activity, it) }
|
||||||
|
}
|
||||||
is MediaOutput.MediaStoreOutput -> {
|
is MediaOutput.MediaStoreOutput -> {
|
||||||
MediaStoreOutputOptions.Builder(contentResolver, mediaOutput.contentUri).setContentValues(mediaOutput.contentValues).build()
|
MediaStoreOutputOptions.Builder(contentResolver, mediaOutput.contentUri).setContentValues(mediaOutput.contentValues).build()
|
||||||
.let { videoCapture.output.prepareRecording(activity, it) }
|
.let { videoCapture.output.prepareRecording(activity, it) }
|
||||||
@ -450,7 +437,6 @@ class CameraXPreview(
|
|||||||
|
|
||||||
currentRecording = recording.withAudioEnabled()
|
currentRecording = recording.withAudioEnabled()
|
||||||
.start(mainExecutor) { recordEvent ->
|
.start(mainExecutor) { recordEvent ->
|
||||||
Log.d(TAG, "recordEvent=$recordEvent ")
|
|
||||||
recordingState = recordEvent
|
recordingState = recordEvent
|
||||||
when (recordEvent) {
|
when (recordEvent) {
|
||||||
is VideoRecordEvent.Start -> {
|
is VideoRecordEvent.Start -> {
|
||||||
@ -466,7 +452,6 @@ class CameraXPreview(
|
|||||||
playStopVideoRecordingSoundIfEnabled()
|
playStopVideoRecordingSoundIfEnabled()
|
||||||
listener.onVideoRecordingStopped()
|
listener.onVideoRecordingStopped()
|
||||||
if (recordEvent.hasError()) {
|
if (recordEvent.hasError()) {
|
||||||
Log.e(TAG, "recording failed:", recordEvent.cause)
|
|
||||||
cameraErrorHandler.handleVideoRecordingError(recordEvent.error)
|
cameraErrorHandler.handleVideoRecordingError(recordEvent.error)
|
||||||
} else {
|
} else {
|
||||||
listener.onMediaSaved(mediaOutput.uri ?: recordEvent.outputResults.outputUri)
|
listener.onMediaSaved(mediaOutput.uri ?: recordEvent.outputResults.outputUri)
|
||||||
@ -474,7 +459,6 @@ class CameraXPreview(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.d(TAG, "Recording started")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun playShutterSoundIfEnabled() {
|
private fun playShutterSoundIfEnabled() {
|
||||||
|
@ -3,6 +3,7 @@ package com.simplemobiletools.camera.models
|
|||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.ParcelFileDescriptor
|
import android.os.ParcelFileDescriptor
|
||||||
|
import java.io.File
|
||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
|
|
||||||
sealed class MediaOutput(
|
sealed class MediaOutput(
|
||||||
@ -23,5 +24,10 @@ sealed class MediaOutput(
|
|||||||
override val uri: Uri,
|
override val uri: Uri,
|
||||||
) : MediaOutput(uri)
|
) : MediaOutput(uri)
|
||||||
|
|
||||||
|
data class FileMediaOutput(
|
||||||
|
val file: File,
|
||||||
|
override val uri: Uri,
|
||||||
|
) : MediaOutput(uri)
|
||||||
|
|
||||||
object BitmapOutput : MediaOutput(null)
|
object BitmapOutput : MediaOutput(null)
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/view_holder"
|
android:id="@+id/view_holder"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
@ -10,7 +11,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent" />
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
<ImageView
|
<View
|
||||||
android:id="@+id/capture_black_screen"
|
android:id="@+id/capture_black_screen"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
@ -21,7 +22,8 @@
|
|||||||
android:id="@+id/settings"
|
android:id="@+id/settings"
|
||||||
android:layout_width="@dimen/icon_size"
|
android:layout_width="@dimen/icon_size"
|
||||||
android:layout_height="@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:padding="@dimen/normal_margin"
|
||||||
android:src="@drawable/ic_settings_cog_vector" />
|
android:src="@drawable/ic_settings_cog_vector" />
|
||||||
|
|
||||||
@ -30,7 +32,8 @@
|
|||||||
android:layout_width="@dimen/icon_size"
|
android:layout_width="@dimen/icon_size"
|
||||||
android:layout_height="@dimen/icon_size"
|
android:layout_height="@dimen/icon_size"
|
||||||
android:layout_below="@+id/settings"
|
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:padding="@dimen/normal_margin"
|
||||||
android:src="@drawable/ic_video_vector" />
|
android:src="@drawable/ic_video_vector" />
|
||||||
|
|
||||||
@ -39,7 +42,8 @@
|
|||||||
android:layout_width="@dimen/icon_size"
|
android:layout_width="@dimen/icon_size"
|
||||||
android:layout_height="@dimen/icon_size"
|
android:layout_height="@dimen/icon_size"
|
||||||
android:layout_below="@+id/toggle_photo_video"
|
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:padding="@dimen/normal_margin"
|
||||||
android:src="@drawable/ic_resolution_vector" />
|
android:src="@drawable/ic_resolution_vector" />
|
||||||
|
|
||||||
@ -48,13 +52,15 @@
|
|||||||
android:layout_width="@dimen/icon_size"
|
android:layout_width="@dimen/icon_size"
|
||||||
android:layout_height="@dimen/icon_size"
|
android:layout_height="@dimen/icon_size"
|
||||||
android:layout_below="@+id/change_resolution"
|
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" />
|
android:padding="@dimen/medium_margin" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/btn_holder"
|
android:id="@+id/btn_holder"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
||||||
android:layout_alignParentBottom="true"
|
android:layout_alignParentBottom="true"
|
||||||
android:gravity="center_horizontal|bottom">
|
android:gravity="center_horizontal|bottom">
|
||||||
|
|
||||||
@ -63,6 +69,7 @@
|
|||||||
android:layout_width="@dimen/icon_size"
|
android:layout_width="@dimen/icon_size"
|
||||||
android:layout_height="@dimen/icon_size"
|
android:layout_height="@dimen/icon_size"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
|
android:contentDescription="@string/toggle_camera"
|
||||||
android:padding="@dimen/normal_margin"
|
android:padding="@dimen/normal_margin"
|
||||||
android:src="@drawable/ic_camera_front_vector" />
|
android:src="@drawable/ic_camera_front_vector" />
|
||||||
|
|
||||||
@ -71,6 +78,7 @@
|
|||||||
android:layout_width="@dimen/icon_size"
|
android:layout_width="@dimen/icon_size"
|
||||||
android:layout_height="@dimen/icon_size"
|
android:layout_height="@dimen/icon_size"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
|
android:contentDescription="@string/shutter"
|
||||||
android:src="@drawable/ic_shutter_vector" />
|
android:src="@drawable/ic_shutter_vector" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
@ -78,6 +86,7 @@
|
|||||||
android:layout_width="@dimen/icon_size"
|
android:layout_width="@dimen/icon_size"
|
||||||
android:layout_height="@dimen/icon_size"
|
android:layout_height="@dimen/icon_size"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
|
android:contentDescription="@string/toggle_flash"
|
||||||
android:padding="@dimen/normal_margin"
|
android:padding="@dimen/normal_margin"
|
||||||
android:src="@drawable/ic_flash_off_vector" />
|
android:src="@drawable/ic_flash_off_vector" />
|
||||||
|
|
||||||
@ -89,8 +98,8 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_above="@+id/btn_holder"
|
android:layout_above="@+id/btn_holder"
|
||||||
android:layout_centerHorizontal="true"
|
android:layout_centerHorizontal="true"
|
||||||
android:text="00:00"
|
|
||||||
android:textColor="@android:color/white"
|
android:textColor="@android:color/white"
|
||||||
android:visibility="gone" />
|
android:visibility="gone"
|
||||||
|
tools:text="00:00" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">ما هي جودة ضغط الصور التي يجب تعيينها؟</string>
|
<string name="faq_1_title">ما هي جودة ضغط الصور التي يجب تعيينها؟</string>
|
||||||
<string name="faq_1_text">ذلك يعتمد على هدفك. لأغراض عامة ينصح معظم الناس باستخدام 75٪ -80٪، عندما تكون الصورة لا تزال ذات نوعية جيدة حقا، ولكن يتم تقليل حجم الملف بشكل كبير مقارنة مع 100٪.</string>
|
<string name="faq_1_text">ذلك يعتمد على هدفك. لأغراض عامة ينصح معظم الناس باستخدام 75٪ -80٪، عندما تكون الصورة لا تزال ذات نوعية جيدة حقا، ولكن يتم تقليل حجم الملف بشكل كبير مقارنة مع 100٪.</string>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Şəkli hansı keyfiyyətdə yaddaşa salmalıyam?</string>
|
<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>
|
<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>
|
||||||
|
@ -21,6 +21,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">What photo compression quality should I set?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,13 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Колко трябва да компресирам качеството на снимките\?</string>
|
<string name="faq_1_title">Колко трябва да компресирам качеството на снимките\?</string>
|
||||||
<string name="faq_1_text">Зависи. За общо ползване повечето хора съветват да 75%-80%, като изображението все още е с наистина добро качество, но размерът на файла е драстично намален в сравнение със 100%.</string>
|
<string name="faq_1_text">Зависи. За общо ползване повечето хора съветват да 75%-80%, като изображението все още е с наистина добро качество, но размерът на файла е драстично намален в сравнение със 100%.</string>
|
||||||
@ -42,4 +49,4 @@
|
|||||||
Haven't found some strings? There's more at
|
Haven't found some strings? There's more at
|
||||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||||
-->
|
-->
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -12,12 +12,20 @@
|
|||||||
<string name="photo_not_saved">No s\'ha pogut desar la foto</string>
|
<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="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="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_in_use_error">Camera is in use by another app, please close the app and try again</string>
|
||||||
<string name="camera_configure_error">S\'ha produït un error en configurar la càmera</string>
|
<string name="camera_configure_error">An error occurred while configuring the camera</string>
|
||||||
<string name="camera_disabled_by_admin_error">L\'administrador ha desactivat la càmera</string>
|
<string name="camera_disabled_by_admin_error">Camera is disabled by the admin</string>
|
||||||
<string name="camera_dnd_error">El mode «No molestis» està activat. Desactiveu-lo i torneu-ho a provar</string>
|
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</string>
|
||||||
<string name="photo_capture_failed">Ha fallat la captura de la foto</string>
|
<string name="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Ha fallat la gravació del vídeo a causa d\'un emmagatzematge insuficient</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Quina qualitat de compressió fotogràfica he d\'establir\?</string>
|
<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>
|
<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>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Jakou kvalitu fotek bych měl použít?</string>
|
<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>
|
<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>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Pa ansawdd cywasgu llun dylwn ei osod?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Hvilken fotokomprimeringskvalitet skal jeg anvende\?</string>
|
<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>
|
<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>
|
||||||
|
@ -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="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="photo_capture_failed">Fotoaufnahme fehlgeschlagen</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Videoaufzeichnung aufgrund unzureichender Speicherkapazität 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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Was für eine Fotokomprimierungsqualität soll ich einstellen?</string>
|
<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>
|
<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
|
Haven't found some strings? There's more at
|
||||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||||
-->
|
-->
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Αποτυχία λήψης φωτογραφιών</string>
|
<string name="photo_capture_failed">Αποτυχία λήψης φωτογραφιών</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Η εγγραφή βίντεο απέτυχε λόγω ανεπαρκούς αποθηκευτικού χώρου</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Ποια ποιότητα συμπίεσης φωτογραφιών πρέπει να ορίσω;</string>
|
<string name="faq_1_title">Ποια ποιότητα συμπίεσης φωτογραφιών πρέπει να ορίσω;</string>
|
||||||
<string name="faq_1_text">Εξαρτάται από το στόχο σας. Για γενικούς σκοπούς, οι περισσότεροι συμβουλεύουν τη χρήση του 75%-80%, όταν η εικόνα εξακολουθεί να είναι πραγματικά καλής ποιότητας, αλλά το μέγεθος του αρχείου μειώνεται δραστικά σε σύγκριση με το 100%.</string>
|
<string name="faq_1_text">Εξαρτάται από το στόχο σας. Για γενικούς σκοπούς, οι περισσότεροι συμβουλεύουν τη χρήση του 75%-80%, όταν η εικόνα εξακολουθεί να είναι πραγματικά καλής ποιότητας, αλλά το μέγεθος του αρχείου μειώνεται δραστικά σε σύγκριση με το 100%.</string>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">What photo compression quality should I set?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">¿Qué calidad de compresión de foto debería establecer?</string>
|
<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>
|
<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>
|
||||||
|
@ -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="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="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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Missugust piltide pakkimise kvaliteeti peaksin kasutama\?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Mitä valokuvan pakkauslaatua minun pitäisi käyttää?</string>
|
<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>
|
<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
|
Haven't found some strings? There's more at
|
||||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||||
-->
|
-->
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -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="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="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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Quelle valeur devrais-je mettre pour la qualité des photos \?</string>
|
<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>
|
<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
|
Haven't found some strings? There's more at
|
||||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||||
-->
|
-->
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Que calidade de compresión debo escoller para a foto?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">Modus „Ne smetaj” je aktiviran. Deaktiviraj ga i pokušaj ponovo</string>
|
<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="photo_capture_failed">Snimanje fotografije nije uspjelo</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Snimanje videa nije uspjelo zbog nedovoljne memorije</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Koju kvalitetu kompresije fotografija trebam postaviti\?</string>
|
<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>
|
<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>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">What photo compression quality should I set?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">Mode Jangan Ganggu diaktifkan. Silakan nonaktifkan dan coba lagi</string>
|
<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="photo_capture_failed">Gagal mengambil foto</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Gagal merekam video karena penyimpanan tidak cukup</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Kualitas kompresi foto mana yang harus saya gunakan?</string>
|
<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>
|
<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
|
Haven't found some strings? There's more at
|
||||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||||
-->
|
-->
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">La modalità non disturbare è abilitata. Disabilitare e riprovare</string>
|
<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="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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Che qualità di compressione dovrei impostare?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">איזו איכות דחיסת תמונה עלי להגדיר\?</string>
|
<string name="faq_1_title">איזו איכות דחיסת תמונה עלי להגדיר\?</string>
|
||||||
<string name="faq_1_text">זה תלוי במטרה שלך. למטרות כלליות רוב האנשים ממליצים להשתמש ב-75%-80%, כאשר התמונה עדיין באיכות טובה, אך גודל הקובץ מצטמצם באופן דרסטי בהשוואה ל-100%.</string>
|
<string name="faq_1_text">זה תלוי במטרה שלך. למטרות כלליות רוב האנשים ממליצים להשתמש ב-75%-80%, כאשר התמונה עדיין באיכות טובה, אך גודל הקובץ מצטמצם באופן דרסטי בהשוואה ל-100%.</string>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">写真の圧縮品質はどのように設定すればよいですか?</string>
|
<string name="faq_1_title">写真の圧縮品質はどのように設定すればよいですか?</string>
|
||||||
<string name="faq_1_text">これはあなたの求める目標によります。一般的な用途には、75%~80%の使用をおすすめします。この設定でも画像は十分に良い品質ですが、ファイルサイズは100%と比べて大幅に削減することができます。</string>
|
<string name="faq_1_text">これはあなたの求める目標によります。一般的な用途には、75%~80%の使用をおすすめします。この設定でも画像は十分に良い品質ですが、ファイルサイズは100%と比べて大幅に削減することができます。</string>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">사진 압축품질을 무엇으로 설정해야 하나요?</string>
|
<string name="faq_1_title">사진 압축품질을 무엇으로 설정해야 하나요?</string>
|
||||||
<string name="faq_1_text">압축품질은 촬영용도에 따라 달라질 수 있지만, 일반적으로 75% -80%를 사용하도록 권고합니다. 75% -80%로 압축 품질을 설정하면 파일 크기는 100%에 비해 크게 줄어듭니다.</string>
|
<string name="faq_1_text">압축품질은 촬영용도에 따라 달라질 수 있지만, 일반적으로 75% -80%를 사용하도록 권고합니다. 75% -80%로 압축 품질을 설정하면 파일 크기는 100%에 비해 크게 줄어듭니다.</string>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Kokią nuotraukos suspaudimo kokybę turėčiau nustatyti?</string>
|
<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>
|
<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>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">ഏത് ഫോട്ടോ കംപ്രഷനാണ് ഞാൻ ഉപയോഗിക്കേണ്ടത്?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Hvilket bildekomprimeringsnivå bør jeg bruke\?</string>
|
<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>
|
<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>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">मैले कस्तो फोटो खदाईको गुणस्तर स्थापित गर्नुपर्छ ?</string>
|
<string name="faq_1_title">मैले कस्तो फोटो खदाईको गुणस्तर स्थापित गर्नुपर्छ ?</string>
|
||||||
<string name="faq_1_text">यो तपाईको चाहानामा भर पर्छ । सामान्यतया सबैले 75%-80% मा प्रयोग गर्छन, जब तस्बिर राम्रो गुणस्तरको छ, तर 100% को तुलनामा फाईल साईज अस्वभाविक रुपले घट्छ </string>
|
<string name="faq_1_text">यो तपाईको चाहानामा भर पर्छ । सामान्यतया सबैले 75%-80% मा प्रयोग गर्छन, जब तस्बिर राम्रो गुणस्तरको छ, तर 100% को तुलनामा फाईल साईज अस्वभाविक रुपले घट्छ </string>
|
||||||
|
@ -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="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="photo_capture_failed">Foto-opname mislukt</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video-opname mislukt door onvoldoende opslag</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Welke kwaliteit voor foto\'s moet ik instellen?</string>
|
<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>
|
<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>
|
||||||
|
@ -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="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="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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Jaką jakość kompresji zdjęć powinienem ustawić\?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">O modo Não perturbe está ativado. Desative e tente novamente</string>
|
<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="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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Que qualidade de compressão de imagem devo definir\?</string>
|
<string name="faq_1_title">Que qualidade de compressão de imagem devo definir\?</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>
|
<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>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">What photo compression quality should I set?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Que qualidade de compressão de imagem devo definir?</string>
|
<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>
|
<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>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Ce calitate de compresie a fotografiilor ar trebui să setez?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">Включён режим \"Не беспокоить\", отключите и повторите попытку</string>
|
<string name="camera_dnd_error">Включён режим \"Не беспокоить\", отключите и повторите попытку</string>
|
||||||
<string name="photo_capture_failed">Не удалось сделать снимок</string>
|
<string name="photo_capture_failed">Не удалось сделать снимок</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Запись видео не удалась из-за нехватки памяти</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Какое качество сжатия фото нужно установить?</string>
|
<string name="faq_1_title">Какое качество сжатия фото нужно установить?</string>
|
||||||
<string name="faq_1_text">Это зависит от вашей цели. В общем случае большинство людей советуют использовать 75%-80%, тогда изображение всё ещё действительно хорошего качества, но размер файла резко уменьшается по сравнению со 100%.</string>
|
<string name="faq_1_text">Это зависит от вашей цели. В общем случае большинство людей советуют использовать 75%-80%, тогда изображение всё ещё действительно хорошего качества, но размер файла резко уменьшается по сравнению со 100%.</string>
|
||||||
|
@ -19,6 +19,13 @@
|
|||||||
<string name="photo_capture_failed">Snímanie fotografie zlyhalo</string>
|
<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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Akú kvalitu fotiek by som mal použiť?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">"Do Not Disturb" mode is enabled. Please disable and try again</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="photo_capture_failed">Photo capture failed</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Video recording failed due to insufficient storage</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Vilken kvalitet för fotokomprimering ska jag ställa in\?</string>
|
<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>
|
<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>
|
||||||
|
@ -21,6 +21,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">What photo compression quality should I set?</string>
|
<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>
|
<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>
|
||||||
|
@ -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="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="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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Hangi fotoğraf sıkıştırma kalitesini ayarlamalıyım?</string>
|
<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>
|
<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>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">Увімкнено режим «Не турбувати». Будь ласка, вимкніть і спробуйте знову</string>
|
<string name="camera_dnd_error">Увімкнено режим «Не турбувати». Будь ласка, вимкніть і спробуйте знову</string>
|
||||||
<string name="photo_capture_failed">Не вдалося зняти світлину</string>
|
<string name="photo_capture_failed">Не вдалося зняти світлину</string>
|
||||||
<string name="video_capture_insufficient_storage_error">Через нестачу пам’яті не вдалося записати відео</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Який ступінь стиснення фото слід встановити?</string>
|
<string name="faq_1_title">Який ступінь стиснення фото слід встановити?</string>
|
||||||
<string name="faq_1_text">Це залежить від вашої мети. Загалом більшість людей радять використовувати 75%-80%, тоді зображення ще дійсно гарної якості, але розмір файлу істотно зменшується порівняно зі 100%.</string>
|
<string name="faq_1_text">Це залежить від вашої мети. Загалом більшість людей радять використовувати 75%-80%, тоді зображення ще дійсно гарної якості, але розмір файлу істотно зменшується порівняно зі 100%.</string>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">勿扰模式处于开启状态。 请禁用并重试</string>
|
<string name="camera_dnd_error">勿扰模式处于开启状态。 请禁用并重试</string>
|
||||||
<string name="photo_capture_failed">照片拍摄失败</string>
|
<string name="photo_capture_failed">照片拍摄失败</string>
|
||||||
<string name="video_capture_insufficient_storage_error">由于存储空间不足,视频录制失败</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">我应该选用怎样的照片压缩率呢?</string>
|
<string name="faq_1_title">我应该选用怎样的照片压缩率呢?</string>
|
||||||
<string name="faq_1_text">这取决于您的目的。对大多数人的一般用途来说,建议使用 75%-80%,此时图片仍有不错的品质,而文件大小相比 100% 时大幅减小。</string>
|
<string name="faq_1_text">这取决于您的目的。对大多数人的一般用途来说,建议使用 75%-80%,此时图片仍有不错的品质,而文件大小相比 100% 时大幅减小。</string>
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
<string name="camera_dnd_error">零打擾模式已啟用,請將其停用後再試一次</string>
|
<string name="camera_dnd_error">零打擾模式已啟用,請將其停用後再試一次</string>
|
||||||
<string name="photo_capture_failed">拍照失敗</string>
|
<string name="photo_capture_failed">拍照失敗</string>
|
||||||
<string name="video_capture_insufficient_storage_error">儲存空間不足,錄影失敗</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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">我應該設定什麼相片壓縮品質?</string>
|
<string name="faq_1_title">我應該設定什麼相片壓縮品質?</string>
|
||||||
<string name="faq_1_text">視你目標而定。對大多數一般人而言,建議使用75%-80%,圖片依然是相當高品質,但檔案大小比100%大幅減少很多。</string>
|
<string name="faq_1_text">視你目標而定。對大多數一般人而言,建議使用75%-80%,圖片依然是相當高品質,但檔案大小比100%大幅減少很多。</string>
|
||||||
@ -42,4 +50,4 @@
|
|||||||
Haven't found some strings? There's more at
|
Haven't found some strings? There's more at
|
||||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||||
-->
|
-->
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -21,6 +21,13 @@
|
|||||||
<string name="photo_capture_failed">Photo capture failed</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>
|
<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 -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">What photo compression quality should I set?</string>
|
<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>
|
<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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user