Google JetPack組件-CameraX初探

CameraX 是一個 Google 推出的 JetPack 組件 卦羡,應(yīng)該來說還算是一個新鮮玩意兒掏熬,故給大家分享下我在項目中的使用過程心得。粗卜。

CameraX 是什么?

Google 開發(fā)者文檔 對 CameraX 的評價如下:

CameraX是一個Jetpack支持庫纳击,旨在幫助您簡化相機應(yīng)用程序的開發(fā)工作续扔。它提供一致且易于使用的API接口,適用于大多數(shù)Android設(shè)備焕数,可以向后兼容至Android 5.0(API等級21)纱昧。

雖然它利用的是camera2的功能,但使用的是更為簡單且基于用例的方法堡赔,該方法具有生命周期感知能力识脆。它還解決了設(shè)備兼容性問題,因此您無需在代碼庫中包含設(shè)備專有代碼善已。這些功能減少了將相機功能添加到應(yīng)用時需要編寫的代碼量灼捂。

最后,通過CameraX换团,開發(fā)者只需兩行代碼即可利用與預(yù)安裝的相機應(yīng)用相同的相機體驗和功能 CameraX擴展 是可選插件悉稠,通過該插件,您可以在支持的設(shè)備上向自己的應(yīng)用中添加人像艘包,HDR的猛,夜間模式和美顏等效果。

本人的愚見:CameraX 是 Google 為了解決開發(fā)者們開發(fā)有關(guān)相機功能時遇到諸如適配等各種問題的一件稱手的兵器想虎。卦尊。

CameraX 入門

CameraX 還在測試alpha階段,截至目前核心庫最新的版本是 1.0.0-alpha05舌厨,估計Google未來會繼續(xù)修復(fù)現(xiàn)有的bug和推出穩(wěn)定版(我也不知道啥時候??)岂却。

在這里插入圖片描述

CameraX 在項目中使用

CameraX 是 基于 Camera2 構(gòu)建的,內(nèi)部實現(xiàn)細(xì)節(jié)很多與Google之前推出的Camera2相同,所以說之前使用過Camera2 的旁友們對于 CameraX 可能會有一種親切感hhh淌友。而對于沒有接觸過Camera2或者說沒有接觸過相機功能開發(fā)的小??伴們煌恢,相信我,CameraX 入門的確是很簡單震庭,很簡單瑰抵,很簡單。

有關(guān)下面的代碼是用 Java 實現(xiàn)的器联,相信使用 Kotlin的小伙伴二汛,也能一看就懂,網(wǎng)上的資料也大部分是Kotlin的??

CameraX 依賴

首先是要在 build.gradle(Module:app) 添加 以下的依賴拨拓,可以根據(jù)具體的需求添加??


// CameraX 核心庫

    def camerax_version = "1.0.0-alpha05"

    // CameraX view

    def camerax_view_version = "1.0.0-alpha02"

    // CameraX 擴展 library

    def camerax_ext_version = "1.0.0-alpha02"

    implementation "androidx.camera:camera-core:$camerax_version"

    //如果你要使用Camera2的擴展功能

    implementation "androidx.camera:camera-camera2:$camerax_version"

    // 如果你要使用 CameraX View

    implementation "androidx.camera:camera-view:$camerax_view_version"

    // 如果你要使用 CameraX 的 擴展功能

    implementation "androidx.camera:camera-extensions:$camerax_ext_version"

    //申請權(quán)限

    implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5'

CameraX 獲取權(quán)限

使用CameraX還是需要我們聲明和動態(tài)申請的肴颊,畢竟我們還是會使用相機這個東西。

1渣磷、在 AndroidManifest.xml 里 注冊相關(guān)的權(quán)限婿着,相信大家都懂的~


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

    <uses-feature android:name="android.permission.camera"/>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

2、在你的項目中合適的地方醋界,動態(tài)申請下相關(guān)的權(quán)限

為了方便省事竟宋,我使用了 RxPermissons 這個庫進行動態(tài)申請權(quán)限和權(quán)限的管理


@SuppressLint("CheckResult")

    public void initPermission() {

RxPermissions rxPermissions = new RxPermissions(this);   

          rxPermissions.request( 

                      Manifest.permission.CAMERA,        

                      Manifest.permission.WRITE_EXTERNAL_STORAGE, 

                      Manifest.permission.READ_EXTERNAL_STORAGE)

                .subscribe(new Consumer<Boolean>() {

                    @Override

                    public void accept(Boolean aBoolean) throws Exception {

                        if (aBoolean) {

                          //申請權(quán)限成功,操作

                        } else {

                          //申請權(quán)限失敗形纺,操作

                        }

                    }

                });

    }

頁面布局

眾所周知丘侠,無論是拍照前還是拍攝視頻,我們都希望可以看到當(dāng)前的預(yù)覽逐样,從而控制拍攝的效果蜗字,那么CameraX是通過啥東東來讓我們進行預(yù)覽操作的呢?答案是 它的 TextureView 脂新,我們需要在進行預(yù)覽的頁面的布局XML里放入一個 TextureView挪捕。


    <RelativeLayout

        android:orientation="vertical"

        android:layout_width="match_parent"

        android:layout_height="match_parent">



        <TextureView

            android:id="@+id/containerCamera"

            android:layout_width="match_parent"

            android:fitsSystemWindows="true"

            android:layout_height="match_parent"

            />

    </RelativeLayout>

那么預(yù)覽的輸出到時候就會在這個 TextureView上展示出來。

重頭戲來了争便,怎么讓相機打開看到圖像并且可以保存拍攝的照片呢

1担神、 CameraX 的配置 (告訴 CameraX ,你想要做什么)

CameraX 可以做的事情始花,總體來說分三個部分--圖像預(yù)覽PreView,圖像分析Analyze孩锡,圖像拍攝Capture酷宵。

我們要分別對它們進行配置,告訴 CameraX 我們要怎么用它們躬窜。

ImageCapture類浇垦、ImageAnalysis類、Preview類的對象就是我們具體操作使用的對象

配置過程如下:


    ImageCapture imageCapture;

    ImageAnalysis imageAnalysis;

    Preview preview;



    void initCameraConfig() {

        //拍攝預(yù)覽的配置config

        PreviewConfig.Builder configBuilder = new PreviewConfig.Builder().setLensFacing(CameraX.LensFacing.BACK);

        preview = new Preview(configBuilder.build());

        //圖片分析的配置config荣挨,Size對象里面分辨率男韧,CameraX會自動找最適合當(dāng)前設(shè)備的分辨率

        ImageAnalysisConfig imageAnalysisConfig = new ImageAnalysisConfig.Builder().setTargetResolution(new Size(1080,2248)).build();

        imageAnalysis = new ImageAnalysis(imageAnalysisConfig);

        //圖片拍攝的配置config

ImageCaptureConfig.Builder captureBuilder = new ImageCaptureConfig.Builder().setLensFacing(CameraX.LensFacing.BACK);

        imageCapture = new ImageCapture(captureBuilder.build());

    }

2朴摊、如何使用ImageCapture類、ImageAnalysis類此虑、Preview類的對象呢甚纲?

首先要把它們加入到 LifeCycle上管理


CameraX.bindToLifecycle(getSelf(), preview, imageAnalysis, imageCapture);

然后為它們注冊綁定相關(guān)的事件

首先是 圖像預(yù)覽 和 圖像分析 的事件


//圖像預(yù)覽的具體操作

        preview.setOnPreviewOutputUpdateListener(new          Preview.OnPreviewOutputUpdateListener() {

            @Override

            public void onUpdated(Preview.PreviewOutput output) {

          //下面這一步很重要

          //把預(yù)覽的輸出附加在自己的TextureView控件上,這樣才可以看見預(yù)覽

              containerCamera.setSurfaceTexture(output.getSurfaceTexture());

            }

        });



//圖像分析的具體操作

        imageAnalysis.setAnalyzer(new ImageAnalysis.Analyzer() {

            @Override

            public void analyze(ImageProxy image, int rotationDegrees) {

            // image 會不斷傳進來朦前,你可以對它進行各種你想要的操作

            }

        });



拍攝介杆、保存照片的操作比上面的多了一丟丟,不過也是灰常簡單的韭寸!


            //創(chuàng)建要存儲照片的File春哨,要記得檢查權(quán)限的獲取

            String imageName = "QG7777777.png";

            //下面是拍攝照片的輸出與回調(diào),可以綁定一個按鈕的點擊事件之類的

imageCapture.takePicture(createImageFile(imageName), new ImageCapture.OnImageSavedListener() {

                @SuppressLint("CheckResult")

                @Override

                public void onImageSaved(@NonNull File file) {

//成功保存照片后的回調(diào)

                }



                @Override

                public void onError(@NonNull ImageCapture.ImageCaptureError imageCaptureError, @NonNull String message, @Nullable Throwable cause) {

                  //保存照片失敗后的回調(diào)

                    String errorMsg = "發(fā)生了未知的錯誤";

                    if(cause != null) {

                        errorMsg = cause.getMessage();

                    }

                }

            });



    //保存指定名稱的文件恩伺,絕對路徑為"/storage/emulated/0/"+imageName

    File createImageFile(String imageName) {

        return new File(Environment.getExternalStorageDirectory(),imageName);

    }

好啦赴背,按步驟做到這里,你已經(jīng)可以拍攝出一張由CameraX 拍攝的照片了晶渠。

還不夠凰荚,想要更多的基礎(chǔ)操作?

CameraX 也支持很多的基礎(chǔ)操作乱陡,下面以 1.0.0-alpha05 已經(jīng)支持的 點擊對焦 操作為例

CameraX 將對焦操作浇揩,(我認(rèn)為的) 濃縮成了三步:

1、獲取用戶點擊畫面區(qū)域的屏幕坐標(biāo)

2憨颠、將屏幕坐標(biāo)系的坐標(biāo)轉(zhuǎn)換為CameraX能讀懂的坐標(biāo)

3胳徽、告訴CameraX ,你想要開啟點擊對焦操作(配置)

對焦操作很簡單爽彤,獲取點擊畫面區(qū)域的坐標(biāo)方法很多很多养盗,我的代碼,參考如下:


        /**

        *點擊畫面區(qū)域進行對焦操作的實現(xiàn)

        */

containerCamera.setOnTouchListener(new View.OnTouchListener() {

            @Override

            public boolean onTouch(View v, MotionEvent event) {

                TextureViewMeteringPointFactory pointFactory = new TextureViewMeteringPointFactory(containerCamera);

                MeteringPoint meteringPoint = pointFactory.createPoint(event.getX(),event.getY());

                FocusMeteringAction action = FocusMeteringAction.Builder

                        .from(meteringPoint)

                        .build();

                try { CameraX.getCameraControl(CameraX.LensFacing.BACK).startFocusAndMetering(action);

                } catch (CameraInfoUnavailableException e) {

                    e.printStackTrace();

                }

                return false;

            }

        });

擴展功能适篙,Extensions 往核?

沒錯,CameraX 還支持 很多 擴展的功能嚷节,諸如開啟 HDR 聂儒,開啟 人像 模式,開啟 **美顏模式 **等等等硫痰。衩婚。

CameraX 將擴展功能的開啟 也 大大濃縮了,而且會自動判斷設(shè)備是否支持開啟效斑。o( ̄▽ ̄)d

下面以開啟 HDR 為例非春,讓我們回到 配置 config 那一塊

首先檢查自己的 build.gradle(Module:app) 有沒有 CameraX extensions 插件的依賴,沒有的先補上。

在創(chuàng)建preview 和 imageCapture 對象的時候就把 我們想要 開啟HDR 操作 告訴 CameraX奇昙,它就會幫我們檢測設(shè)備是否支持并開啟HDR這個功能了护侮。

就是這么地簡單,沒有了以前的繁瑣操作和適配問題储耐。羊初。


//拍攝預(yù)覽的配置config

        PreviewConfig.Builder configBuilder = new PreviewConfig.Builder().setLensFacing(CameraX.LensFacing.BACK);

        HdrPreviewExtender hdrPreviewExtender = HdrPreviewExtender.create(configBuilder);

        //拍攝預(yù)覽,開啟HDR弧岳,判斷硬件條件是否支持開啟凳忙,是則直接開啟

        if(hdrPreviewExtender.isExtensionAvailable()) {

            hdrPreviewExtender.enableExtension();

        }

        preview = new Preview(configBuilder.build());



        //圖片拍攝的配置config

        ImageCaptureConfig.Builder captureBuilder = new ImageCaptureConfig.Builder().setLensFacing(CameraX.LensFacing.BACK);

        HdrImageCaptureExtender hdrImageCaptureExtender = HdrImageCaptureExtender.create(captureBuilder);

        //拍攝照片,開啟HDR禽炬,判斷硬件條件是否支持開啟涧卵,是則直接開啟

        if(hdrImageCaptureExtender.isExtensionAvailable()) {

            hdrImageCaptureExtender.isExtensionAvailable();

        }

        imageCapture = new ImageCapture(captureBuilder.build());

總結(jié)

CameraX 是 Google 推出的一個挺不錯的 JetPack 組件,入門真的非常簡單腹尖,使用起來很方便柳恐,節(jié)省了很多開發(fā)時間。而且綁定了LifeCycle 热幔,因此生命周期管理也挺省事乐设。

雖說目前還不太成熟,但畢竟它還在測試階段绎巨,Google未來還會修復(fù)bug和推出新功能近尚,期待它的未來~

這篇文章只是介紹了CameraX的入門操作,想要了解更多和獲取最新的信息场勤,請前往Google家的文檔戈锻。

Google的開發(fā)者文檔:CameraX

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市和媳,隨后出現(xiàn)的幾起案子格遭,更是在濱河造成了極大的恐慌,老刑警劉巖留瞳,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拒迅,死亡現(xiàn)場離奇詭異,居然都是意外死亡她倘,警方通過查閱死者的電腦和手機璧微,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硬梁,“玉大人前硫,你說我怎么就攤上這事“辛铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罩息。 經(jīng)常有香客問我嗤详,道長,這世上最難降的妖魔是什么瓷炮? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任葱色,我火速辦了婚禮,結(jié)果婚禮上娘香,老公的妹妹穿的比我還像新娘苍狰。我一直安慰自己,他們只是感情好烘绽,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布淋昭。 她就那樣靜靜地躺著,像睡著了一般安接。 火紅的嫁衣襯著肌膚如雪翔忽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天盏檐,我揣著相機與錄音歇式,去河邊找鬼。 笑死胡野,一個胖子當(dāng)著我的面吹牛材失,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硫豆,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼龙巨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了够庙?” 一聲冷哼從身側(cè)響起恭应,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耘眨,沒想到半個月后昼榛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡剔难,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年胆屿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偶宫。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡非迹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纯趋,到底是詐尸還是另有隱情憎兽,我是刑警寧澤冷离,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站纯命,受9級特大地震影響西剥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亿汞,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一瞭空、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疗我,春花似錦咆畏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苍蔬。三九已至,卻和暖如春钦讳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枕面。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工愿卒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潮秘。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓琼开,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枕荞。 傳聞我的和親對象是個殘疾皇子柜候,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容