android - solucion - Desafortunadamente, la cámara se ha detenido
no se puede conectar con la camara asegurese de cerrar otras aplicaciones alcatel (6)
Citando a developers.android.com:
A partir de Android 6.0 (nivel API 23), los usuarios otorgan permisos a las aplicaciones mientras la aplicación se está ejecutando, no cuando la instalan. Este enfoque agiliza el proceso de instalación de la aplicación, ya que el usuario no necesita otorgar permisos cuando instala o actualiza la aplicación. También le da al usuario más control sobre la funcionalidad de la aplicación; por ejemplo, un usuario puede optar por dar acceso a la aplicación de la cámara a la cámara pero no a la ubicación del dispositivo. El usuario puede revocar los permisos en cualquier momento, yendo a la pantalla de configuración de la aplicación.
Los permisos del sistema se dividen en dos categorías, normales y peligrosas:
- Los permisos normales no arriesgan directamente la privacidad del usuario. Si su aplicación incluye un permiso normal en su manifiesto, el sistema otorga
permiso de forma automática.- Los permisos peligrosos pueden dar acceso a la aplicación a los datos confidenciales del usuario. Si su aplicación enumera un permiso normal en su
manifiesto, el sistema otorga el permiso automáticamente. Si enumera un permiso peligroso, el usuario tiene que dar su aprobación explícitamente a
tu aplicación
Entonces, cumplí mi tarea de la siguiente manera:
Para verificar el permiso, creé una clase separada como se muestra a continuación:
public class MarshMallowPermission {
public static final int RECORD_PERMISSION_REQUEST_CODE = 1;
public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 2;
public static final int CAMERA_PERMISSION_REQUEST_CODE = 3;
Activity activity;
public MarshMallowPermission(Activity activity) {
this.activity = activity;
}
public boolean checkPermissionForRecord(){
int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO);
if (result == PackageManager.PERMISSION_GRANTED){
return true;
} else {
return false;
}
}
public boolean checkPermissionForExternalStorage(){
int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (result == PackageManager.PERMISSION_GRANTED){
return true;
} else {
return false;
}
}
public boolean checkPermissionForCamera(){
int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
if (result == PackageManager.PERMISSION_GRANTED){
return true;
} else {
return false;
}
}
public void requestPermissionForRecord(){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.RECORD_AUDIO)){
Toast.makeText(activity, "Microphone permission needed for recording. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.RECORD_AUDIO},RECORD_PERMISSION_REQUEST_CODE);
}
}
public void requestPermissionForExternalStorage(){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Toast.makeText(activity, "External Storage permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
}
}
public void requestPermissionForCamera(){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)){
Toast.makeText(activity, "Camera permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);
}
}
}
Entonces, para conseguir
...
MarshMallowPermission marshMallowPermission = new MarshMallowPermission(this);
...
public void getPhotoFromCamera() {
if (!marshMallowPermission.checkPermissionForCamera()) {
marshMallowPermission.requestPermissionForCamera();
} else {
if (!marshMallowPermission.checkPermissionForExternalStorage()) {
marshMallowPermission.requestPermissionForExternalStorage();
} else {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File mediaStorageDir = new File(
Environment.getExternalStorageDirectory()
+ File.separator
+ getString(R.string.directory_name_corp_chat)
+ File.separator
+ getString(R.string.directory_name_images)
);
if (!mediaStorageDir.exists()) {
mediaStorageDir.mkdirs();
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
Locale.getDefault()).format(new Date());
try {
mediaFile = File.createTempFile(
"IMG_" + timeStamp, /* prefix */
".jpg", /* suffix */
mediaStorageDir /* directory */
);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile));
startActivityForResult(takePictureIntent, PICK_FROM_CAMERA);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Cuando ejecuto la aplicación Cámara, aparece este error y este es mi logcat.
12-08 12:50:10.393 2275-2369/com.android.launcher3 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa21675b0
12-08 12:50:10.509 965-3048/? E/CameraService: CameraService::connect X (PID 3209) rejected (invalid camera ID 0)
12-08 12:50:10.510 3209-3224/com.android.camera E/CameraHolder: fail to connect Camera
12-08 12:50:10.510 3209-3224/com.android.camera E/CameraHolder: java.lang.RuntimeException: Fail to connect to camera service
12-08 12:50:10.510 3209-3224/com.android.camera E/CameraHolder: at android.hardware.Camera.<init>(Camera.java:495)
12-08 12:50:10.510 3209-3224/com.android.camera E/CameraHolder: at android.hardware.Camera.open(Camera.java:341)
12-08 12:50:10.510 3209-3224/com.android.camera E/CameraHolder: at com.android.camera.CameraHolder.open(CameraHolder.java:131)
12-08 12:50:10.510 3209-3224/com.android.camera E/CameraHolder: at com.android.camera.Util.openCamera(Util.java:267)
12-08 12:50:10.510 3209-3224/com.android.camera E/CameraHolder: at com.android.camera.Camera$3.run(Camera.java:1100)
12-08 12:50:10.510 3209-3224/com.android.camera E/CameraHolder: at java.lang.Thread.run(Thread.java:818)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: FATAL EXCEPTION: Thread-179
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: Process: com.android.camera, PID: 3209
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: java.lang.RuntimeException: openCamera failed
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at com.android.camera.Util.openCamera(Util.java:272)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at com.android.camera.Camera$3.run(Camera.java:1100)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: Caused by: com.android.camera.CameraHardwareException: java.lang.RuntimeException: Fail to connect to camera service
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at com.android.camera.CameraHolder.open(CameraHolder.java:135)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at com.android.camera.Util.openCamera(Util.java:267)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at com.android.camera.Camera$3.run(Camera.java:1100)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: Caused by: java.lang.RuntimeException: Fail to connect to camera service
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at android.hardware.Camera.<init>(Camera.java:495)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at android.hardware.Camera.open(Camera.java:341)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at com.android.camera.CameraHolder.open(CameraHolder.java:131)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at com.android.camera.Util.openCamera(Util.java:267)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at com.android.camera.Camera$3.run(Camera.java:1100)
12-08 12:50:10.511 3209-3224/com.android.camera E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
12-08 12:50:10.671 954-954/? E/EGL_emulation: tid 954: eglCreateSyncKHR(1243): error 0x3004 (EGL_BAD_ATTRIBUTE)
y este es mi config.ini
avd.ini.encoding=UTF-8
AvdId=Nexus_S_API_23
abi.type=x86
avd.ini.displayname=Nexus S API 23
disk.dataPartition.size=200M
hw.accelerometer=yes
hw.audioInput=yes
hw.battery=yes
hw.camera.back=webcam0
hw.camera.front=none
hw.cpu.arch=x86
hw.dPad=no
hw.device.hash2=MD5:37a2ff6e511626ba3ceddec8264474be
hw.device.manufacturer=Google
hw.device.name=Nexus S
hw.gps=yes
hw.gpu.enabled=yes
hw.keyboard=yes
hw.lcd.density=240
hw.mainKeys=yes
hw.ramSize=343
hw.sdCard=yes
hw.sensors.orientation=yes
hw.sensors.proximity=yes
hw.trackBall=no
image.sysdir.1=system-images/android-23/google_apis/x86/
runtime.network.latency=none
runtime.network.speed=full
runtime.scalefactor=auto
sdcard.size=100M
skin.dynamic=yes
skin.name=nexus_s
skin.path=C:/Program Files/Android/Android Studio/plugins/android/lib/device-art-resources/nexus_s
snapshot.present=no
tag.display=Google APIs
tag.id=google_apis
vm.heapSize=32
También me enfrenté a este error.
emulator -webcam-list -avd Nexus_S_API_23
emulator: WARNING: Increasing RAM size to 1GB
emulator: ERROR: camera_device_start_capturing: Device ''AndroidEmulatorVC0'' is unable to save frame to the clipboard: 0
Nota: Recibo un error al intentar descargar una imagen desde el navegador de Android.
A partir de la API 23, debe solicitar permisos en tiempo de ejecución. Este no fue el caso en API <23. Para API <23 permisos en el manifiesto es suficiente.
Este es un ejemplo de los desarrolladores de Android:
Verifique el permiso
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
Pedir permiso :
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don''t block
// this thread waiting for the user''s response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
Solicitar respuesta :
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other ''case'' lines to check for other
// permissions this app might request
}
}
Si desea más información al respecto, puede consultar este enlace en Desarrolladores de Android:
http://developer.android.com/training/permissions/requesting.html
Si no manejas así no puedes usar la cámara en API''s> = 23
No todos los permisos deben ser otorgados por el usuario, pero solo permisos peligrosos (Cámara, Ubicación,):
http://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
Con la API de Android> = 23, debe solicitar permiso en un código como:
int REQUEST_PERMISSION= 100;
int cameraPermission = this.checkSelfPermission(Manifest.permission.CAMERA);
if (android.os.Build.VERSION.SDK_INT >= 23) {
if (cameraPermission != PackageManager.PERMISSION_GRANTED ) {
this.requestPermissions(
new String[]{Manifest.permission.CAMERA },
REQUEST_PERMISSION
);
}
}
Ahora está bien para correr.
La solución es simple: no puede ejecutar una cámara cuando utiliza una máquina virtual a menos que vincule la acción de abrir la cámara VM para abrir su cámara web.
Puede ser que su PC o Mac deban tener una cámara que funcione o la simulación de la cámara debe estar instalada.
Editar
¿Has probado alguno de estos? Parece que su servicio de cámara no funcionó correctamente / la cámara puede usarse para otra aplicación.
Error al conectarse al servicio de cámara
Usa la cámara web en el emulador de android.
Yo uso MacOSX por cierto. Solo digo que funciona en mi máquina. Envié herramientas instaladas y registros. Tal vez ayude.
Configuración de VD
Nexus 5, API 23 (Both Cameras are selected)
Cuando inicio el emulador, da una advertencia en el registro pero al final funcionó.
Troncos
ADVERTENCIA: El nombre de la cámara ''webcam0'' no se encuentra en la lista de cámaras conectadas.
12-12 22:59:15.060 2060-2079/com.android.camera V/CameraHolder: open camera 0
12-12 22:59:15.060 1019-1730/? I/CameraService: CameraService::connect call (PID 2060 "com.android.camera", camera ID 0) for HAL version default and Camera API version 1
12-12 22:59:15.060 1019-1730/? V/EmulatedCamera_Camera: getCameraInfo
12-12 22:59:15.060 1019-1730/? V/EmulatedCamera_BaseCamera: getCameraInfo
12-12 22:59:15.060 1019-1730/? W/AudioFlinger: acquireAudioSessionId() unknown client 2060 for session 7
12-12 22:59:15.060 1019-2081/? D/NuPlayerDriver: notifyListener_l(0xf619af80), (1, 0, 0)
12-12 22:59:15.060 1019-1730/? W/AudioFlinger: acquireAudioSessionId() unknown client 2060 for session 8
12-12 22:59:15.070 1019-2083/? D/NuPlayerDriver: notifyListener_l(0xf619afe0), (1, 0, 0)
12-12 22:59:15.070 1019-1730/? I/CameraClient: Opening camera 0
12-12 22:59:15.070 1019-1730/? V/EmulatedCamera_Camera: getCameraInfo
12-12 22:59:15.070 1019-1730/? V/EmulatedCamera_BaseCamera: getCameraInfo
12-12 22:59:15.070 1019-1730/? V/EmulatedCamera_Camera: connectCamera
12-12 22:59:15.070 1019-1730/? V/EmulatedCamera_QemuDevice: connectDevice
12-12 22:59:15.100 2059-2059/? D/AndroidRuntime: Calling main entry com.android.commands.pm.Pm
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_QemuDevice: connectDevice: Connected to device ''webcam0''
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: setCallbacks: 0xf75d1505, 0xf75d1dba, 0xf75d1c92, 0xf75d2267 (0xf619b040)
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: enableMessage: msg_type = 0xc0d
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: CAMERA_MSG_ERROR
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: CAMERA_MSG_FOCUS
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: CAMERA_MSG_ZOOM
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: CAMERA_MSG_PREVIEW_METADATA
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: **** Currently enabled messages:
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: CAMERA_MSG_ERROR
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: CAMERA_MSG_FOCUS
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: CAMERA_MSG_ZOOM
12-12 22:59:15.110 1019-1730/? V/EmulatedCamera_CallbackNotifier: CAMERA_MSG_PREVIEW_METADATA
12-12 22:59:15.120 1350-1374/system_process I/ActivityManager: Start proc 2086:com.android.defcontainer/u0a3 for service com.android.defcontainer/.DefaultContainerService
12-12 22:59:15.160 2086-2098/com.android.defcontainer D/DefContainer: Copying /data/local/tmp/com.example.volkangurol.myapplication to base.apk
12-12 22:59:15.210 1449-1449/com.android.systemui D/PhoneStatusBar: disable: < expand ICONS alerts SYSTEM_INFO back home* recent* clock search* quick_settings >
12-12 22:59:15.210 2060-2103/com.android.camera D/Camera: app passed NULL surface
12-12 22:59:15.210 1019-1619/? V/EmulatedCamera_Camera: getCameraInfo
12-12 22:59:15.210 1019-1619/? V/EmulatedCamera_BaseCamera: getCameraInfo
12-12 22:59:15.230 2060-2103/com.android.camera V/camera: Preview size is 640x480
12-12 22:59:15.230 1019-1019/? V/EmulatedCamera_Camera: setParameters
12-12 22:59:15.230 1019-1019/? D/EmulatedCamera_Camera: === Value changed: jpeg-quality: 90 -> 95
12-12 22:59:15.230 1019-1019/? D/EmulatedCamera_Camera: === Value changed: preview-frame-rate: 24 -> 30
12-12 22:59:15.230 1019-1019/? D/EmulatedCamera_Camera: +++ New parameter: recording-hint=false
12-12 22:59:15.230 2060-2103/com.android.camera V/camera: startPreview
12-12 22:59:15.230 1019-1380/? V/EmulatedCamera_Preview: setPreviewWindow: current: 0x0 -> new: 0x0
12-12 22:59:15.230 1019-1380/? V/EmulatedCamera_Camera: doStartPreview
12-12 22:59:15.230 1019-1380/? V/EmulatedCamera_Preview: startPreview
12-12 22:59:15.230 1019-1380/? D/EmulatedCamera_Camera: Starting camera: 640x480 -> NV21(yuv420sp)
12-12 22:59:15.230 1019-1380/? V/EmulatedCamera_QemuDevice: startDevice
12-12 22:59:15.230 1019-1380/? V/EmulatedCamera_Device: commonStartDevice: Allocated 0xf3f00000 460800 bytes for 307200 pixels in NV21[640x480] frame
12-12 22:59:15.230 1019-1380/? V/EmulatedCamera_QemuDevice: startDevice: Qemu camera device ''webcam0'' is started for NV21[640x480] frames
12-12 22:59:15.230 1019-1380/? V/EmulatedCamera_Device: startDeliveringFrames
12-12 22:59:15.230 1019-1380/? V/EmulatedCamera_Device: startWorkerThread
12-12 22:59:15.260 1019-2104/? V/EmulatedCamera_Device: Starting emulated camera device worker thread...