主頁 > 移動端開發 > Android系統編程入門系列之硬體互動——多媒體攝像頭

Android系統編程入門系列之硬體互動——多媒體攝像頭

2021-12-07 08:26:22 移動端開發

多媒體包括圖片、影片、音頻、視頻,這些多媒體素材的采集(輸入)主要依靠攝像頭和麥克風等硬體設備轉化為基礎資料,而他們的播放渲染(輸出),則需要依靠具有相關功能的編解碼軟體,當然隨著硬體集成度越來越高,也有些基礎功能內置到硬體中解碼,以此減少軟體解碼程序中的CPU耗時操作,這種方式稱為硬體加速,由于多媒體的播放渲染(輸出)是由系統主動向用戶發出的,通常不需要向用戶申請權限,系統將資料直接發給應用程式,進而在應用程式內編程實作相關資料的解碼播放渲染(輸出)操作,故文章重點介紹在多媒體采集(輸入)程序中可能用到的硬體及相關使用流程,

多媒體系列硬體

攝像頭及相關硬體

攝像頭作為移動手機設備的重要硬體之一,從最初的單一攝像頭,到最新的浴霸式四孔攝像頭,不管是數量,還是焦距性能上,在不同設備上都有不同的區別,與傳感器系列硬體互動一文相似的是,這些繁雜的型別,都由系統適配完成,而應用程式只需要使用系統提供的相關類即可,

對于攝像頭硬體的使用,在Android5.0即API級別21以下的系統版本中,可以使用android.hardware.Camera攝像頭類的相關方法來獲取攝像頭資料,以用來實時預覽攝像頭采集的資料、拍照保存某一時刻的資料、或錄制視頻保存一段時刻內的資料,但是從Android5.0開始,上述類由于過于臃腫而廢棄,進而使用android.hardware.camra2. 包下的相關類開發更定制化的應用,

權限宣告

對于使用攝像頭硬體的應用程式,都需要宣告權限為Manifest.permissions.CAMERA="android.permission.CAMERA",
同樣也可以在應用程式清單檔案中宣告需要攝像頭硬體的設備支持,也可以增加標簽資訊<uses-feature android:name="android.hardware.camera"/>

另外,如果在使用攝像頭拍照時,需要在照片中保存位置資訊,應用程式需要申請位置權限;而想將照片存盤到外部存盤設備,還需要應用程式申請讀寫外部存盤的相關權限;如果是使用攝像頭錄制有聲視頻,應用程式還需要申請麥克風權限,

使用流程

目標版本為API 21以下

在使用前首先檢測攝像頭硬體,在能獲取到Context背景關系環境物件的位置,呼叫背景關系環境物件的getPackageManager()方法獲取android.content.pm.PackageManager包管理類的實體化物件,進而通過該物件的hasSystemFeature(String featureName)方法,使引數 featureName 值為PackageManager.FEATURE_CAMERA 代表攝像頭功能,來判斷當前系統是否有攝像頭硬體的支持,

對于有攝像頭硬體支持的設備,可以使用Camera.getNumberOfCameras()靜態方法獲取當前設備的所有可用攝像頭數量,而每個攝像頭硬體都對應一個int型別的 cameraId 屬性編號,其值大于等于0,且小于靜態方法獲取可用攝像頭數量,在下面獲取攝像頭資訊和打開指定攝像頭時均是根據 cameraId 屬性值確定的,

對于每一個具有 cameraId 屬性值的攝像頭,都可以呼叫Camera.open(int cameraId)方法獲取到對應的Camera攝像頭類的實體化物件,引數 cameraId 即上文提到的攝像頭硬體編號,該引數默認值為0;如果編號引數對應的攝像頭硬體不存在時,該方法則回傳空指標,

在得到Camera實體化物件后,可以查看該攝像頭硬體的詳細資訊,呼叫該物件的getParameters()方法,得到回傳值為android.hardware.Camera.Parameters攝像頭引數型別的物件,在Camera.Parameters引數型別的物件中,可以使用getX系列方法獲取包括閃光燈、聚焦、解析度等系列資訊;同時也可以使用setX系列方法重新調整設定包括閃光燈、聚焦、解析度等系列資訊,如果修改攝像頭硬體的引數物件后,可以呼叫Camera攝像頭物件的setParameters(Camera.Parameters params)方法,將修改后的引數應用到對應的攝像頭硬體中,

預覽

要實作Camera攝像頭的預覽功能,只需要借助自定義控制元件類,該類繼承自系統控制元件android.view.SurfaceView類,
在自定義控制元件類的構造方法中,傳入上文獲取的Camera攝像頭物件作為該類的全域變數,以供在預覽功能開啟或關閉時呼叫攝像頭物件的相關方法,
之后可以在自定義控制元件類內部呼叫自己的getHolder()方法,回傳android.view.SurfaceHolder型別的物件,該物件是系結當前SurfaceView控制元件與其中的控制資訊的,可以呼叫該物件的setX系列方法設定當前自定義的SurfaceView中的顯示資訊,同時呼叫該物件的addCallback(SurfaceHolder.Callback callback)方法為當前自定義SurfaceView增加界面更新的回呼,引數 callback 為回呼介面android.view.SurfaceHolder.Callback實作的實體化物件,

SurfaceHolder.Callback介面的實體化物件中,分別實作surfaceCreated(SurfaceHolder holder)在自定義控制元件創建時回呼的方法,通常在該方法中呼叫當前類的全域變數Camera物件的setPreviewDisplay(holder)方法將攝像頭與當前控制元件系結,之后呼叫Camera物件的startPreview()方法啟動攝像頭的預覽,這樣攝像頭采集的資料就會實時展示在當前自定義SurfaceView控制元件中了;surfaceChanged(SurfaceHolder holder, int format, int width, int height)在自定義控制元件包括后邊三個引數所代表的資訊發生改變時回呼的方法,此時一般要先呼叫全域變數Camera物件的stopPreview()停止預覽,之后完成該控制元件內部的一些更新資訊,最后再重新呼叫Camera物件的setPreviewDisplay(holder)startPreview()方法重新系結并啟動預覽;surfaceDestroyed(SurfaceHolder holder)在自定義控制元件被銷毀時回呼的方法,通常在剛方法中會呼叫Camera物件的stopPreview()停止預覽,最后呼叫release()方法直接釋放相關資源,這樣該Camera物件的相關資料便都清空了,

拍照

要實作攝像頭的拍照功能,只需要呼叫Camera物件的takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg)方法,其中引數 shutter 是拍照那一刻回呼的android.hardware.Camera.ShutterCallback介面物件,在拍攝照片時,會回呼該物件的唯一方法onShutter(),因此如果想在拍照時搞些小動作,可以在該物件的onShutter()中添加代碼,通常該引數 shutternull
引數 rawpostviewjpeg 三個都是android.hardware.Camera.PictureCallback圖片回呼介面的實體化物件,在該物件中實作了onPictureTaken(byte[] data, Camera camera)方法,是攝像頭采集到拍攝的資料后回呼該方法,其中的 data 引數便是具體的照片資料,而 camera 則是對應的攝像頭物件;三個引數不同的是,引數 raw 是回傳的原始資料、引數 postview 是回傳的是縮略圖資料、引數 jpeg 則是回傳的經過jpeg編碼的壓縮資料,

視頻錄制

如果想實作實作攝像頭的錄制視頻功能,在呼叫Camera物件的startPreview()方法開啟預覽后,還要呼叫其unlock()方法將該攝像頭物件從當前行程解鎖,以便之后將該攝像頭物件配置到android.media.MediaRecorder多媒體錄制類中,在多媒體錄制類結束錄制并關閉釋放相關資源后,呼叫Camera物件的reconnect ()方法重新將該攝像頭與當前行程鎖定,這樣便可以在當前行程中繼續使用該攝像頭物件了,

關于使用MediaRecorder多媒體錄制類的相關流程,將在后續文章中詳細講解,

目標版本為API 21及以上

從Android5.0版本系統開始,可以在應用程式專案組態檔中增加androidx.camera:camera-coreandroidx.camera:camera-camera2等官方提供的CameraX框架的依賴庫,該庫將攝像頭的功能分別作為單獨的類處理,而不是繼續使用低版本將功能都添加到同一個Camera類中,

首先是檢測設備是否支持攝像頭硬體,同樣是在能獲取Context背景關系環境物件的地方,借助androidx.camera.lifecycle.ProcessCameraProvider攝像頭提供者類的靜態方法getInstance(Context context)獲取提供者的行程間唯一的單例物件,回傳的是ListenableFuture<ProcessCameraProvider>型別的結果,這里的ListenableFuture是谷歌提供的 guava 框架下com.google.common.util包中的異步任務,簡單來說就是該型別的物件可以呼叫addListener(Runnable runnable, Executor executor)監聽方法,在該物件所系結的異步任務完成后會回呼監聽方法中的引數 runnable 運行,而引數 executor 則指定了運行 runnable 所在的執行緒,通過使用ContextCompat.getMainExecutor(Context context)方法獲取UI主執行緒的Executor物件,而這里通過攝像頭提供者類的靜態方法獲取的單例物件,就是對應的異步任務,在回傳ListenableFuture<ProcessCameraProvider>物件后,為該物件增加監聽方法,在異步任務完成后才會呼叫監聽方法中的內容,

在引數 runnable 定義的運行程序中,便可以直接使用之前的ListenableFuture<ProcessCameraProvider>物件的get()方法,回傳ProcessCameraProvider型別的單例物件以實作攝像頭功能,

同樣可以呼叫ProcessCameraProvider物件的getAvailableCameraInfos()方法獲取可以訪問的攝像頭詳細資訊,得到androidx.camera.core.CameraInfo攝像頭資訊物件組成的串列,

預覽

實作預覽功能,主要依靠androidx.camera.view.PreviewView預覽視圖類作為系統控制元件來實時展示攝像頭采集的資料,最終在代碼中呼叫PreviewView物件的getSurfaceProvider()方法,可以獲取androidx.camera.core.Preview.SurfaceProvider預覽提供者型別的物件,為之后將該控制元件與androidx.camera.core.Preview預覽類系結,

之后需要創建androidx.camera.core.Preview預覽類,其創建方式遵循建造者模式,構造androidx.camera.core.Preview.Builder建造者物件,使用該物件的setX系列方法可以配置預覽資訊,最終呼叫建造者物件的build()方法回傳創建Preview預覽類物件,

得到Preview物件后,呼叫setSurfaceProvider(Preview.SurfaceProvider surfaceProvider)方法系結預覽視圖控制元件,引數 surfaceProvider 即上文預覽視圖控制元件物件中的Preview.SurfaceProvider型別的預覽提供者物件,

最終,只需將該Preview物件系結到ProcessCameraProvider攝像頭提供者物件中,在上文獲取到攝像頭提供者的異步任務完成監聽中,呼叫ProcessCameraProvider物件的bindToLifecycle (LifecycleOwner lifecycleOwner, CameraSelector cameraSelector, UseCase... useCases)方法將攝像頭、預覽、分別與當前界面生命周期系結即可,其中引數 lifecycleOwner 為當前界面Activity 物件;
引數 cameraSelector 是通過建造者模式創建的androidx.camera.core.CameraSelector攝像頭選擇器物件,通過先構造androidx.camera.core.CameraSelector.Builder建造者物件,使用該物件的requireLensFacing(int lensFacing)方法來選擇要使用的攝像頭型別,其引數 lensFacing 值只能為前置攝像頭的CameraSelector.LENS_FACING_FRONT=0或后置攝像頭的CameraSelector.LENS_FACING_BACK=1,之后同樣呼叫build()方法回傳創建的CameraSelector物件;
可變引數 useCases 即包括上文中的Preview物件和下文的其他功能對應的案例物件,

拍照

實作拍照功能,主要依靠androidx.camera.core.ImageCapture圖片捕獲類,該類同樣使用建造者模式創建,首先構造androidx.camera.core.ImageCapture.Builder建造者物件,呼叫該物件的setX系列方法,可以設定拍照時的引數資訊,最終呼叫該物件的build()方法,回傳創建的圖片捕獲物件,

在得到ImageCapture圖片拍攝類物件后,同樣需要呼叫ProcessCameraProvider攝像頭提供者物件的bindToLifecycle (LifecycleOwner lifecycleOwner, CameraSelector cameraSelector, UseCase... useCases)方法將攝像頭與當前拍照物件系結,引數 lifecycleOwnercameraSelector 與上文使用相同,而引數 useCases 則是這里的ImageCapture圖片拍攝類物件,

最終在需要拍照的時刻,呼叫ImageCapture圖片拍攝類物件的takePicture(ImageCapture.OutputFileOptions outputFileOptions, Executor executor, ImageCapture.OnImageSavedCallback imageSavedCallback)方法即可,其中,
引數 outputFileOptions 是用建造者模式的輸出檔案選項,同樣是通過構造androidx.camera.core.ImageCapture.OutputFileOptions.Builder建造者,設定要保存的檔案路徑,最終建造回傳androidx.camera.core.ImageCapture.OutputFileOptions型別物件使用即可;
引數 executor 是下一個引數 imageSavedCallback 回呼方法被運行時所在的執行緒;
引數 imageSavedCallback 是androidx.camera.core.ImageCapture.OnImageCapturedCallback照片捕獲后回呼介面的實體化物件,在該物件中需要實作onCaptureSuccess(ImageProxy image)在圖片拍攝成功時的回呼方法,和onError(ImageCaptureException exception)在圖片拍攝出錯時的回呼方法,

視頻錄制

實作視頻錄制功能,主要依靠androidx.camera.video.VideoCapture視頻捕獲類,

這里的VideoCapture視頻捕獲類可就不是建造者模式創建的了,而是使用其靜態方法withOutput(T videoOutput),傳入引數 videoOutput 為視頻輸出流,回傳VideoCapture的實體化物件,這里的視頻輸出流通常為androidx.camera.video.Recorder視頻錄制型別,Recorder視頻錄制類的物件是后面的操作物件,因此他才是用建造者模式創建的,

先構造androidx.camera.video.Recorder.Builder建造者,通過建造者物件的setQualitySelector(QualitySelector qualitySelector)方法為錄制的視頻流設定壓縮質量,該方法的引數 qualitySelector 通常是由androidx.camera.video.QualitySelector質量選擇器的靜態方法getSupportedQualities(CameraInfo cameraInfo)獲取支持的壓縮質量串列,其值包括最低解析度的QualitySelector.QUALITY_LOWEST=0、最高解析度的QualitySelector.QUALITY_HIGHEST=2、480P解析度的QualitySelector,QUALITY_SD=4、720P的QualitySelector.QUALITY_HD=5、1080P的QualitySelector.QUALITY_FHD=6、2160P的QualitySelector.QUALITY_UHD=8,在獲取質量串列的靜態方法中,引數 canmeraInfo 是錄制使用的攝像頭資訊物件,最終呼叫建造者的build()方法,回傳創建的Recorder錄制視頻流物件,

在得到VideoCapture視頻捕獲類物件后,同樣需要呼叫ProcessCameraProvider攝像頭提供者物件的bindToLifecycle (LifecycleOwner lifecycleOwner, CameraSelector cameraSelector, UseCase... useCases)方法將攝像頭與當前視頻捕獲物件系結,在引數 useCases 中增加VideoCapture物件即可,

VideoCapture視頻捕獲類物件系結之后,通過呼叫其getOutput()方法回傳其設定的Recorder視頻錄制物件,
通過呼叫Recorder物件的prepareRecording(Context context, FileOutputOptions fileOutputOptions)方法準備錄制視頻,其引數 context 為背景關系環境物件,引數 fileOutputOptions 與拍攝照片時類似的使用androidx.camera.video.FileOutputOptions輸出檔案選項物件,用以設定錄制視頻的保存路徑,該方法回傳androidx.camera.video.PendingRecording預備錄制型別的物件,

在得到的PendingRecording物件中,可以呼叫start()方法,啟動視頻錄制,回傳androidx.camera.video.ActiveRecording活動錄制型別物件,

在得到的ActiveRecording物件中,可以呼叫pause()方法暫停錄制,resume()方法繼續錄制,stop()方法停止錄制,如此,便可完成視頻的錄制流程,

———————————————————————————————轉載請注明出處:白少木丿—————————————————

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374509.html

標籤:其他

上一篇:異構智聯能力開放,重新定義多屏互動體驗

下一篇:Insights直播回顧,對話專家,HMS Core 6創新能力解讀

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more