デバイスにカメラがあるかどうかを確認しますか?


80

私のアプリでは、デバイスにカメラがある場合はカメラを使用したいと思います。カメラを持たないAndroidを実行しているデバイスはありますか?私のマニフェストに以下を含めることによって:

<uses-feature android:name="android.hardware.camera" android:required="false"/>

基本的には、「カメラがあれば使用しますが、アプリを実行するのにカメラは必要ありません」と言っています。

Cameraクラスを使用する前に、デバイスにカメラが存在するかどうかを確認するにはどうすればよいですか?


1
Android互換性定義ドキュメントの過去および現在のすべてのバージョンで、最小解像度のカメラが指定されていると思います(ただし、100%確信はありません)。CDDに準拠することは、Androidマーケットおよび独自のGoogleアプリケーションへのライセンスアクセスの前提条件です。ただし、そうではないAndroidデバイスがあります(たとえば、Nookカラー)。
ephemient 2011年

2
今日の時点で、ドキュメントの現在のバージョン(4.2)は、「デバイスの実装には背面カメラを含める必要があり、前面カメラを含めることができます」と指定しています。キーワード「MUST」を使用しないことに注意してください。
マシューブラックフォード2013

加えて、前面カメラしかないデバイスもあります。
ベルガ2016

アプリがカメラの有無にかかわらず動作する必要があると表示されている場合、これをマニフェストに追加することに意味はありますか?おそらく、Playストアのアプリに影響しますか?
Androidデベロッパー

回答:


-44

私はそれを試していませんが:

private android.hardware.Camera mCameraDevice;

try {
  mCameraDevice = android.hardware.Camera.open();
} catch (RuntimeException e) {
  Log.e(TAG, "fail to connect Camera", e);
  // Throw exception
}

あなたが必要なものかもしれません。


そして、Cameraオブジェクトを解放することを忘れないでください!
opedog 2011年

11
デバイスにカメラがあるかどうかを確認する正しい方法については、以下のdpjanesの回答を参照してください。
ザックマラペス

22
悪いアプローチ。高価な電話。同じカメラが他のアプリケーションによって開かれると、RuntimeExceptionがスローされます。目的に合わない。
ポインタヌル

5
この答えはとても有名になりました!:) meta.stackoverflow.com/a/316273/651647
Farshid Zaker 2016

+ Android 6.0(APIレベル23)でのこの実装では、実行時に「android.permission.CAMERA」権限を特に要求しない限り、SecurityExceptionがスローされます。
マットG

224

これは私が使用しているものです

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
}

テストする他のあらゆる種類の楽しいものも利用できます-コンパス、場所が利用可能、正面カメラがあります:http//developer.android.com/reference/android/content/pm/PackageManager.html


4
とても簡単な質問。これはばかげているかもしれませんが、私はandroid / javaを初めて使用しますが、どこからコンテキストを取得しますか???? ありがとう
grobartn 2011

3
@grobartn:public class YourActivity extends Activity { Context contextActivity; PackageManager pm; @Override public void onCreate(Bundle savedInstanceState) { ... contextActivity = this; pm = contextActivity.getPackageManager(); ...
Klofi 2011

14
APIレベル9から、FEATURE_CAMERAの他にFEATURE_CAMERA_FRONTを確認することをお勧めします。たとえば、Nexus 7(正面カメラが1つしかない)はFEATURE_CAMERAにfalseを返します。
ホルヘセヴァロス2012

6
Kindle Fire HD 7 "(Android 4.0.3)の場合、フロントカメラしかないのにFEATURE_CAMERAが報告されることがわかりました!ひどい...回避策としてテストも行います(FEATURE_CAMERA_FRONTおよびCamera.getNumberOfCameras()== 1 )その後、私は、リアカメラがありません知っている。
CSmith

6
APIレベル17以降は、PackageManager.FEATURE_CAMERA_ANY
XY

42

デバイスで使用可能なカメラの数を確認するには、次の電話番号に電話してください。

import android.hardware.Camera;

int numCameras = Camera.getNumberOfCameras();
if (numCameras > 0) {
  hasCamera = true;
}

Camera.getNumberOfCameras()は静的であるため、実際にカメラに接続する必要はありません。これはAPI9以降で機能します。

編集:

新しいcamera2APIを使用すると、CameraManager.getCameraIdList()を呼び出すこともできます。これにより、カウントだけでなく、すべての有効なカメラIDのリストが提供されます。


2
これは私にとってはうまく
いき

1行バージョン:boolean hasCam = android.hardware.Camera.getNumberOfCameras()> 0;
J.Jacobs-VP

この答えはより良いです。hasSystemFeature(PackageManager.FEATURE_CAMERA)はキットカット(Nexus 7)でfalseを返します
Kirill Karmazin 2017年

1
Nexus 7(2013)の場合、FEATURE_CAMERAは背面カメラのみに関するものであるため(下位互換性のため)、falseを返します。FEATURE_CAMERA_ANYは、デバイス上に何らかの種類のカメラが少なくとも1台ある場合に当てはまる機能です。
Eddy Talvala 2017年

なぜandroid.hardware.Camera非推奨になるのですか?この機能の代わりに何を使用する必要がありますか?私たちは今持っていることを知っていますがandroid.hardware.camera2getNumberOfCamerasそこに代わるものをどこで見つけることができますか?
Androidデベロッパー

12

これを使用して、デバイス内のカメラを見つける必要があります

public static boolean isCameraAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
}

1
これが一番便利だと思います。FEATURE_CAMERA_ANYは良い選択です。これは、それを好む人のためのコードの短いバージョンです。 public static boolean isCameraAvailable(Context context) { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) }
miva2 2015年

6

Camera.getNumberOfCameras()は非推奨になりました。次を使用できます。

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int getNumberOfCameras() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        try {
            return ((CameraManager) getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length;
        } catch (CameraAccessException e) {
            Log.e("", "", e);
        }
    }
    return Camera.getNumberOfCameras();
}



3

次の方法で、デバイスにカメラがあるかどうかを確認できます。

/** Check if this device has a camera */
    public static boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) 
        {
            return true;
        }
        else if(context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA_FRONT))
        {
            return true;
        }
        else {
            return false;
        }
    }

1

Android 2.3を使用している場合、カメラの数(前面と背面)など、カメラのステータスを確認できるAPIがいくつかあります。


1

これを試して

フロントカメラ用

    Context context = this;
    PackageManager packageManager = context.getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) {

        Utils.makeAlertDialog(context, "Has Front Camera ?", "YES");

    } else {

        Utils.makeAlertDialog(context, "Has Front Camera ?", "NO");
          }

バックカメラ用

    Context context = this;
    PackageManager packageManager = context.getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

        Utils.makeAlertDialog(context, "Has back Camera ?", "YES");

    } else {

        Utils.makeAlertDialog(context, "Has back Camera ?", "NO");
          }


0

あたりとしてのドキュメントにパッケージマネージャーを使用して、カメラがデバイスで使用可能かどうかを確認する必要があります

Javaの場合:

final boolean isCameraAvailable = getPackageManager().hasSystemFeature(FEATURE_CAMERA);

Kotlinの場合:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

0

USBカメラを何度も接続して再生できるAndroidTVボックスを見つけました。ある時点で、カメラサービスは、システムにカメラが接続されていないときに、システム内で1台のカメラを検出したと通知し始めます。これは、カメラを何度もプラグイン/プラグアウトしたときに発生します。それを修正するために、私はこのソリューションが機能していることを発見しました:

//under oncreate:
//cameraManager = ((CameraManager) getSystemService(Context.CAMERA_SERVICE)); 

public int getNumberOfCameras() {
        int count_ = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            try {
                count_ = cameraManager.getCameraIdList().length;

                if(count_==1)
                {
                    try {
                        cameraManager.getCameraCharacteristics(cameraManager.getCameraIdList()[0]);
                    }catch (Exception e)
                    {
                        count_ = 0;
                    }
                }

            } catch (Exception e) {
               //e.printStackTrace();
            }
        }
        else {
            count_ = Camera.getNumberOfCameras();
        }

        return count_;
    }

0

ワンラインソリューション:

public static boolean hasCamera(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}

このメソッドをUtils.javaプロジェクトクラスに配置します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.