Итак, я заметил странную ошибку на Android: когда у вас есть активность с предварительным просмотром камеры и кнопкой быстрых настроек (которая либо делает что -то не связанное с камерой, либо вообще ничего, как в образе, я предоставляю), может возникнуть следующая проблема:
Если Tileservice все еще жив (I.E. ESPORY не был вызван, и Decips>, и Decips, и Decips>, и Decips, и Decipment, и DiseStroy.onStop вызывается) с помощью кнопки «Назад» или «Домой», cameradevice.statecallback может запустить Onerror обратный вызов с помощью error_camera_disabled (3).
Почему это происходит? Если есть даже объяснение. Я не уверен, что кто -то сообщил об этом на трекере выпуска Google - я попробовал Googling, но ничего не нашел. < /P>
Вот журналы, которые демонстрируют проблему: < /p>
01:50:45.787 [Test]TileService D onCreate
01:50:45.799 [Test]TileService D onStartListening
01:50:49.044 [Test]TileService D onStopListening
01:50:53.270 [Test]Activity D onCreate
01:50:53.289 [Test]Activity D onStart
01:50:53.356 [Test]Activity D Camera onOpened
01:50:56.965 [Test]Activity D onStop
01:50:58.745 [Test]Activity D onStart
01:50:58.764 [Test]Activity D Camera onOpened
01:51:00.724 [Test]Activity D onStop
01:51:00.937 [Test]Activity E Camera onError: 3
01:51:19.056 [Test]TileService D onDestroy
Вы никогда не получите камеру Onerror: 3 в этом примере, если Tileservice не работает (то есть он был уничтожен). Вы получаете эту ошибку только в том случае, если служба жива. Вы можете сделать его активным, открыв панель уведомлений:
После некоторого времени он будет автоматически. Активируйте Tileservice , открыв панель уведомления системы, затем запустите приложение и попробуйте скрыть или закрыть его - иногда ошибка может не стрелять, поэтому необходимо больше попыток):
< /code>
package com.cameradisabled.tileservice
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.SurfaceTexture
import android.hardware.camera2.CameraCaptureSession
import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CameraManager
import android.hardware.camera2.CaptureRequest
import android.os.Bundle
import android.util.Log
import android.view.Surface
import android.view.TextureView
import android.view.View
import android.widget.Button
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity() {
companion object {
private const val TAG = "[Test]Activity"
}
private lateinit var textureView: TextureView
private lateinit var btnRequest: Button
private lateinit var cameraManager: CameraManager
private val permissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
Log.d(TAG, "Permission result: $isGranted")
if (isGranted) {
btnRequest.visibility = View.GONE
openCameraIfReady()
} else {
btnRequest.visibility = View.VISIBLE
}
}
private var cameraDevice: CameraDevice? = null
private var session: CameraCaptureSession? = null
private lateinit var previewRequestBuilder: CaptureRequest.Builder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate")
setContentView(R.layout.activity_main)
textureView = findViewById(R.id.texture_view)
btnRequest = findViewById(R.id.btn_request_permission)
cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
// Show button if permission not granted
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED
) {
btnRequest.visibility = View.VISIBLE
}
btnRequest.setOnClickListener {
permissionLauncher.launch(Manifest.permission.CAMERA)
}
// TextureView listener
textureView.surfaceTextureListener = object : TextureView.SurfaceTextureListener {
override fun onSurfaceTextureAvailable(st: SurfaceTexture, w: Int, h: Int) {
openCameraIfReady()
}
override fun onSurfaceTextureSizeChanged(st: SurfaceTexture, w: Int, h: Int) {}
override fun onSurfaceTextureDestroyed(st: SurfaceTexture) = true
override fun onSurfaceTextureUpdated(st: SurfaceTexture) {}
}
}
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart")
openCameraIfReady()
}
override fun onStop() {
Log.d(TAG, "onStop")
closeCamera()
super.onStop()
}
private fun openCameraIfReady() {
if (!textureView.isAvailable) return
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED
) return
btnRequest.visibility = View.GONE
try {
val cameraId = cameraManager.cameraIdList.first()
cameraManager.openCamera(cameraId, stateCallback, null)
} catch (e: Exception) {
Log.e(TAG, "openCamera failed", e)
}
}
private val stateCallback = object : CameraDevice.StateCallback() {
override fun onOpened(device: CameraDevice) {
Log.d(TAG, "Camera onOpened")
cameraDevice = device
startPreview()
}
override fun onDisconnected(device: CameraDevice) {
Log.d(TAG, "Camera onDisconnected")
device.close()
cameraDevice = null
}
override fun onError(device: CameraDevice, error: Int) {
Log.e(TAG, "Camera onError: $error") // ERROR_CAMERA_DISABLED
device.close()
cameraDevice = null
}
}
private fun startPreview() {
val device = cameraDevice ?: return
val texture = textureView.surfaceTexture ?: return
texture.setDefaultBufferSize(textureView.width, textureView.height)
val surface = Surface(texture)
previewRequestBuilder = device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
addTarget(surface)
}
device.createCaptureSession(listOf(surface), object : CameraCaptureSession.StateCallback() {
override fun onConfigured(sess: CameraCaptureSession) {
session = sess
sess.setRepeatingRequest(previewRequestBuilder.build(), null, null)
}
override fun onConfigureFailed(sess: CameraCaptureSession) {
Log.e(TAG, "Preview configure failed")
}
}, null)
}
private fun closeCamera() {
session?.close()
session = null
cameraDevice?.close()
cameraDevice = null
}
}
< /code>
< /code>
package com.cameradisabled.tileservice
import android.service.quicksettings.TileService
import android.util.Log
class MyTileService : TileService() {
companion object { private const val TAG = "[Test]TileService" }
override fun onCreate() {
super.onCreate()
Log.d(TAG, "onCreate")
}
override fun onDestroy() {
Log.d(TAG, "onDestroy")
super.onDestroy()
}
override fun onStartListening() {
super.onStartListening()
Log.d(TAG, "onStartListening")
}
override fun onStopListening() {
Log.d(TAG, "onStopListening")
super.onStopListening()
}
override fun onClick() {
super.onClick()
Log.d(TAG, "onClick")
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... closing-th
Android Tileservice (QuickSettings) вызывает error_camera_disabled при закрытии активности ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему моя привязка в закрытии вызывается от button.disabled () не обновляется?
Anonymous » » в форуме IOS - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему моя привязка в закрытии вызывается от button.disabled () не обновляется?
Anonymous » » в форуме IOS - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-