不幸的是,相机已经停止

在这里输入图像说明

当我启动相机应用程序,我得到这个错误,这是我的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) 

这是我的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 

我也遇到了这个错误。

 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 

注意:当我尝试从Android浏览器下​​载图像时出现错误。

Solutions Collecting From Web of "不幸的是,相机已经停止"

编辑

你有尝试过其中之一吗? 这似乎是你的相机服务不能正常工作/相机可能会被用于其他应用程序。

无法连接到相机服务

使用android模拟器中的networking摄像头


顺便说一句,我使用MacOSX 。 我只是说,它在我的机器上工作。 我发送了安装的工具和日志。 也许它有帮助。

VDconfiguration

 Nexus 5, API 23 (Both Cameras are selected) 

当我启动模拟器时,它会在日志中发出警告,但在最后它会工作。

日志

警告:在连接的摄像机列表中找不到摄像机名称“webcam0”。

 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... 

在这里输入图像说明

解决方法很简单:使用虚拟机时,不能运行摄像机,除非将打开摄像机的操作链接到打开摄像头。

从API 23开始,您需要在运行时请求权限。 API <23中不是这种情况。 对于清单中的API <23权限就足够了。

这是Android开发者的一个例子:

检查权限:

 // Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR); 

请求权限:

 // 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. } } 

要求回应:

 @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 } } 

如果你想了解更多关于它的信息,你可以在Android Developers上查看这个链接:

http://developer.android.com/training/permissions/requesting.html

如果您不这样处理,则不能在API> = 23上使用相机

并非所有权限都需要由用户授予,但只有危险的权限(相机,位置):

http://developer.android.com/guide/topics/security/permissions.html#normal-dangerous

引用developers.android.com:

从Android 6.0(API级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时授予应用程序权限。 此方法简化了应用程序安装过程,因为用户在安装或更新应用程序时无需授予权限。 它还使用户能够更好地控制应用程序的function; 例如,用户可以select给相机应用程序访问相机而不是设备位置。 用户可以随时撤销权限,只需转到应用的“设置”屏幕即可。

系统权限分为正常和危险两类:

  • 普通权限不会直接威胁用户的隐私。 如果您的应用程序在其清单中列出了正常权限,系统将授予
    自动许可。
  • 危险的权限可以让应用程序访问用户的机密数据。 如果您的应用程序在其中列出正常权限
    清单,系统自动授予权限。 如果您列出危险的许可,则用户必须明确批准
    你的应用程序

所以,我完成了我的任务,如下所示:

对于检查权限,我创build了一个单独的类如下:

 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); } } } 

那么,为了得到

 ... 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(); } } } } 

可能是你的PC或Mac应该有工作相机或相机模拟必须安装..

在Android API> = 23的情况下,您必须在代码中请求权限,例如:

 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 ); } } 

现在好运行。