web-dev-qa-db-ja.com

W / CameraBase:カメラへの接続中にエラーが発生しました:camera.open()呼び出しで0

私はカメラアプリを書いていますが、camera.open()を呼び出すたびにアプリがクラッシュし、このエラーが発生します:

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

カメラを開く方法は次のとおりです。

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)

    }
}

更新:

これを読んでいる場合、これは元のカメラAPI用であり、最新バージョンのカメラAPI(camera2)には適用されないことに注意してください。

機能が大きく、画像処理パイプラインも優れているため、この時点からcamera2 APIを使用する必要があります。

API 21(Lolipop)を除くまで有効であることに注意してください。つまり、Lolipop以上には適用されません。

16
Cjen1

次の方法を使用するには

Android.hardware.Camera.open(int cameraId)

CameraIdを渡す必要があります。フロントカメラIDが必要な場合は、次のメソッドを使用できます

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. 同じカメラが他のアプリケーションによって開かれている場合、RuntimeExceptionがスローされます。

  2. カメラの使用が終了したらrelease()を呼び出す必要があります。そうしないと、カメラはロックされたままになり、他のアプリケーションで使用できなくなります。

  3. アプリケーションは、特定のハードウェアカメラに対して一度に1つのカメラオブジェクトのみをアクティブにする必要があります。

9
madhu131313

手動でアプリケーションを電話にアップロードします。これが、カメラの許可が承認されない理由です。設定->アプリケーション(またはそのようなもの)を開き、この許可を手動で承認する必要があります。

25
Yuri Smirnoff

Android 6で、カメラの許可をリクエストしてください。カメラへのアクセスは 'dangerous permissions' のいずれかと見なされます。

10
Timmmm

アプリにカメラの許可があることを確認してください、例えば

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

androidManifest.xmlで

8
mustafa

私はこれに対する答えを得ました:これはマシュマロ許可問題のためです:あなたのプロジェクトにこれを追加してください:

ステップ1:

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

ステップ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();
            }
        }

ステップ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

私の場合、仕事を終えた後にカメラを閉じてみてください。コードQRのスキャンに使用するため、mScannerView.stopCamera()を使用します。

1
zakaria

私の場合、AndroidManifest.xmlにこれを追加した後、あなたのコードは動作します

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