【问题标题】:Unfortunately, Camera has stopped不幸的是,相机已停止
【发布时间】:2016-03-13 06:13:49
【问题描述】:

当我启动相机应用程序时,我收到了这个错误,这是我的 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 浏览器下载图像时遇到错误。

【问题讨论】:

  • 当然,你的模拟器没有摄像头,除非你允许它使用你电脑的摄像头。
  • 有一个选项,在创建模拟器以使用后置摄像头和前置摄像头时,如果您使用的是android studio,那么您应该克隆您的设备,它会让您自定义设备规格,然后您也可以选择相机选项
  • 我已经选择了那个选项
  • 它在我的 Mac 上使用类似的模拟器运行:这是配置文件之间的区别drive.google.com/file/d/0B_3yQOBMz3jvVDJYdWJfaTcybFU/…
  • 你的配置也在我的 MAC 上工作(我不得不删除皮肤。* 元素)

标签: android android-studio android-emulator android-camera


【解决方案1】:

编辑

您尝试过其中一种吗?您的相机服务似乎无法正常工作/相机可能被用于其他应用程序。

Failed to connect to camera service

Use the web camera in the android emulator


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

VD 配置

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

【讨论】:

    【解决方案2】:

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

    现在可以运行了。

    【讨论】:

    【解决方案3】:

    解决方案很简单:在使用虚拟机时不能运行摄像头,除非将打开 VM 摄像头的操作与打开网络摄像头相关联。

    【讨论】:

    • 如何链接它们?在 bluestacks 中,它无需任何额外步骤即可工作
    【解决方案4】:

    从 API 23 开始,您需要在运行时请求权限。在 API

    这是来自 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 开发人员上查看此链接:

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

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

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

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

    【讨论】:

    • 您是否将相机权限添加到清单中?正如拉维哈里所说的那样?您评论说您在该答案上使用的是 Android Studio,但您仍需要将其添加到 Android Studio 中的清单中。
    • 我正在使用 com.android.camera
    • 就是那个包..你知道什么是android manifest吗?切换到Android View然后选择app->manifests->AndroidManifest.xml就可以找到
    【解决方案5】:

    引用developers.android.com:

    从 Android 6.0(API 级别 23)开始,用户授予以下权限 应用程序运行时的应用程序,而不是在他们安装应用程序时。这 方法简化了应用程序安装过程,因为用户不 需要在安装或更新应用程序时授予权限。它也是 让用户更好地控制应用程序的功能;例如, 用户可以选择让相机应用程序访问相机,但不能 到设备位置。用户可以随时撤销权限 时间,通过转到应用程序的设置屏幕。

    系统权限分为两类,普通权限和 危险:

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

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

    为了检查权限,我创建了一个单独的类,如下所示:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        您必须在 AVD 选项中设置您的相机。(默认情况下您可以有 NONE、NONE)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-15
          • 2016-02-29
          • 2017-05-03
          • 2016-10-20
          • 2014-01-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多