8

私のアプリには、背面カメラを必要とする機能があります。フロントカメラの有無は私のニーズとは関係ありません。あらゆる状況でリアカメラが存在するかどうかを検出するための堅牢なルーチンをまとめるのは難しいことがわかっています. たとえば、HTC Evo 3D を使用しているユーザーは、アプリに背面カメラがない (明らかにある) と書かれていると不満を漏らしています。

多くのデバイスを持っているにもかかわらず、Nexus 7 などの前面カメラのみを備えたデバイスや、ユーザーが言及したモデルのいずれかを備えていないため、これをテストするのは難しいことです。

これが私が持っているもので、これはこのサイトの他の回答のコードから取られました:

boolean rearCameraFound = false;
    if(BUILD_VERSION > 8){
        int cameraCount = 0;
        Camera cam = null;
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        cameraCount = Camera.getNumberOfCameras();
        for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
            Camera.getCameraInfo( camIdx, cameraInfo );
            if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK  ) {
                try {
                    cam = Camera.open( camIdx );
                    Log.d("TAG", "Rear camera detected");
                    rearCameraFound = true;
                } catch (RuntimeException e) {
                    Log.e("TAG", "Camera failed to open: " + e.getLocalizedMessage());
                }
            }
            if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ) {
                Log.d("TAG", "Front camera detected");
            }
        }
        return rearCameraFound;
    }else{
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }

このコードをよりシンプルなバージョンに置き換えました。

PackageManager pm = context.getPackageManager();
return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);

ただし、たとえばNexus 7でフロントカメラのみを使用するとどうなるかはわかりません. これは true を返しますか?

リアカメラがあるかどうかを確実に教えてくれるコードを探しています!

4

4 に答える 4

9

Nexus 7 (前面カメラが 1 つしかない) は false を返します。FEATURE_CAMERA代わりに、 を使用できますFEATURE_CAMERA_FRONTこの議論をチェックしてください。

ここで、上記を使用して、少なくとも 1 つのカメラがあることを確認できます。これで、電話機に存在するカメラの数を確認できます。それが 1 より大きい場合は、確実に背面カメラがあります。

import android.hardware.Camera;

int numCameras = Camera.getNumberOfCameras();
if (numCameras > 1) {
  rearCamera = true;
}

これはかなりトリッキーです。しかし、それはすべてです、私は今考えることができます。試してみてください。

于 2013-01-18T12:54:27.177 に答える
2

このスニペットを使用します。これは API 9 以降でのみ機能することに注意してください。

private static boolean checkCameraFacing(final int facing) {
    if (getSdkVersion() < Build.VERSION_CODES.GINGERBREAD) {
        return false;
    }
    final int cameraCount = Camera.getNumberOfCameras();
    CameraInfo info = new CameraInfo();
    for (int i = 0; i < cameraCount; i++) {
        Camera.getCameraInfo(i, info);
        if (facing == info.facing) {
            return true;
        }
    }
    return false;
}

public static boolean hasBackFacingCamera() {
    final int CAMERA_FACING_BACK = 0;
    return checkCameraFacing(CAMERA_FACING_BACK);
}

public static boolean hasFrontFacingCamera() {
    final int CAMERA_FACING_BACK = 1;
    return checkCameraFacing(CAMERA_FACING_BACK);
}

public static int getSdkVersion() {
    return android.os.Build.VERSION.SDK_INT;
}

そして、これはカメラを開く必要はありません。

于 2014-06-13T08:34:30.153 に答える
1

デバイスにカメラが 1 つしかない場合は、背面カメラのみ、または前面カメラのみを使用できます。まず、背面カメラが存在するかどうかを確認します。

  • フロントカメラが存在するかどうかを確認しますが、2つのカメラを備えたデバイスには明らかにフロントカメラがあります
  • デバイスにカメラが 1 つしかないかどうかを確認しますが、背面または前面のカメラを搭載できます
  • 最終結果: デバイスに前面カメラがあり、カメラが 1 つしかない場合、背面カメラは存在しません
private boolean backCameraExists() {
    boolean isFrontExists = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
    if (isFrontExists && (Camera.getNumberOfCameras()<2)) {
        return false;
    }
    return true;
}
于 2015-03-18T22:24:33.420 に答える
1

フロントカメラ用

Context context = this; //If its Activity

// Context context=getActivity(); If its a Fragment

PackageManager packageManager = context.getPackageManager();

if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) {

    Log.i("CameraLog", "Front Camera Available");

} else {

    Log.i("CameraLog", "No Front Camera Available");
      }

バックカメラ用

Context context = this; //If its an Activity

// Context context=getActivity(); If its a fragments 

PackageManager packageManager = context.getPackageManager();

if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

    Log.i("CameraLog", "Back Camera is Available");

} else {

    Log.i("CameraLog", "No Back Camera Available");

      }
于 2014-11-06T08:58:16.873 に答える