Kiểm tra xem thiết bị có camera không?


80

Trong ứng dụng của tôi, tôi muốn sử dụng máy ảnh, nếu thiết bị có. Có thiết bị nào chạy android mà không có camera không? Bằng cách đưa những điều sau vào tệp kê khai của tôi:

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

thì về cơ bản nó nói "Tôi sẽ sử dụng máy ảnh nếu có, nhưng không cần máy ảnh để chạy ứng dụng".

Làm cách nào để kiểm tra xem máy ảnh có tồn tại trên thiết bị hay không trước khi cố gắng sử dụng loại Máy ảnh?


1
Tôi tin rằng (nhưng tôi không chắc 100%) rằng tất cả các phiên bản trước đây và hiện tại của Tài liệu Định nghĩa Tương thích Android đều chỉ định một máy ảnh có độ phân giải tối thiểu. Tuân thủ CDD là điều kiện tiên quyết để có quyền truy cập được cấp phép vào Android Market và các ứng dụng độc quyền của Google. Tuy nhiên, có những thiết bị Android không có (ví dụ như màu Nook).
ephemient

2
Kể từ hôm nay, phiên bản hiện tại của tài liệu (4.2) chỉ định "Việc triển khai thiết bị NÊN bao gồm một máy ảnh mặt sau và CÓ THỂ bao gồm một máy ảnh mặt trước." Lưu ý rằng nó không sử dụng từ khóa 'PHẢI'.
Matthew Blackford

Chỉ cần nói thêm rằng cũng có những thiết bị chỉ có camera mặt trước.
The Berga

Có một điểm nào đó khi thêm điều này vào tệp kê khai, nếu nó nói rằng ứng dụng phải hoạt động khi có và không có máy ảnh? Có lẽ nó ảnh hưởng đến ứng dụng trên Cửa hàng Play?
nhà phát triển android

Câu trả lời:


-44

Tôi đã không thử nó, nhưng:

private android.hardware.Camera mCameraDevice;

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

Có thể là những gì bạn cần.


Và đừng quên thả đối tượng Camera!
opedog

11
Xem câu trả lời của dpjanes dưới đây để biết cách chính xác để xem thiết bị có camera hay không.
Zack Marrapese

22
Cách tiếp cận tồi. Cuộc gọi đắt tiền. Nếu cùng một máy ảnh được mở bởi các ứng dụng khác, điều này sẽ tạo ra một RuntimeException. Không phù hợp với mục đích.
Con trỏ Null

5
Câu trả lời này đã trở nên quá nổi tiếng! :) meta.stackoverflow.com/a/316273/651647
Farshid Zaker

Việc triển khai này trên Android 6.0 (API Cấp 23) + sẽ tạo ra một SecurityException trừ khi bạn đã yêu cầu cụ thể quyền "android.permission.CAMERA" trong thời gian chạy.
Matt G

224

Đây là những gì tôi đang sử dụng

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

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

Tất cả những thứ thú vị khác để kiểm tra cũng có sẵn - la bàn, vị trí có sẵn không, có camera mặt trước không: http://developer.android.com/reference/android/content/pm/PackageManager.html


4
câu hỏi quá nhanh. điều này có thể ngớ ngẩn nhưng tôi là người mới sử dụng android / java, bạn lấy bối cảnh từ đâu ???? cảm ơn
grobartn

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

14
Từ cấp độ API 9, bạn có thể muốn kiểm tra FEATURE_CAMERA_FRONT bên cạnh FEATURE_CAMERA. Ví dụ: Nexus 7 (chỉ có một camera phía trước) trả về false thành FEATURE_CAMERA.
Jorge Cevallos

6
Đối với Kindle Fire HD 7 "(Android 4.0.3), tôi thấy rằng nó báo cáo FEATURE_CAMERA, mặc dù nó chỉ có camera trước! Thật tuyệt vời ... như một giải pháp thay thế tôi cũng thử nghiệm (FEATURE_CAMERA_FRONT và Camera.getNumberOfCameras () == 1 ) sau đó tôi biết rằng không có camera phía sau.
CSmith

6
Sau cấp độ API 17, bạn có thể sử dụng PackageManager.FEATURE_CAMERA_ANY
XY

42

Để biết có bao nhiêu camera trên thiết bị của mình, bạn có thể gọi:

import android.hardware.Camera;

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

Camera.getNumberOfCameras () là tĩnh, vì vậy nó không yêu cầu thực sự kết nối với máy ảnh. Điều này hoạt động kể từ API 9.

Biên tập:

Với API camera2 mới hơn, bạn cũng có thể gọi CameraManager.getCameraIdList () , cung cấp danh sách tất cả các ID camera hợp lệ, thay vì chỉ số lượng.


2
điều này hiệu quả với tôi và FEATURE_CAMERA không có trong API 19
sobelito

Phiên bản một dòng: boolean hasCam = android.hardware.Camera.getNumberOfCameras ()> 0;
J.Jacobs-VP

Câu trả lời này là tốt hơn. hasSystemFeature (PackageManager.FEATURE_CAMERA) trả về false trên Kit-Kat (Nexus 7)
Kirill Karmazin

1
Nó trả về false cho Nexus 7 (2013), vì FEATURE_CAMERA chỉ nói về máy ảnh mặt sau (do khả năng tương thích ngược); FEATURE_CAMERA_ANY là tính năng đúng nếu có ít nhất một máy ảnh thuộc bất kỳ loại nào trên thiết bị.
Eddy Talvala

Tại sao android.hardware.Camerakhông được dùng nữa? Cái gì nên được sử dụng thay thế cho chức năng này? Tôi biết bây giờ chúng tôi có android.hardware.camera2, nhưng chúng tôi có thể tìm thấy giải pháp thay thế getNumberOfCamerasở đâu?
nhà phát triển android

12

bạn nên sử dụng cái này để tìm máy ảnh trong thiết bị của mình

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

1
Tôi nghĩ rằng đây là một trong những hữu ích nhất. FEATURE_CAMERA_ANY là một lựa chọn tốt. Đây là một phiên bản ngắn hơn của mã cho những người thích nó. public static boolean isCameraAvailable(Context context) { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) }
miva2

6

Camera.getNumberOfCameras () không được dùng nữa. Bạn có thể dùng:

@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

Bằng cách sau chúng ta có thể kiểm tra thiết bị có camera hay không.

/** 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

Nếu bạn đang sử dụng Android 2.3, có một số API mà bạn có thể kiểm tra trạng thái máy ảnh của mình, chẳng hạn như số lượng máy ảnh (mặt trước và mặt sau)


1

thử cái này

Đối với camera trước

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

cho camera sau

    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

Theo tài liệu , bạn phải sử dụng Trình quản lý gói để kiểm tra xem Máy ảnh có khả dụng trên thiết bị hay không

Trong Java:

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

Trong Kotlin:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

0

Tôi tìm thấy trong các hộp android tv nơi bạn có thể cắm và chạy máy ảnh usb một số lần. Tại một số thời điểm, Dịch vụ camera bắt đầu thông báo rằng nó đã phát hiện một camera trong hệ thống trong khi không có camera nào được kết nối với hệ thống. Điều này xảy ra khi bạn cắm / rút máy ảnh nhiều lần. Để khắc phục điều đó, tôi thấy giải pháp này hoạt động:

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

Giải pháp một dòng:

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

Đặt phương thức này trong lớp dự án Utils.java của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.