Làm cách nào để sử dụng API camera hoặc camera2 của Android để hỗ trợ các phiên bản API cũ và mới mà không cần ghi chú?


135

API camera2 mới làm tôi bối rối. Tôi muốn phát triển một ứng dụng (dành cho API Android 10 - 21) sử dụng máy ảnh của thiết bị. Như đã nêu ở đây , tôi nên sử dụng API "Camera".

Tuy nhiên, khi tôi cố gắng thêm API "Camera" (android.hardware.Camera) vào các tính năng người dùng của tệp kê khai, nó được đánh dấu là không dùng nữa . Mặt khác, tôi không thể thay đổi nó thành API "camera2" (android.hardware.camera2) vì nó chỉ tương thích với API Android 21+ (Android 5 - Lollipop) - Tôi cũng có thể liên kết nó, nhưng tôi chỉ có thể thêm 2 liên kết.

Tôi không chỉ muốn ứng dụng của mình chạy trên các phiên bản Android cũ hơn, mà còn là ứng dụng mới nhất ...

Câu trả lời:


152

Mặc dù API camera cũ bị đánh dấu là không dùng nữa, nhưng nó vẫn đầy đủ chức năng và sẽ duy trì trong một thời gian dài (vì gần như tất cả các ứng dụng sử dụng máy ảnh trên Play Store hiện đều sử dụng nó).

Bạn sẽ phải bỏ qua các khiếu nại của Android Studio về việc nó không được chấp nhận, nhưng nếu bạn muốn hỗ trợ các phiên bản Android sớm hơn 21, bạn phải sử dụng API cũ.

Trên API cấp 21, bạn chắc chắn có thể sử dụng API mới và các tính năng mới của API, nhưng hiện tại bạn sẽ phải duy trì một luồng hoàn toàn riêng biệt trong ứng dụng của mình nếu bạn chuyển đổi giữa các API. Thật không may, hai API có một thế giới quan khác nhau, thật khó để viết một thư viện hỗ trợ cho phép bạn sử dụng một cái gì đó giống như API mới trên các thiết bị cũ (trong đó thư viện sẽ ánh xạ từ API mới sang API cũ trên API 21+).


1
Câu trả lời tốt. Vì vậy, nếu bạn muốn hỗ trợ API cấp 16 trở lên, tốt hơn hết là bạn nên sử dụng máy ảnh cũ ngay bây giờ, phải không?
Loolooii

5
Vì vậy, cách duy nhất là sử dụng if statement và android.os.Build.VERSION.SDK_INT để phân tách mã?
hadi

Vậy đối với nhà phát triển, nếu bạn chỉ nhắm mục tiêu API 21 trở lên, hãy sử dụng Camera2 nhưng nếu bạn cần hỗ trợ kế thừa, hãy sử dụng Camera? Hoặc bạn có đề nghị phát hiện các phiên bản xây dựng và mã hóa 2 phương pháp khác nhau bằng các API khác nhau không?
john.weland 8/12/2015

2
Nó phụ thuộc vào những gì ứng dụng của bạn làm. Nếu chức năng của máy ảnh là công cụ ngắm bắn đơn giản và bạn muốn nhắm mục tiêu các API cũ, chỉ cần sử dụng API Camera cũ. Nhưng nếu bạn đang muốn làm gì đó hơn là chỉ lấy JPEG và vẽ bản xem trước hoặc nếu bạn chỉ nhắm mục tiêu API mới, hãy đi với camera2. Ở giữa (cứng) là các ứng dụng muốn cung cấp các tính năng tùy chọn ưa thích trên camera2, nhưng cũng hoạt động trên các thiết bị cũ. Ở đó, bạn phải xây dựng hai loại tiền mã hóa riêng biệt, một loại cho mỗi API.
Eddy Talvala

21
Không tán thành API Camera là một sai lầm, họ nên giới thiệu API nâng cao Camera (đối với các ứng dụng nâng cao như ứng dụng máy ảnh đầy đủ) - nếu không (hầu hết) các ứng dụng sử dụng máy ảnh chỉ để chụp ảnh sẽ phải duy trì 2 apis. Google ít nhất nên giới thiệu một thư viện nhỏ gọn (như mọi khi)
Sudara

38

Đặt tất cả các phương thức từ máy ảnh mà bạn cần trong một giao diện và sau đó tạo một trường hợp máy ảnh như thế này

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Log.d(TAG, "camera2 selected");
        this.camera = new Camera2(getContext());
    } else {
        Log.d(TAG, "camera1 selected");
        this.camera = new Camera1(getContext());
    }

Bằng cách này, bạn sẽ có mọi thứ tách ra và nó sẽ làm cho cuộc sống của bạn dễ dàng hơn rất nhiều.

Lời khuyên - cuộc sống với camera2 không phải là tuyệt vời. Vender vẫn thực hiện các crap triển khai và do đó bạn sẽ phải thêm rất nhiều điều kiện và cách giải quyết.

Ví dụ 1 - S6 báo cáo rằng nó không hỗ trợ flash :) Ví dụ 2 - Một thiết bị LG báo cáo lại danh sách các kích thước hình ảnh được hỗ trợ - tuy nhiên không phải tất cả chúng đều thực sự được hỗ trợ !!


14
Đây là sự thật. API camera 2 thực sự chia các thiết bị camera thành ba loại: LEGACY, LIMITED và FULL. Nếu máy ảnh được phân loại là LEGACY thì tất cả các lệnh gọi API của camera2 sẽ được dịch sang camera1 dưới mui xe, vì vậy nó thực sự không đáng bận tâm. Đề nghị của tôi là gọiCameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... và chọn API cũ nếu nó đúng.
panonski

9

Để hỗ trợ api bạn muốn, hãy sử dụng mã dưới đây. Chỉ cần xác định tên thích hợp tương ứng cấp độ api. Ví dụ: API 21 là LOLLIPOP và API 15 là ICE_CREAM_SANDWICH_MR1.

 if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)  
                                    && ((Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP))) {
           // your code here - is between 15-21

 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           // your code here - is api 21
 }

33
điều này hầu như không thực tế đối với việc thực hiện máy ảnh đầy đủ. Thêm vào đó, bây giờ bạn phải duy trì hai codepath. kiểm tra phiên bản có sử dụng trong phát triển Android, nhưng đây không phải là nó.
katzenhut

5
Điều gì xảy ra nếu người dùng đang chạy Build.VERSION_CODES.LOLLIPOP_MR1? Hay cái gì đó ở trên? Tôi nghĩ rằng lần kiểm tra thứ hai của bạn phải là "khác nếu (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Ralph Pina

Xin lỗi, làm thế nào tôi có thể xây dựng trong cùng apk apk camera2 và api cũ nếu ứng dụng của tôi sẽ hoạt động trong api 16 và mới hơn? Hương liệu có tốt cho công việc này?
Mateus

Bạn phải thực hiện cả apis. Chỉ cần giữ một giao diện và hai lớp, trong đó chức năng camera được thực hiện. Trước khi tạo một trong các trường hợp để chạy camera, hãy gọi phương thức được đề cập ở trên, để nó có thể tìm ra lớp và chức năng nào cần gọi
user0770

3

Mặc dù, những gì Google khuyên bạn nên sử dụng Camera2 Api> = 21, nhưng bạn có thể gặp vấn đề với cài đặt thủ công.

Khi bạn cần ứng dụng triển khai để chụp ảnh với Chế độ cài đặt tự động, nó sẽ hoạt động tốt. Nhưng! Nếu cần tạo ứng dụng với triển khai Chế độ cài đặt thủ công, đối với các thiết bị có API> = 21, trước tiên, cần kiểm tra CẤP PHẦN MỀM được hỗ trợ:

Chọn máy ảnh (Mặt trước, Mặt), lấy đặc điểm của nó và kiểm tra CẤP PHẦN MỀM.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristic đại diện cho các cấp độ được hỗ trợ tiếp theo: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

Ở cấp độ cao, các cấp độ là:

DI SẢN thiết bị hoạt động ở chế độ tương thích ngược cho các thiết bị Android cũ hơn và có khả năng rất hạn chế.

GIỚI HẠN thiết bị đại diện cho bộ tính năng cơ bản và cũng có thể bao gồm các khả năng bổ sung là các tập hợp con của FULL.

ĐẦYNgoài ra, các thiết bị còn hỗ trợ kiểm soát thủ công từng khung hình cho các cài đặt cảm biến, đèn flash, ống kính và xử lý hậu kỳ, và chụp ảnh ở tốc độ cao.

CẤP 3 thiết bị cũng hỗ trợ tái xử lý YUV và chụp ảnh RAW, cùng với các cấu hình luồng đầu ra bổ sung.

Nếu bạn có cấp độ supprot LEGACY , bạn nên sử dụng Camera Api cũ .



0

Plz đọc liên kết Hỗ trợ phiên bản máy ảnh Họ tuyên bố rằng ....
Camera API1
Android 5.0 không dùng Camera API1, tiếp tục bị loại bỏ khi phát triển nền tảng mới tập trung vào Camera API2. Tuy nhiên, thời gian loại bỏ sẽ kéo dài và các bản phát hành Android sẽ tiếp tục hỗ trợ các ứng dụng Camera API1 trong một thời gian. Cụ thể, hỗ trợ tiếp tục cho:

  • Giao diện Camera1 cho các ứng dụng. Các ứng dụng máy ảnh được xây dựng trên Camera API1 sẽ hoạt động như trên các thiết bị chạy các phiên bản phát hành Android trước đó.
  • Phiên bản camera HAL. Bao gồm hỗ trợ cho Camera HAL1.0.

  • -1

    Tôi tìm ra lựa chọn tốt nhất là tạo hai hoạt động. Sử dụng cách chung để kiểm tra API thiết bị hiện tại

    Intent i;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        i = new Intent(context,camera2.class)
    } else {
        i = new Intent(context,camera.class);
    }
    startActivity(i);

    Bằng cách này, tôi không phải bối rối khi nhìn lại mã. Mã này rất dễ sửa đổi vì nó tách biệt.

    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.