日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android6.0源码分析之Camera API2.0下的初始化流程分析

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android6.0源码分析之Camera API2.0下的初始化流程分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、Camera2初始化的應用層流程分析

Camera2的初始化流程與Camera1.0有所區別,本文將就Camera2的內置應用來分析Camera2.0的初始化過程。Camera2.0首先啟動的是CameraActivity,而它繼承自QuickActivity,在代碼中你會發現沒有重寫OnCreate等生命周期方法,因為此處采用的是模板方法的設計模式,在QuickActivity中的onCreate方法調用的是onCreateTasks等方法,所以要看onCreate方法就只須看onCreateTasks方法即可:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//CameraActivity.java @Override public void onCreateTasks(Bundle state) {Profile profile = mProfiler.create(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CameraActivity.onCreateTasks"</span>).start();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>mOnCreateTime = System.currentTimeMillis();mAppContext = getApplicationContext();mMainHandler = new MainHandler(this, getMainLooper());…<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {//初始化OneCameraOpener對象①mOneCameraOpener = OneCameraModule.provideOneCameraOpener(mFeatureConfig, mAppContext,mActiveCameraDeviceTracker,ResolutionUtil.getDisplayMetrics(this));mOneCameraManager = OneCameraModule.provideOneCameraManager();} catch (OneCameraException e) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>}…//建立模塊信息②ModulesInfo.setupModules(mAppContext, mModuleManager, mFeatureConfig);…//進行初始化③mCurrentModule.init(this, isSecureCamera(), isCaptureIntent());… }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li></ul>

如代碼所示,重要的有以上三點,先看第一點:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//OneCameraModule.java public static OneCameraOpener provideOneCameraOpener(OneCameraFeatureConfig featureConfig, Context context, ActiveCameraDeviceTracker activeCameraDeviceTracker,DisplayMetrics displayMetrics) throws OneCameraException {//創建OneCameraOpener對象Optional<OneCameraOpener> manager = Camera2OneCameraOpenerImpl.create(featureConfig, context, activeCameraDeviceTracker, displayMetrics);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!manager.isPresent()) {manager = LegacyOneCameraOpenerImpl.create();}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> manager.get(); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

它調用Camera2OneCameraOpenerImpl的create方法來獲得一個OneCameraOpener對象,以供CameraActivity之后的操作使用,繼續看create方法:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//Camera2OneCameraOpenerImpl.java public static Optional<OneCameraOpener> create(OneCameraFeatureConfig featureConfig, Context context, ActiveCameraDeviceTracker activeCameraDeviceTracker, DisplayMetrics displayMetrics) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>CameraManager cameraManager;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {cameraManager = AndroidServices.instance().provideCameraManager();} catch (IllegalStateException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>}//新建一個Camera2OneCameraOpenerImpl對象OneCameraOpener oneCameraOpener = new Camera2OneCameraOpenerImpl(featureConfig, context, cameraManager,activeCameraDeviceTracker, displayMetrics);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> Optional.of(oneCameraOpener); } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

很明顯,它首先獲取一個cameraManger對象,然后根據這個cameraManager對象來新創建了一個Camera2OneCameraOpenerImpl對象,所以第一步主要是為了獲取一個OneCameraOpener對象,它的實現為Camera2OneCameraOpenerImpl類。?
繼續看第二步,ModulesInfo.setupModules:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">// ModulesInfo<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.java</span> public static void setupModules(Context context, ModuleManager moduleManager,OneCameraFeatureConfig config) {Resources res = context<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getResources</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>int photoModuleId = context<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getResources</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getInteger</span>(R<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.integer</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.camera</span>_mode_photo)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>//注冊Photo模塊registerPhotoModule(moduleManager, photoModuleId, SettingsScopeNamespaces<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.PHOTO</span>,config<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.isUsingCaptureModule</span>())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>//計算你還Photo模塊設置為默認的模塊moduleManager<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setDefaultModuleIndex</span>(photoModuleId)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>//注冊Videa模塊registerVideoModule(moduleManager, res<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getInteger</span>(R<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.integer</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.camera</span>_mode_video),SettingsScopeNamespaces<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.VIDEO</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>if (PhotoSphereHelper<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.hasLightCycleCapture</span>(context)) {//開啟閃光//注冊廣角鏡頭registerWideAngleModule(moduleManager, res<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getInteger</span>(R<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.integer</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.camera</span>_mode_panorama),SettingsScopeNamespaces<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.PANORAMA</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>//注冊光球模塊registerPhotoSphereModule(moduleManager,res<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getInteger</span>(R<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.integer</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.camera</span>_mode_photosphere),SettingsScopeNamespaces<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.PANORAMA</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>}//若需重新聚焦if (RefocusHelper<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.hasRefocusCapture</span>(context)) {//注冊重聚焦模塊registerRefocusModule(moduleManager, res<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getInteger</span>(R<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.integer</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.camera</span>_mode_refocus),SettingsScopeNamespaces<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.REFOCUS</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>}//如果有色分離模塊if (GcamHelper<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.hasGcamAsSeparateModule</span>(config)) {//注冊色分離模塊registerGcamModule(moduleManager, res<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getInteger</span>(R<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.integer</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.camera</span>_mode_gcam),SettingsScopeNamespaces<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.PHOTO</span>,config<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getHdrPlusSupportLevel</span>(OneCamera<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Facing</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.BACK</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>}int imageCaptureIntentModuleId = res<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getInteger</span>(R<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.integer</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.camera</span>_mode_capture_intent)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>registerCaptureIntentModule(moduleManager, imageCaptureIntentModuleId,SettingsScopeNamespaces<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.PHOTO</span>,config<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.isUsingCaptureModule</span>())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li></ul>

代碼根據配置信息,進行一系列模塊的注冊,其中PhotoModule和VideoModule被注冊,而其他的module則是根據配置來進行的,因為打開Camera應用,既可以拍照片也可以拍視頻,此處,只分析PhoneModule的注冊:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ModulesInfo.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">registerPhotoModule</span>(ModuleManager moduleManager, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> moduleId, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> String namespace, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> enableCaptureModule) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//向ModuleManager注冊PhotoModule模塊</span>moduleManager.registerModule(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ModuleManager.ModuleAgent() {<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">getModuleId</span>() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> moduleId;}<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">requestAppForCamera</span>() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> !enableCaptureModule;}<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> String <span class="hljs-title" style="box-sizing: border-box;">getScopeNamespace</span>() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> namespace;}<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> ModuleController <span class="hljs-title" style="box-sizing: border-box;">createModule</span>(AppController app, Intent intent) {Log.v(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"EnableCaptureModule = "</span> + enableCaptureModule);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//創建ModuleController</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> enableCaptureModule ? <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> CaptureModule(app) : <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> PhotoModule(app);}}); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul>

由代碼可知,它最終是由ModuleManager來新建一個CaptureModule實例,而CaptureModule其實實現了ModuleController ,即創建了一個CaptureModule模式下的ModuleController對象,而真正的CaptureModule的具體實現為ModuleManagerImpl。?
至此,前兩步已經獲得了OneCameraOpener以及新建了ModuleController,并進行了注冊,接下來分析第三步,mCurrentModule.init(this, isSecureCamera(), isCaptureIntent()):

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//CaptureModule.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">init</span>(CameraActivity activity, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> isSecureCamera, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> isCaptureIntent) {...HandlerThread thread = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> HandlerThread(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CaptureModule.mCameraHandler"</span>);thread.start();mCameraHandler = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Handler(thread.getLooper());<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取第一步中創建的OneCameraOpener對象</span>mOneCameraOpener = mAppController.getCameraOpener();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取前面創建的OneCameraManager對象</span>mOneCameraManager = OneCameraModule.provideOneCameraManager();} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (OneCameraException e) {Log.e(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Unable to provide a OneCameraManager. "</span>, e);}`...<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//新建CaptureModule的UI</span>mUI = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> CaptureModuleUI(activity, mAppController.getModuleLayoutRoot(), mUIListener);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//設置預覽狀態的監聽</span>mAppController.setPreviewStatusListener(mPreviewStatusListener);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> (mSurfaceTextureLock) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取SurfaceTexture</span>mPreviewSurfaceTexture = mAppController.getCameraAppUI().getSurfaceTexture();} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li></ul>

首先獲取前面創建的OneCameraOpener對象以及OneCameraManager對象,然后再設置預覽狀態監聽,這里主要分析預覽狀態的監聽:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//CaptureModule.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> PreviewStatusListener mPreviewStatusListener = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> PreviewStatusListener() {...<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onSurfaceTextureAvailable</span>(SurfaceTexture surface, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> width, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> height) {updatePreviewTransform(width, height, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> (mSurfaceTextureLock) {mPreviewSurfaceTexture = surface;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//打開Camera</span>reopenCamera();}<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">onSurfaceTextureDestroyed</span>(SurfaceTexture surface) {Log.d(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"onSurfaceTextureDestroyed"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> (mSurfaceTextureLock) {mPreviewSurfaceTexture = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//關閉Camera</span>closeCamera();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>;}<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onSurfaceTextureSizeChanged</span>(SurfaceTexture surface, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> width, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> height) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//更新預覽尺寸</span>updatePreviewBufferSize();}...};</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>

由代碼可知,當SurfaceTexture的狀態變成可用的時候,會調用reopenCamera()方法來打開Camera,所以繼續分析reopenCamera()方法:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//CaptureModule.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">reopenCamera</span>() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (mPaused) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;}AsyncTask.THREAD_POOL_EXECUTOR.execute(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Runnable() {<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>() {closeCamera();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(!mAppController.isPaused()) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//開啟Camera并開始預覽</span>openCameraAndStartPreview();}}}); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

它采用異步任務的方法,開啟一個異步線程來進行啟動操作,首先關閉打開的Camera,然后如果AppController不處于暫停狀態,則打開Camera并啟動Preview操作,所以繼續分析openCameraAndStartPreview方法:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//CaptureModule.java private void openCameraAndStartPreview() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (mOneCameraOpener == null) {Log.e(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"no available OneCameraManager, showing error dialog"</span>);//釋放CameraOpenCloseLock鎖mCameraOpenCloseLock.release();mAppController.getFatalErrorHandler().onGenericCameraAccessFailure();guard.stop(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"No OneCameraManager"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;}// Derive objects necessary <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> camera creation.MainThread mainThread = MainThread.create();//查找需要打開的CameraIdCameraId cameraId = mOneCameraManager.findFirstCameraFacing(mCameraFacing);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//打開CameramOneCameraOpener.open(cameraId, captureSetting, mCameraHandler,mainThread, imageRotationCalculator, mBurstController, mSoundPlayer,new OpenCallback() {@Overridepublic void onFailure() {//進行失敗的處理<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>}@Overridepublic void onCameraClosed() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>}@Overridepublic void onCameraOpened(@Nonnull final OneCamera camera) {Log.d(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"onCameraOpened: "</span> + camera);mCamera = camera;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (mAppController.isPaused()) {onFailure();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>mMainThread.execute(new Runnable() {@Overridepublic void run() {//通知UI,Camera狀態變化mAppController.getCameraAppUI().onChangeCamera();//使能拍照按鈕mAppController.getButtonManager().enableCameraButton();}});//至此,Camera打開成功,開始預覽 camera.startPreview(new Surface(getPreviewSurfaceTexture()), new CaptureReadyCallback() {@Overridepublic void onSetupFailed() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>}@Overridepublic void onReadyForCapture() {//釋放鎖mCameraOpenCloseLock.release();mMainThread.execute(new Runnable() {@Overridepublic void run() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>onPreviewStarted();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>onReadyStateChanged(true);//設置CaptureModule為Capture準備的狀態監聽mCamera.setReadyStateChangedListener(CaptureModule.this);mUI.initializeZoom(mCamera.getMaxZoom()); mCamera.setFocusStateListener(CaptureModule.this);}});}});} }, mAppController.getFatalErrorHandler());guard.stop(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"mOneCameraOpener.open()"</span>);} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li></ul>

首先,它主要會調用Camera2OneCameraOpenerImpl的open方法來打開Camera,并定義了開啟的回調函數,對開啟結束后的結果進行處理,如失敗則釋放mCameraOpenCloseLock,并暫停mAppController,如果打開成功,通知UI成功,并開啟Camera的Preview,并且定義了Preview的各種回調操作,這里主要分析Open過程,所以繼續分析:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//Camera2OneCameraOpenerImpl.java @Override public void open(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>mActiveCameraDeviceTracker.onCameraOpening(cameraKey);//打開Camera,此處調用框架層的CameraManager類的openCamera,進入frameworks層mCameraManager.openCamera(cameraKey.getValue(), new CameraDevice.StateCallback() {private boolean isFirstCallback = true;@Override<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>@Overridepublic void onOpened(CameraDevice device) {//第一次調用此回調<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (isFirstCallback) {isFirstCallback = false;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(device.getId());<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//創建OneCamera對象OneCamera oneCamera = OneCameraCreator.create(device,characteristics, mFeatureConfig, captureSetting,mDisplayMetrics, mContext, mainThread,imageRotationCalculator, burstController, soundPlayer,fatalErrorHandler);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (oneCamera != null) {//如果oneCamera不為空,則回調onCameraOpened,后面將做分析openCallback.onCameraOpened(oneCamera);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>openCallback.onFailure();}} catch (CameraAccessException e) {openCallback.onFailure();} catch (OneCameraAccessException e) {Log.d(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Could not create OneCamera"</span>, e);openCallback.onFailure();}}}}, handler);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li></ul>

至此,Camera的初始化流程中應用層的分析就差不多了,下一步將會調用CameraManager的openCamera方法來進入框架層,并進行Camera的初始化,下面將應用層的初始化時序圖:?


2、Camera2初始化的框架層流程分析

由上面的分析可知,將由應用層進入到框架層處理,將會調用CameraManager的openCamera方法,并且定義了CameraDevice的狀態回調函數,具體的回調操作此處不做分析,繼續跟蹤openCamera()方法:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//CameraManager.java(frameworks/base/core/java/android/hardware/camera2) @RequiresPermission(android.Manifest.permission.CAMERA) public void openCamera(@NonNull String cameraId,@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)throws CameraAccessException {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>openCameraDeviceUserAsync(cameraId, callback, handler); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

由代碼可知,此處與Camera1.0有明顯不同,Camera1.0是通過一個異步的線程以及JNI來調用android_hardware_camera.java里面的native_setup方法來連接Camera,其使用的是C++的Binder來與CameraService進行通信的,而此處則不一樣,它直接使用的是Java層的Binder來進行通信,先看openCameraDeviceUserAsync代碼:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//CameraManager.java(frameworks/base/core/java/android/hardware/camera2) private CameraDevice openCameraDeviceUserAsync(String cameraId,CameraDevice.StateCallback callback, Handler handler)throws CameraAccessException {CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);CameraDevice device = null;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {synchronized (mLock) {ICameraDeviceUser cameraUser = null;//初始化一個CameraDevice對象android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =new android.hardware.camera2.impl.CameraDeviceImpl(cameraId,callback, handler, characteristics);BinderHolder holder = new BinderHolder();//獲取回調ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();int id = Integer.parseInt(cameraId);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (supportsCamera2ApiLocked(cameraId)) {//通過Java層的Binder獲取CameraService ICameraService cameraService = CameraManagerGlobal.get().getCameraService();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//通過CameraService連接Camera設備cameraService.connectDevice(callbacks, id, mContext.getOpPackageName(), USE_CALLING_UID, holder);//獲取連接成功的CameraUser對象,它用來與CameraService通信cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder());} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {//使用遺留的APIcameraUser = CameraDeviceUserShim.connectBinderShim(callbacks, id);}} catch (CameraRuntimeException e) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>} catch (RemoteException e) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//將其包裝成DeviceImpl對象,供應用層使用deviceImpl.setRemoteDevice(cameraUser);device = deviceImpl;}} catch (NumberFormatException e) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>} catch (CameraRuntimeException e) {throw e.asChecked();}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> device; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li></ul>

此方法的目的是通過CameraService來連接并獲取CameraDevice對象,該對象用來與Camera進行通信操作。代碼首先通過Java層的Binder機制獲取CameraService,然后調用其connectDevice方法來連接CaneraDevice,最后Camera返回的是CameraDeviceUser對象,而接著將其封裝成Jav層CameraDevice對象,而之后所有與Camera的通信都通過CameraDevice的接口來進行。接下來分析一下Native層下的CameraDevice的初始化過程:

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//CameraService.cpp,其中device為輸出對象</span> status_t CameraService::connectDevice(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> sp<ICameraDeviceCallbacks>& cameraCb,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> cameraId,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> String16& clientPackageName,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clientUid,<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*out*/</span>sp<ICameraDeviceUser>& device) {status_t ret = NO_ERROR;String8 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span> = String8::format(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d"</span>, cameraId);sp<CameraDeviceClient> client = nullptr;ret = connectHelper<ICameraDeviceCallbacks,CameraDeviceClient>(cameraCb, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span>,CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName, clientUid, API_2, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>,<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*out*/</span>client);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//client為輸出對象</span>...device = client;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> NO_ERROR; } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>

Native層的connectDevice方法就是調用了connectHelper方法,所以繼續分析connectHelper:

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//CameraService.h</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">template</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> CALLBACK, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> CLIENT> status_t CameraService::connectHelper(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> sp<CALLBACK>& cameraCb, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> String8& cameraId,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> halVersion, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> String16& clientPackageName, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clientUid,apiLevel effectiveApiLevel, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> legacyMode, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> shimUpdateOnly,<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*out*/</span>sp<CLIENT>& device) {status_t ret = NO_ERROR;String8 clientName8(clientPackageName);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clientPid = getCallingPid();...sp<CLIENT> client = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nullptr</span>;{...<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果有必要,給FlashLight關閉設備的機會</span>mFlashlight->prepareDeviceOpen(cameraId);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取CameraId</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> id = cameraIdToInt(cameraId);...<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取Device的版本,此處為Device3</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> deviceVersion = getDeviceVersion(id, <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*out*/</span>&facing);sp<BasicClient> tmp = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nullptr</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取client對象</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>((ret = makeClient(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, cameraCb, clientPackageName, cameraId, facing, clientPid,clientUid, getpid(), legacyMode, halVersion, deviceVersion, effectiveApiLevel,<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*out*/</span>&tmp)) != NO_ERROR) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> ret;}client = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><CLIENT*>(tmp.get());<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//調用client的初始化函數來初始化模塊</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ((ret = client->initialize(mModule)) != OK) {ALOGE(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%s: Could not initialize client from HAL module."</span>, __FUNCTION__);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> ret;}sp<IBinder> remoteCallback = client->getRemote();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (remoteCallback != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nullptr</span>) {remoteCallback->linkToDeath(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);}} <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// lock is destroyed, allow further connect calls</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//將client賦值給輸出Device</span>device = client;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> NO_ERROR; } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li></ul>

CameraService根據Camera的相關參數來獲取一個client,如makeClient方法,然后再調用client的initialize來進行初始化,首先看makeClient:

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//CameraService.cpp</span> status_t CameraService::makeClient(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> sp<CameraService>& cameraService,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> sp<IInterface>& cameraCb, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> String16& packageName, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> String8& cameraId,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> facing, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clientPid, uid_t clientUid, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> servicePid, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> legacyMode,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> halVersion, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> deviceVersion, apiLevel effectiveApiLevel,<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*out*/</span>sp<BasicClient>* client) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//將字符串的CameraId轉換成整形</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> id = cameraIdToInt(cameraId);...<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (halVersion < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> || halVersion == deviceVersion) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//判斷Camera HAL版本是否和Device的版本相同</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span>(deviceVersion) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_1_0:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (effectiveApiLevel == API_1) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Camera1 API route</span>sp<ICameraClient> tmp = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><ICameraClient*>(cameraCb.get());*client = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> CameraClient(cameraService, tmp, packageName, id, facing,clientPid, clientUid, getpid(), legacyMode);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Camera2 API route</span>ALOGW(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Camera using old HAL version: %d"</span>, deviceVersion);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> -EOPNOTSUPP;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_2_0:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_2_1:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_3_0:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_3_1:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_3_2:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_3_3:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (effectiveApiLevel == API_1) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Camera1 API route</span>sp<ICameraClient> tmp = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><ICameraClient*>(cameraCb.get());*client = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Camera2Client(cameraService, tmp, packageName, id, facing,clientPid, clientUid, servicePid, legacyMode);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Camera2 API route</span>sp<ICameraDeviceCallbacks> tmp =<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><ICameraDeviceCallbacks*>(cameraCb.get());*client = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> CameraDeviceClient(cameraService, tmp, packageName, id,facing, clientPid, clientUid, servicePid);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Should not be reachable</span>ALOGE(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Unknown camera device HAL version: %d"</span>, deviceVersion);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> INVALID_OPERATION;}} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// A particular HAL version is requested by caller. Create CameraClient</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// based on the requested HAL version.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (deviceVersion > CAMERA_DEVICE_API_VERSION_1_0 &&halVersion == CAMERA_DEVICE_API_VERSION_1_0) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Only support higher HAL version device opened as HAL1.0 device.</span>sp<ICameraClient> tmp = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><ICameraClient*>(cameraCb.get());*client = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> CameraClient(cameraService, tmp, packageName, id, facing,clientPid, clientUid, servicePid, legacyMode);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Other combinations (e.g. HAL3.x open as HAL2.x) are not supported yet.</span>ALOGE(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Invalid camera HAL version %x: HAL %x device can only be"</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" opened as HAL %x device"</span>, halVersion, deviceVersion,CAMERA_DEVICE_API_VERSION_1_0);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> INVALID_OPERATION;}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> NO_ERROR; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li></ul>

其中就是創建一個Client對象,由于此處分析的是Camera API2.0,其HAL的版本是3.0+,而Device的版本則其Device的版本即為3.0+,所以會創建一個CameraDeviceClient對象,至此,makeClient已經創建了client對象,并返回了,接著看它的初始化:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//CameraDeviceClient.cpp</span> status_t CameraDeviceClient<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::initialize</span>(CameraModule <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>module) {ATRACE_CALL();status_t res;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//調用Camera2ClientBase的初始化函數來初始化CameraModule模塊</span>res <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> Camera2ClientBase<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::initialize</span>(module);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (res <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!=</span> OK) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> res;}String8 threadName;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化FrameProcessor</span>mFrameProcessor <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> FrameProcessorBase(mDevice);threadName <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> String8<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::format</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CDU-%d-FrameProc"</span>, mCameraId);mFrameProcessor<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>run(threadName<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>());<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//并注冊監聽,監聽的實現就在CameraDeviceClient類中</span>mFrameProcessor<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>registerListener(FRAME_PROCESSOR_LISTENER_MIN_ID,FRAME_PROCESSOR_LISTENER_MAX_ID, <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*listener*/</span>this,<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*sendPartials*/</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> OK; } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul>

它會調用Camera2ClientBase的initialize方法來初始化,并且會初始化一個FrameProcessor來進行幀處理,主要是回調每一幀的ExtraResult到應用中,也就是3A相關的數據信息。而Camera1.0中各種Processor模塊,即將數據打包處理后再返回到應用的模塊都已經不存在,而Camera2.0中將由MediaRecorder、SurfaceView、ImageReader等來直接處理,總體來說效率更好。繼續看initialize:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">// Camera2ClientBase.cpp template <typename TClientBase> status_t Camera2ClientBase<TClientBase>::initialize(CameraModule *module) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//調用Device的initialie方法res = mDevice->initialize(module);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>res = mDevice->setNotifyCallback(this);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> OK; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

代碼就是調用了Device的initialize方法,此處的Device是在Camera2ClientBase的構造函數中創建的:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">// Camera2ClientBase.cpp template <typename TClientBase> Camera2ClientBase<TClientBase>::Camera2ClientBase(const sp<CameraService>& cameraService,const sp<TCamCallbacks>& remoteCallback,const String16& clientPackageName,int cameraId,int cameraFacing,int clientPid,uid_t clientUid,int servicePid):TClientBase(cameraService, remoteCallback, clientPackageName,cameraId, cameraFacing, clientPid, clientUid, servicePid),mSharedCameraCallbacks(remoteCallback),mDeviceVersion(cameraService->getDeviceVersion(cameraId)) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>mInitialClientPid = clientPid;mDevice = CameraDeviceFactory::createDevice(cameraId);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

目前Camera API是2.0,而Device的API已經是3.0+了,繼續看CameraDeviceFactory的createDevice方法:

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// CameraDeviceFactory.cpp</span> sp<CameraDeviceBase> CameraDeviceFactory::createDevice(int cameraId) {sp<CameraService> svc = sService.promote();...int deviceVersion = svc->getDeviceVersion(cameraId, <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*facing*/</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>);sp<CameraDeviceBase> device;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> (deviceVersion) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_2_0:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_2_1:device = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Camera2Device(cameraId);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_3_0:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_3_1:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_3_2:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> CAMERA_DEVICE_API_VERSION_3_3:device = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Camera3Device(cameraId);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>:ALOGE(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%s: Camera %d: Unknown HAL device version %d"</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">__FUNCTION__</span>, cameraId, deviceVersion);device = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> device; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li></ul>

很顯然,它將會創建一個Camera3Device對象,所以,Device的initialize就是調用了Camera3Device的initialize方法:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">// Camera3Device.cpp status_t Camera3Device::initialize(CameraModule *module) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>camera3_device_t *device;//打開Camera HAL層的Deivceres = module->open(deviceName.string(),reinterpret_cast<hw_device_t**>(&device));<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//交叉檢查Device的版本<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (device->common.version < CAMERA_DEVICE_API_VERSION_3_0) {SET_ERR_L(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Could not open camera: "</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Camera device should be at least %x, reports %x instead"</span>,CAMERA_DEVICE_API_VERSION_3_0,device->common.version);device->common.close(&device->common);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> BAD_VALUE;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//調用回調函數來進行初始化,即調用打開Device的initialize方法來進行初始化res = device->ops->initialize(device, this);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//啟動請求隊列線程mRequestThread = new RequestThread(this, mStatusTracker, device, aeLockAvailable);res = mRequestThread->run(String8::format(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"C3Dev-%d-ReqQueue"</span>, mId).string());<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (res != OK) {SET_ERR_L(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Unable to start request queue thread: %s (%d)"</span>,strerror(-res), res);device->common.close(&device->common);mRequestThread.clear();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> res;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//返回初始成功<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> OK; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li></ul>

首先,會依賴HAL框架打開并獲得相應的Device對象,具體的流程請參考android6.0源碼分析之Camera2 HAL分析,然后再回調此對象的initialize方法進行初始化,最后再啟動RequestThread等線程,并返回initialize成功。至此Camera API2.0下的初始化過程就分析結束了??蚣軐拥某跏蓟瘯r序圖如下:?

原文地址:http://blog.csdn.net/yangzhihuiguming/article/details/51800227

總結

以上是生活随笔為你收集整理的android6.0源码分析之Camera API2.0下的初始化流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

av免费观看网址 | 国产在线久草 | 视频国产在线观看18 | 午夜色大片在线观看 | 亚洲国产精久久久久久久 | 亚洲视频在线看 | 正在播放国产精品 | 国内精品亚洲 | 国产精品久久9 | 日韩成人免费观看 | 午夜国产影院 | www操操 | av高清在线 | 婷婷丁香在线视频 | 亚洲成a人片综合在线 | 五月婷婷丁香色 | 国产精品va在线观看入 | 缴情综合网五月天 | 亚洲综合精品在线 | 成人性生交大片免费看中文网站 | 五月天综合 | 久久综合久久综合这里只有精品 | 中文字幕日韩电影 | 精品在线观看一区二区三区 | 91最新网址在线观看 | 色狠狠狠| 婷婷丁香国产 | 国产亚洲精品中文字幕 | 麻豆91精品视频 | 成人一区影院 | 精品国产免费人成在线观看 | 欧美大片mv免费 | 中文字幕精品在线 | 99热手机在线观看 | 中文字幕4| 免费观看性生交大片3 | 日韩大陆欧美高清视频区 | 欧美激情精品久久久久久免费印度 | 国产中文字幕视频在线观看 | 日韩成人xxxx| 国产 日韩 在线 亚洲 字幕 中文 | 美女视频黄在线 | 青草视频在线 | 成人免费视频视频在线观看 免费 | 偷拍精偷拍精品欧洲亚洲网站 | 九九热中文字幕 | 国产色在线观看 | 亚洲japanese制服美女 | 久久精品五月 | 日韩欧美网站 | 狠狠躁夜夜躁人人爽超碰91 | 色婷婷狠狠五月综合天色拍 | 国产精品久久中文字幕 | 超碰免费在线公开 | 狠狠色丁香婷婷综合 | 亚洲视频免费视频 | 日韩精品一区二 | 91高清不卡 | 女人18毛片a级毛片一区二区 | 欧美精品乱码久久久久久按摩 | 国产成人精品久久久 | 97视频资源 | 天天搞天天干天天色 | 成人av在线看 | 欧美狠狠操| 国产高清专区 | 9999精品免费视频 | 成人91在线 | 少妇精品久久久一区二区免费 | 一区二区电影在线观看 | 麻花传媒mv免费观看 | 久久久www成人免费精品张筱雨 | 天天搞天天干天天色 | 特级大胆西西4444www | 99热这里只有精品在线观看 | 美女视频黄是免费的 | 在线免费视 | 久久大香线蕉app | av网站大全免费 | 欧美性春潮 | 国产午夜激情视频 | 日本在线观看中文字幕无线观看 | 亚洲理论在线观看电影 | 久影院| 久久久午夜电影 | 国内精品久久久久久久久久久 | 成人av中文字幕在线观看 | 国产色女 | 国产成人精品一区二区三区网站观看 | 综合av在线 | 丝袜av网站| 丝袜av一区 | 国产精品男女啪啪 | 黄色一级动作片 | 97视频免费在线看 | 999久久久免费视频 午夜国产在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 成人久久国产 | 黄av免费| a电影在线观看 | 99精品影视 | 91丨九色丨国产丨porny精品 | 91porny九色91啦中文 | 久久精品中文字幕 | 五月天综合网 | 人人草在线视频 | 日本在线观看黄色 | 久久免费国产电影 | 免费在线观看污网站 | 五月综合激情网 | 免费高清av在线看 | 色多多污污在线观看 | 亚洲蜜桃在线 | 精品国产乱码久久久久久1区2匹 | 又大又硬又黄又爽视频在线观看 | 97超级碰碰碰碰久久久久 | 超碰人人在线 | 日韩在线一二三区 | 国产综合精品久久 | 开心色激情网 | 中文字幕中文字幕 | 欧美精品一区二区在线播放 | 日韩av一区二区三区四区 | 人人舔人人干 | av片子在线观看 | 中文字幕在线播放av | 国产精品99在线观看 | 国产视频99 | 黄色在线观看污 | 日韩超碰在线 | 狠狠色丁香婷婷综合久久片 | 黄色免费国产 | 国产a级免费 | 欧美韩国日本在线观看 | 超碰av免费| 欧美在线久久 | 少妇bbbb | 色爱区综合激月婷婷 | 9在线观看免费 | 人人射人人射 | 久久午夜色播影院免费高清 | 天天天天爽 | 在线看v片成人 | 在线观看 国产 | 成人在线观看av | 六月婷操 | 午夜影视一区 | 亚洲精品国产自产拍在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 欧美xxxx性xxxxx高清 | 久久怡红院 | 激情久久小说 | 欧美精品乱码久久久久久 | 97电影在线看视频 | av在线之家电影网站 | 天天干天天摸天天操 | a久久免费视频 | 久草精品视频 | 黄色午夜网站 | 2018亚洲男人天堂 | 精品中文字幕在线播放 | 91看片在线播放 | 国内精品亚洲 | 成人宗合网 | 丁香网婷婷| 黄色资源在线观看 | www.色国产| 日韩爱爱片 | 中文字幕一二 | 国产精品视频全国免费观看 | 亚洲人xxx| 日韩精品一区二区三区电影 | 日韩网站在线免费观看 | 九九精品久久久 | 日韩色综合网 | 精品国产一区二区三区男人吃奶 | 久久99久久99精品免视看婷婷 | 成人精品福利 | 人人干网| 国产精品18久久久久久不卡孕妇 | 色av男人的天堂免费在线 | 天天曰天天射 | 天天做日日做天天爽视频免费 | 亚洲综合日韩在线 | 手机av永久免费 | 日韩大片在线播放 | 91视频-88av | 一区二区视频在线免费观看 | 91大神一区二区三区 | 日日操操操| 久久精品视频在线看 | 99精品国产在热久久下载 | 久久久久久久综合色一本 | 国产无套一区二区三区久久 | 黄色三级免费网址 | 国产在线1区 | 久久av电影 | 在线日本看片免费人成视久网 | 黄网站色视频免费观看 | 日韩精品在线免费播放 | 999抗病毒口服液 | 懂色av一区二区在线播放 | 天天综合久久综合 | www欧美xxxx | 欧美国产不卡 | 国产97在线播放 | 成人app在线播放 | adn—256中文在线观看 | 国产精品免费在线播放 | 欧美一区二区三区不卡 | 国产精品久久久久久五月尺 | 日日日日干 | 精品一区二区在线观看 | 亚洲精品18日本一区app | 国产精品黑丝在线观看 | 精品999在线观看 | 91久久久久久久一区二区 | 精品一区av| 一区二区中文字幕在线播放 | 亚洲一区欧美精品 | 国产免费一区二区三区网站免费 | 亚洲做受高潮欧美裸体 | 在线观看视频一区二区三区 | 韩日成人av | 国产精品va在线播放 | 国产精品国产三级国产不产一地 | 国产不卡av在线 | 日本激情视频中文字幕 | 久久99精品久久久久久清纯直播 | 香蕉视频导航 | 丁香五月网久久综合 | 精品在线亚洲视频 | 99精品国产高清在线观看 | 亚洲精品国产精品国自产观看浪潮 | 91九色视频观看 | 亚洲国产精品一区二区尤物区 | 国产精品短视频 | 超碰97在线资源 | 久热av| 国内精品久久久久 | 亚洲欧洲一区二区在线观看 | 久久污视频 | 91香蕉视频在线下载 | 亚洲精品网站 | 久一在线| 激情综合婷婷 | 免费看黄网站在线 | 99草视频| 国产一卡二卡四卡国 | 午夜精品一区二区三区在线 | 久久视频二区 | 在线视频 成人 | 国产精品99久久久久 | 九九热视频在线 | 亚洲区色 | 亚洲做受高潮欧美裸体 | 大胆欧美gogo免费视频一二区 | 麻豆国产精品一区二区三区 | 亚洲电影黄色 | 亚洲精品久久在线 | 欧美在线观看视频一区二区 | 福利片视频区 | 中文字幕91 | 在线观看资源 | 可以免费看av | 久福利| 日韩字幕| 91精品亚洲影视在线观看 | 午夜精品中文字幕 | 香蕉精品在线观看 | 国产高清av在线播放 | 日本少妇高清做爰视频 | 成人黄色电影在线 | 97精品久久 | 免费国产在线观看 | 亚洲国产播放 | 天天射天天艹 | 日操操 | 成人精品久久久 | 天天干,天天射,天天操,天天摸 | 日韩电影中文 | 免费在线成人av电影 | 亚洲国产精品资源 | 中文字幕乱码在线播放 | 人人爽人人 | 色综合久久久久 | 久久久久免费网站 | 视频一区二区三区视频 | 亚洲少妇久久 | 国产欧美日韩一区 | 91亚洲精品国产 | 久久国产精品一二三区 | 丁香高清视频在线看看 | 成人丝袜| 久久亚洲综合国产精品99麻豆的功能介绍 | 国产高清不卡一区二区三区 | 黄p网站在线观看 | 在线观看你懂的网址 | 国产99一区视频免费 | 最新日本中文字幕 | 久久黄色影院 | 久久视频国产精品免费视频在线 | 久久激情日本aⅴ | 国产精品男女视频 | 激情 一区二区 | 亚洲成人av在线 | 久久综合之合合综合久久 | 日韩va在线观看 | 天天射网站 | 午夜视频在线观看一区 | 中文字幕乱码视频 | av丝袜在线 | 成人av一二三区 | 在线视频 亚洲 | 深夜免费小视频 | 三上悠亚一区二区在线观看 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 97精品国产一二三产区 | 免费黄在线看 | av中文字幕亚洲 | 国产黑丝一区二区 | 99久久精品国产免费看不卡 | 在线视频免费观看 | 999精品在线 | 欧美伦理一区二区 | 成人免费视频网站 | av九九九 | 久久激情电影 | 激情五月综合 | 日韩一区二区三区免费视频 | 米奇狠狠狠888 | 国产黄色在线 | 精品欧美乱码久久久久久 | 中文字幕第 | 精品久久91 | 成人影片在线播放 | 精品a级片| 国产二区精品 | 99久久精品视频免费 | 国产亚洲综合精品 | 久久69av | 一区二区三区动漫 | 天天色综合天天 | 黄色app网站在线观看 | 中文字幕在线观看一区二区 | 午夜国产影院 | 精品一二三四在线 | 色视频网址 | 7777精品伊人久久久大香线蕉 | 国产精品综合久久久 | 中文字幕永久 | 欧美日韩国内在线 | 亚洲精品美女久久久久网站 | 亚洲一区欧美激情 | 天天干,天天射,天天操,天天摸 | 久久国产精品免费一区 | 在线观看免费国产小视频 | 亚洲欧洲一区二区在线观看 | 香蕉视频在线观看免费 | 亚洲色图激情文学 | 日日射av| 特级西西444www大胆高清无视频 | 国产精品美女www爽爽爽视频 | 亚洲1区在线 | 美女久久一区 | 人人舔人人爽 | 欧美天天射 | 日韩精品免费一线在线观看 | 亚洲精品中文在线观看 | 91.麻豆视频 | 婷婷激情5月天 | 亚洲黄色激情小说 | 久久久精品成人 | 日韩欧美在线国产 | 久热色超碰 | 911精品美国片911久久久 | 亚洲成人资源 | 国产精品一区二区62 | 一区二区 久久 | 色姑娘综合网 | 精品影院 | 亚洲成人资源在线 | 一色av | 欧美日韩亚洲第一页 | 色综合天天综合在线视频 | 成人毛片一区 | 黄色一级网 | 黄色av电影一级片 | 新版资源中文在线观看 | 国产成人福利在线观看 | 夜夜干夜夜 | 国产又黄又猛又粗 | 欧美日韩三区二区 | 97在线免费视频观看 | 九九热免费观看 | 天天操天天操天天 | 日韩欧美在线不卡 | 免费在线观看成人小视频 | 男女啪啪免费网站 | 一区二区久久久久 | 日韩av电影手机在线观看 | 国产精品视频 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 超碰国产人人 | 精品国产一区二区三区久久影院 | 亚洲国产精品500在线观看 | 在线小视频国产 | 国产精品视频你懂的 | 亚洲综合色丁香婷婷六月图片 | 亚洲日本国产精品 | 日韩高清黄色 | 欧美日本不卡 | 日日摸日日添夜夜爽97 | 国产亚洲精品电影 | 亚洲成a人片综合在线 | 成人av影院在线观看 | 天天艹 | 91视频麻豆| 亚洲日韩中文字幕在线播放 | 日韩乱码在线 | 69国产成人综合久久精品欧美 | 亚洲精品一区二区精华 | 五月婷婷激情 | 99久高清在线观看视频99精品热在线观看视频 | 久久免费看av | 国产精品精品国产婷婷这里av | 免费看91的网站 | 欧美在线一二区 | 在线一二区 | 中文字幕视频一区 | 久久成人国产精品一区二区 | 日韩专区一区二区 | 男女激情麻豆 | 国产在线观看中文字幕 | 日韩v在线91成人自拍 | 在线看国产精品 | av中文在线观看 | 婷婷综合激情 | 久久视频国产精品免费视频在线 | 爱av在线网 | 国产黄色在线看 | 粉嫩av一区二区三区四区在线观看 | 亚洲欧洲精品一区 | 国产亚洲在线观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美成a人片在线观看久 | 久草电影免费在线观看 | 一区二区三区四区五区在线视频 | 日韩精品免费一区二区三区 | 99视频精品全部免费 在线 | 色综合久久久久综合 | 在线观看的a站 | 九九热在线观看视频 | 黄色大片免费播放 | 日韩在线观看网站 | 久久久久久久国产精品 | 麻豆视频国产精品 | 日韩精选在线观看 | 狠狠干夜夜操天天爽 | 成人av电影在线播放 | 天天综合91| 夜色成人网 | 成人精品视频 | 精品国产三级 | 欧美日韩另类在线观看 | 一区二区三区电影大全 | 国产一级久久久 | 亚洲四虎在线 | 狠狠狠色丁香综合久久天下网 | 久草在线一免费新视频 | 911国产 | 久久精品99久久久久久 | 久久综合久久综合久久 | 色婷婷伊人 | 久热精品国产 | 日本成人中文字幕在线观看 | 毛片网站在线观看 | 九九九在线 | 精品国内自产拍在线观看视频 | 五月婷婷综合在线观看 | 国产区av在线 | 在线直播av | 在线va视频| 国产做a爱一级久久 | 人人要人人澡人人爽人人dvd | 亚洲视频精品在线 | 2023年中文无字幕文字 | 久久99精品久久只有精品 | 亚洲免费国产视频 | 成年人在线观看视频免费 | 韩国视频一区二区三区 | 一本—道久久a久久精品蜜桃 | 又黄又爽又无遮挡免费的网站 | 午夜在线资源 | 九九热在线观看视频 | 国产精品久久久久久久午夜 | 国产麻豆剧果冻传媒视频播放量 | 日韩在线观看视频在线 | 在线视频 一区二区 | 天天干夜夜夜操天 | 成人av手机在线 | 国产91综合一区在线观看 | 在线观看精品黄av片免费 | 波多野结衣小视频 | 久久国产福利 | 色婷在线 | 免费av片在线 | 国产精品国产三级国产aⅴ入口 | 日韩一二三 | sesese图片 | 亚洲日日夜夜 | 久久一区二区三区国产精品 | 国产精品大片在线观看 | 综合激情网| 免费在线一区二区三区 | 久久久www成人免费毛片麻豆 | 久久天天躁狠狠躁亚洲综合公司 | 日韩精品欧美一区 | 国产剧情av在线播放 | 999久久久免费精品国产 | 91久久丝袜国产露脸动漫 | 9在线观看免费高清完整 | 91女神的呻吟细腰翘臀美女 | 国精产品999国精产 久久久久 | 国产精品二区三区 | 99久久精品视频免费 | 天天插天天操天天干 | av在线日韩 | 波多野结衣视频一区 | 亚洲国产午夜精品 | 天天色成人网 | 国产一级片免费播放 | 六月丁香婷婷网 | 中文字幕91视频 | www.天天草| 黄色小说视频网站 | 日韩激情免费视频 | 欧美人交a欧美精品 | 日韩高清精品一区二区 | 亚洲一级片免费观看 | 国产自在线 | 中文字幕第一 | 日韩av一区二区在线 | 偷拍精品一区二区三区 | 久久婷婷久久 | 亚洲涩涩涩 | 亚洲精品成人av在线 | 色综合久久五月 | 亚洲日本va中文字幕 | 玖玖精品在线 | 最近2019中文免费高清视频观看www99 | 久久99国产精品久久99 | 国产1级视频 | 娇妻呻吟一区二区三区 | 手机看片1042 | 久久久久久久毛片 | 综合激情网 | 中文区中文字幕免费看 | 成人av网站在线观看 | 亚洲91av| 香蕉免费| 在线色网站 | 在线观看精品视频 | 日韩在线高清免费视频 | 成人在线免费观看网站 | 人人天天夜夜 | 一级做a爱片性色毛片www | 欧美日韩精品在线 | 国产精品久久久久久吹潮天美传媒 | 97超碰资源| 99热在线国产精品 | 在线香蕉视频 | 国内精品在线一区 | av网站有哪些 | 手机色在线 | 国产视频美女 | 日韩一区二区三区不卡 | 久久免费视频在线观看 | 在线不卡视频 | 久久久久久网址 | 精品免费国产一区二区三区四区 | 亚洲午夜精品福利 | 九九影视理伦片 | 美女在线免费视频 | 狠狠狠色丁香婷婷综合久久88 | 国产精品美女久久久 | 久久精品国产第一区二区三区 | 亚洲乱码久久久 | 国产你懂的在线 | 最近中文字幕在线播放 | 日本资源中文字幕在线 | 免费看国产黄色 | 在线国产一区二区三区 | 国产高清视频在线 | 天天撸夜夜操 | 999久久久久久| 粉嫩av一区二区三区四区 | 日产乱码一二三区别免费 | 久av电影 | 超碰在线97观看 | 亚洲国产视频a | 十八岁免进欧美 | 九九99靖品 | 一本一道久久a久久精品 | 日韩在线视频看看 | 免费十分钟 | 婷婷激情综合五月天 | 日本中文在线观看 | 天堂麻豆 | 亚洲精品乱码久久久久v最新版 | 九九九热精品免费视频观看 | 狠狠色狠狠色综合系列 | 久久观看 | 亚洲欧美精品一区 | 久久久国产99久久国产一 | 久久婷婷一区二区三区 | 黄网在线免费观看 | 日韩电影久久 | 91在线视频播放 | 91色吧 | 一区在线观看 | 欧美成人一二区 | 久操中文字幕在线观看 | 三级黄色在线 | 久久天天操| 99re在线视频观看 | 天天操天天干天天 | 黄毛片在线观看 | 欧美日产在线观看 | 国产精品久久久久毛片大屁完整版 | 九九在线精品视频 | 亚洲电影久久 | 免费av的网站 | 婷婷色在线观看 | 成人在线观看网址 | 婷婷久久五月天 | 欧美一区二区三区在线看 | 欧美日韩另类在线 | 午夜影视av | 久久久久久久久久久免费视频 | 日韩网站中文字幕 | 日本高清dvd | 午夜久久视频 | 国产精品久久久久久久久久久久午 | 日韩欧美一区二区三区在线 | 人人干免费 | 精品国产中文字幕 | 黄a在线| 国际精品久久久 | 成人91在线 | 亚洲国内精品在线 | 91精品国产电影 | 伊人色综合久久天天 | 国产精品va在线观看入 | 国产资源免费 | 久久久久久福利 | 国产高清精品在线观看 | 亚洲电影在线看 | 日韩电影在线视频 | 免费在线黄网 | 国产伦精品一区二区三区四区视频 | 免费在线观看一区 | 天天天操操操 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 免费av网站在线 | 色婷婷综合五月 | 黄色综合| 丁香六月婷婷激情 | 亚洲精品乱码久久久久久蜜桃91 | 91传媒视频在线观看 | 国产国语在线 | 亚洲国产精品一区二区久久hs | 麻豆高清免费国产一区 | 中文国产成人精品久久一 | 国产成人高清 | 久久天堂亚洲 | 国产在线观看中文字幕 | 国产一区影院 | 国产精品久久久久久久免费 | 五月婷婷综合激情 | 色综合久久88色综合天天人守婷 | 成人午夜电影在线 | 一级黄色大片在线观看 | 最新中文字幕在线资源 | 99久久精品久久久久久清纯 | 天天天天爱天天躁 | 久久不射电影网 | 国产精品免费不 | 久久婷婷精品 | 日韩在线播放欧美字幕 | 亚色视频在线观看 | 天天草网站| 国产高清网站 | 国语自产偷拍精品视频偷 | 成人h视频在线播放 | 欧美日韩一区二区在线观看 | 亚洲一区二区三区精品在线观看 | 中文字幕成人在线 | 久久久久久久久久久久久久av | 天天操网站 | 亚洲精品福利在线观看 | 天天天天天天干 | 欧美日韩在线视频一区二区 | 91久久丝袜国产露脸动漫 | 国产99久久久国产精品免费看 | 狠狠狠狠狠操 | 四虎免费av | 婷婷综合五月天 | 粉嫩av一区二区三区免费 | 在线免费中文字幕 | 欧美小视频在线观看 | 亚洲激情小视频 | 欧美激情视频一区二区三区免费 | 色综合久久中文综合久久牛 | 国产69精品久久99不卡的观看体验 | 探花视频在线观看免费版 | 精品欧美乱码久久久久久 | 四虎成人免费观看 | 伊色综合久久之综合久久 | 日本色小说视频 | 亚洲精品国产日韩 | 麻豆传媒在线免费看 | 精品久久一 | 日韩免费网址 | 超碰97中文 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 国产精品入口66mio女同 | 欧美久久久影院 | 在线观看视频国产 | www激情网| 国产剧情久久 | 亚洲欧美在线视频免费 | 国产色综合 | 国产日产在线观看 | 91麻豆精品国产自产在线游戏 | 天堂av在线免费观看 | 国产成人av网址 | 永久av免费在线观看 | 国产一区网 | 日本久久久久久久久久久 | 亚洲精品小视频 | 韩国av一区二区三区在线观看 | 美州a亚洲一视本频v色道 | 91精品国产欧美一区二区成人 | 夜夜操网站 | 欧美视频国产视频 | 午夜.dj高清免费观看视频 | 日本久久成人中文字幕电影 | 国产午夜精品一区二区三区四区 | 天天干天天做 | 亚洲国产中文字幕在线观看 | 91免费在线看片 | 天天艹天天 | 最近2019好看的中文字幕免费 | 日韩中文字幕a | 国产欧美综合在线观看 | www.狠狠干| 久黄色 | 在线亚州 | 欧美在线视频免费 | 精品美女在线视频 | 高潮毛片无遮挡高清免费 | 国产精品1区2区在线观看 | 96亚洲精品久久 | 久久人人爽视频 | 911国产精品 | 国产成人福利在线观看 | 夜夜操网站 | 国产真实在线 | 九九视频在线 | 中文字幕在线播出 | 狠狠干激情 | 欧美在线视频日韩 | 丁香六月久久综合狠狠色 | 国产视频不卡一区 | 黄色精品在线看 | 日韩久久精品一区二区 | 手机在线欧美 | 国产精品一区二区果冻传媒 | x99av成人免费 | 干 操 插| 国产精品ⅴa有声小说 | 亚洲精品日韩在线观看 | 国产在线综合视频 | 国产精品久久电影网 | 久久亚洲人 | 日韩av午夜 | 欧美日韩高清 | 久久精品xxx| 精品91久久久久 | 九九视频在线 | 久久久69| 日韩精品不卡 | 亚洲成人黄色网址 | 黄色免费网站大全 | 欧洲精品亚洲精品 | 成人黄色短片 | 欧美精品一区在线 | 国产福利在线不卡 | 蜜臀av在线一区二区三区 | 永久中文字幕 | 伊人射| 中文字幕在线观看一区二区三区 | 狠狠干在线 | 一区二区三区四区免费视频 | 国产精品第54页 | 亚洲精品视频在线看 | 中文字幕免费播放 | 久久久久久综合 | 国产91探花 | 国产精品一区二区av日韩在线 | 99久久久国产精品 | 天天干天天做 | 91激情视频在线观看 | 嫩草91影院 | 欧美日韩视频免费看 | 亚洲成人av片 | 久久情爱 | 欧美精品亚洲精品日韩精品 | 国产精选在线 | 久草成人在线 | 激情综合久久 | 69av国产| 午夜美女视频 | 最近2019年日本中文免费字幕 | 99在线热播精品免费 | 色综合天天综合网国产成人网 | 高清免费在线视频 | 天天操操操操操 | 久久国产精品99国产精 | 国产免费精彩视频 | 人成在线免费视频 | 国产精品视频免费 | 亚洲国产激情 | 91传媒免费在线观看 | 91在线蜜桃臀 | 免费在线观看国产精品 | 久久五月婷婷丁香社区 | 亚洲精品在线一区二区三区 | 欧美老女人xx | 久久免费的视频 | 天天摸夜夜添 | 日本在线观看一区 | 国产91在线免费视频 | 99热最新精品 | 久久久久免费观看 | 亚洲综合丁香 | 国内久久精品视频 | 国精产品999国精产品岳 | 九九视频精品免费 | 国产超碰在线 | 亚洲狠狠操 | 免费日韩一区二区 | www一起操 | 国产成人亚洲在线观看 | 久久久久国产精品免费免费搜索 | 婷婷色六月天 | 97超级碰碰碰碰久久久久 | 91最新中文字幕 | av一区在线| 午夜色站 | 国产永久免费高清在线观看视频 | 色综合久久88色综合天天人守婷 | 99re久久精品国产 | ,久久福利影视 | 日韩中文字幕在线观看 | 在线看av的网址 | 夜夜躁狠狠燥 | 国产伦精品一区二区三区免费 | 久久精品中文字幕一区二区三区 | av在线影视 | 天天干天天色2020 | 99精品视频播放 | 精品中文字幕在线观看 | 国产视频1区2区 | 天天操夜夜拍 | 久草免费福利在线观看 | 四虎成人精品永久免费av | 一区二区在线影院 | 婷婷电影在线观看 | 精品久久91| 激情网婷婷 | av色图天堂网 | 亚洲性少妇性猛交wwww乱大交 | 99久久超碰中文字幕伊人 | www.五月天 | 天天操天天射天天 | 日韩欧美综合精品 | 国产精品美女久久久久久 | 在线a亚洲视频播放在线观看 | 日韩网页 | 久久久精品一区二区 | 91av免费看 | 亚洲乱码中文字幕综合 | 色噜噜在线观看 | 人人爱天天操 | 国产成人av电影在线观看 | 美女福利视频网 | 亚洲国产偷 | 亚洲精品视频在线观看免费视频 | 91亚洲精品在线观看 | 黄色大全在线观看 | 国产在线国偷精品产拍免费yy | 波多野结衣视频一区 | 欧美日韩精品网站 | 中文字幕一区二区三区四区视频 | 色综合天天色 | 国产精品久久久久久爽爽爽 | 久久这里只精品 | 玖玖在线看 | 在线免费视 | 日本精品视频网站 | 福利视频一区二区 | 国产精品免费看久久久8精臀av | 超碰国产在线观看 | 日韩免费电影一区二区三区 | 国产亚洲免费观看 | 人人添人人澡 | 99久久99视频只有精品 | 日韩av片免费在线观看 | 国产精品久久精品 | 久久午夜电影 | 在线看片中文字幕 | 婷婷久久综合网 | 91精品啪在线观看国产81旧版 | 日韩精品一区二区在线观看视频 | 精品久久久99 | 成人免费色| 丁香激情综合久久伊人久久 | 日本黄区免费视频观看 | 久久天堂亚洲 | 色婷婷88av视频一二三区 | 午夜视频在线观看一区二区三区 | 日韩欧美一级二级 | 射射射av | 综合天天色 | 亚洲精品乱码久久久一二三 | 久草在线资源免费 | 国产日韩精品在线观看 | 精品国产一二区 | 日韩网站在线 | 五月天丁香综合 | 欧美一级高清片 | 在线观看国产一区 | 亚洲综合激情小说 | 精品国产一区二区三区日日嗨 | 日韩黄色一级电影 | 日日夜夜精品免费观看 | 国产一级视频在线观看 | 色午夜 | 99国产精品视频免费观看一公开 | 国产精品 9999 | 人人爽人人爽人人片av免 | 中文字幕av在线播放 | 992tv在线 | 免费观看黄 | 日韩av免费在线电影 | 国产精品久久久久久久久久免费 | 国产精品99久久久久久久久久久久 | 精品视频97| 欧美亚洲国产精品久久高清浪潮 | 日韩高清一区二区 | 国产精品久久久久久久久久免费看 | 国产亚洲资源 | 在线观看中文字幕一区 | 99精品国产aⅴ| 蜜桃av人人夜夜澡人人爽 | 亚洲理论视频 | 又黄又爽又湿又无遮挡的在线视频 | 精品国产美女在线 | 五月婷香蕉久色在线看 | 在线午夜 | 成 人 黄 色视频免费播放 | 久久免费av| 国精产品999国精产 久久久久 | 蜜臀av.com| 人人澡视频 | 综合色久 | 91在线蜜桃臀 | a视频免费| 97色国产 | 欧美最猛性xxx | 国产精品嫩草影院123 | 久久综合九色综合97_ 久久久 | 精品1区2区3区 | 久久影视网| 午夜精品久久久久久久99水蜜桃 | 国产免费成人av | 黄色av播放 | 亚洲伦理中文字幕 | 日本aaa在线观看 | 五月婷影院 | www.国产在线| 色综合天天狠天天透天天伊人 | 日韩欧美黄色网址 | 欧美最新另类人妖 | 日韩欧美在线视频一区二区三区 | 一区二区视频电影在线观看 |