web-dev-qa-db-fra.com

W/CameraBase Une erreur est survenue lors de la connexion à l'appareil photo: appel sur camera.open ()

J'écris une application pour appareil photo et chaque fois que j'appelle camera.open (), l'application se bloque et j'obtiens l'erreur suivante:

W/CameraBase﹕ An error occurred while connecting to camera: 0

Voici comment j'ouvre la caméra:

public void getCameraInstance(){
    mCamera = null;

    try 
    {
        mCamera = Camera.open(); // attempt to get a Camera instance
    }

    catch (Exception e)
    {
        // Camera is not available (in use or does not exist)

    }
}

METTRE À JOUR:

Si vous lisez ceci, veuillez noter que cela s’applique à l’API de la caméra d’origine et n’applique plus la dernière version de l’API de la caméra (camera2). 

À partir de ce moment, vous devez utiliser l’appareil photo2, car il a une fonctionnalité plus étendue et un meilleur pipeline de traitement d’images.

REMARQUE SEULEMENT VALABLE JUSQU’À l’exclusion de l’API 21 (Lolipop), c’est-à-dire qu’il ne s’applique pas à Lolipop Et supérieur.

14
Cjen1

Pour utiliser la méthode suivante

Android.hardware.Camera.open(int cameraId)

Vous devez passer cameraId. Si vous voulez l’ID de caméra frontale, vous pouvez utiliser la méthode suivante

private int findFrontFacingCamera() {

    // Search for the front facing camera
    int numberOfCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numberOfCameras; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
            cameraId = i;
            cameraFront = true;
            break;
        }
    }
    return cameraId;
}
  1. Si la même caméra est ouverte par d'autres applications, une exception RuntimeException sera lancée.

  2. Vous devez appeler release () lorsque vous avez terminé d'utiliser l'appareil photo, sinon ce dernier restera verrouillé et ne sera pas disponible pour les autres applications.

  3. Votre application ne doit avoir qu'un seul objet Caméra actif à la fois Pour une caméra matérielle particulière.

9
madhu131313

Vous téléchargez manuellement votre application sur votre téléphone. C'est pourquoi l'autorisation de la caméra n'est pas approuvée. Vous devez ouvrir settings-> applications (ou quelque chose comme ça) et approuver manuellement cette permission.

22
Yuri Smirnoff

Dans Android 6, assurez-vous de demander l'autorisation pour la caméra. L'accès à la caméra est considéré comme l'un des "autorisations dangereuses" .

9
Timmmm

assurez-vous que votre application est autorisée à utiliser l'appareil photo, par exemple

<uses-permission Android:name="Android.permission.CAMERA"/>

dans AndroidManifest.xml

8
mustafa

j'ai eu la réponse pour ceci:

étape 1:

 private static final int REQUEST_GET_ACCOUNT = 112;
 private static final int PERMISSION_REQUEST_CODE = 200;

étape 2:

 int currentapiVersion = Android.os.Build.VERSION.SDK_INT;
        if (currentapiVersion >= Android.os.Build.VERSION_CODES.M) {
            if (checkPermission()) {
                Toast.makeText(getApplicationContext(), "Permission already granted", Toast.LENGTH_LONG).show();
            } else {
                requestPermission();
            }
        }

étape 3:

private boolean checkPermission() {
        int result = ContextCompat.checkSelfPermission(getApplicationContext(), GET_ACCOUNTS);
        int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA);
        return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
    }

    private void requestPermission() {
        ActivityCompat.requestPermissions(this, new String[]{GET_ACCOUNTS, CAMERA}, REQUEST_GET_ACCOUNT);
        ActivityCompat.requestPermissions(this, new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
    }

    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0) {

                    boolean locationAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    boolean cameraAccepted = grantResults[1] == PackageManager.PERMISSION_GRANTED;

                    if (locationAccepted && cameraAccepted)
                        Toast.makeText(getApplicationContext(), "Permission Granted, Now you can access location data and camera", Toast.LENGTH_LONG).show();
                    else {
                        Toast.makeText(getApplicationContext(), "Permission Denied, You cannot access location data and camera", Toast.LENGTH_LONG).show();
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            if (shouldShowRequestPermissionRationale(WRITE_EXTERNAL_STORAGE)) {
                                showMessageOKCancel("You need to allow access to both the permissions",
                                        new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                                    requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE},
                                                            PERMISSION_REQUEST_CODE);
                                                }
                                            }
                                        });
                                return;
                            }
                        }

                    }
                }

                break;
        }
    }

    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new Android.support.v7.app.AlertDialog.Builder(CaptureActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
    }
3
vels

Dans mon cas, votre code fonctionne, après avoir ajouté cela dans AndroidManifest.xml

 <uses-feature Android:name="Android.hardware.camera" />
 <uses-permission Android:name="Android.permission.CAMERA"/>
0
Nurul Akter Towhid

essayez de fermer la caméra une fois votre travail terminé Dans mon cas, j’utilise mScannerView.stopCamera () parce que je l’utilise pour scanner le code QR.

0
zakaria