Lorsque je lance l'application Appareil photo, j'obtiens cette erreur, et voici mon 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)
et voici mon 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
J'ai également fait face à cette erreur.
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
Remarque: je reçois une erreur lorsque j'essaie de télécharger une image à partir du navigateur Android.
Modifier
Avez-vous essayé l'un d'entre eux? Il semble que votre service de caméra ne fonctionne pas correctement/la caméra peut être utilisée pour une autre application.
Impossible de se connecter au service de caméra
tilisez la caméra Web dans l'émulateur Android emulator
J'utilise MacOSX au fait. je dis juste que cela fonctionne sur ma machine. J'ai envoyé les outils et les journaux installés. Peut-être que ça aide.
Configuration VD
Nexus 5, API 23 (Both Cameras are selected)
Lorsque je démarre l'émulateur, il donne un avertissement dans le journal mais à la fin, cela a fonctionné.
Journaux
AVERTISSEMENT: le nom de la caméra 'webcam0' ne figure pas dans la liste des caméras connectées.
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...
Avec Android API> = 23, vous devez demander la permission dans un code comme:
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
);
}
}
Maintenant ok pour courir.
La solution est simple: vous ne pouvez pas exécuter de caméra lorsque vous utilisez une machine virtuelle à moins de lier l'action d'ouverture de la caméra VM à l'ouverture de votre webcam).
À partir de l'API 23, vous devez demander des autorisations lors de l'exécution. Ce n'était pas le cas dans l'API <23. Pour API, les autorisations <23 dans le manifeste suffisent.
Ceci est un exemple de Android:
Vérifiez l'autorisation:
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
Demander la permission :
// 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.
}
}
Demande de réponse :
@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 vous souhaitez plus d'informations à ce sujet, vous pouvez consulter ce lien sur Android:
http://developer.Android.com/training/permissions/requesting.html
Si vous ne gérez pas comme ça, vous ne pouvez pas utiliser la caméra sur les API> = 23
Toutes les autorisations ne doivent pas être accordées par l'utilisateur, mais uniquement les autorisations dangereuses (caméra, emplacement,):
http://developer.Android.com/guide/topics/security/permissions.html#normal-dangerous
Citant developers.Android.com:
À partir de Android 6.0 (API niveau 23), les utilisateurs accordent des autorisations aux applications pendant que l'application est en cours d'exécution, et non lorsqu'ils installent l'application. Cette approche rationalise le processus d'installation de l'application, car l'utilisateur ne le fait pas doivent accorder des autorisations lors de l'installation ou de la mise à jour de l'application. Cela donne également à l'utilisateur plus de contrôle sur les fonctionnalités de l'application; par exemple, un utilisateur peut choisir de donner à une application de caméra un accès à la caméra mais pas à l'emplacement de l'appareil. L'utilisateur peut révoquer les autorisations à tout moment, en allant à l'écran Paramètres de l'application.
Les autorisations système sont divisées en deux catégories, normales et dangereuses:
- Les autorisations normales ne mettent pas directement en danger la vie privée de l'utilisateur. Si votre application répertorie une autorisation normale dans son manifeste, le système accorde la
autorisation automatiquement.- Des autorisations dangereuses peuvent donner à l'application accès aux données confidentielles de l'utilisateur. Si votre application répertorie une autorisation normale dans son
manifeste, le système accorde automatiquement l'autorisation. Si vous répertoriez une autorisation dangereuse, l'utilisateur doit explicitement donner son accord à
votre application.
J'ai donc accompli ma tâche comme ci-dessous:
Pour vérifier l'autorisation, j'ai créé une classe distincte comme ci-dessous:
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);
}
}
}
Ensuite, pour obtenir
...
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();
}
}
}
}
Peut-être que votre PC ou Mac devrait avoir une caméra fonctionnelle ou une simulation de caméra doit être installée.