年后第一篇,自從來了某司產量驟減,這里批評下自己,這一篇的素材來源于老牌Material Design控件寫手afollestad的 https://github.com/afollestad/material-camera
開篇前,繼續安利,你懂的:https://github.com/ddwhan0123/Useful-Open-Source-Android (最近把 6.0授權部分單獨羅列出來了)
介紹代碼之前先貼下效果圖
先是添加依賴讓maven去下代碼
maven部分
repositories { jcenter() maven { url "https://dl.bintray.com/drummer-aidan/maven" }}然后在build.gradle里添加
compile 'com.afollestad:material-camera:0.4.4'當然你要下源碼也行,就是一個java代碼和布局文件,截圖如下
依賴加好,代碼下好,還需要做一件事,注冊Activity
需要在項目的main文件里加
<activity android:name="com.afollestad.materialcamera.CaptureActivity" android:theme="@style/MaterialCamera.CaptureActivity" /><activity android:name="com.afollestad.materialcamera.CaptureActivity2" android:theme="@style/MaterialCamera.CaptureActivity" />用于注冊library的activity
OK,配置大致就是如下
在使用拍攝功能前肯定,一定會有多多少少的設置,最通常的諸如,圖片儲存地址,圖片大小,畫質壓縮等等,原作者也提供了強大的api,這里做下翻譯。
.allowRetry(true) //是否顯示重拍按鈕.autoSubmit(false) //是否允許用戶在錄制后播放視頻.saveDir(saveFolder) //拍攝的內容的儲存地址.PRimaryColorAttr(R.attr.colorPrimary) //相機配色,建議遵從app style.showPortraitWarning(true) //如果用戶按縱向方向的記錄,是否顯示警告.defaultToFrontFacing(false) //是否默認為前置攝像頭.allowChangeCamera(true) //允許用戶更改相機.retryExits(false) //如果為true,播放屏幕中的“重試”按鈕將退出相機,而不是返回錄音機.restartTimerOnRetry(false) //如果為true,則當用戶在播放中輕按“重試”時,倒計時器將重置為0.continueTimerInPlayback(false) //如果為true,倒計時器將在播放過程中繼續向下,而不是暫停。.videoEncodingBitRate(1024000) //設置視頻大小.audioEncodingBitRate(50000) // 設置音頻大小.videoFrameRate(24) //設置視頻fps值.qualityProfile(MaterialCamera.QUALITY_HIGH)//設置質量配置文件,手動設置比特率或幀速率與其他設置將覆蓋單個質量配置文件設置.videoPreferredHeight(720) //設置錄制視頻的首選高度.videoPreferredaspect(4f / 3f) //為錄制的視頻輸出設置首選寬高比 .maxAllowedFileSize(1024 * 1024 * 5) //將最大文件大小設置為5MB,如果文件達到此限制,錄制將停止。請記住,FAT文件系統的文件大小限制為4GB。.iconRecord(R.drawable.mcam_action_capture) //設置用于開始錄制的按鈕的自定義圖標.iconStop(R.drawable.mcam_action_stop) //為用于停止錄制的按鈕設置自定義圖標.iconFrontCamera(R.drawable.mcam_camera_front)//設置用于切換到前置攝像頭的按鈕的自定義圖標.iconRearCamera(R.drawable.mcam_camera_rear) //設置用于切換到后置攝像頭的按鈕的自定義圖標.iconPlay(R.drawable.evp_action_play) //設置用于開始播放的自定義圖標.iconPause(R.drawable.evp_action_pause) // 設置用于暫停播放的自定義圖標.iconRestart(R.drawable.evp_action_restart)//設置用于重新開始播放的自定義圖標.labelRetry(R.string.mcam_retry) //為用于重試記錄的按鈕設置自定義按鈕標簽(如果可用).labelConfirm(R.string.mcam_use_video) //為用于確認/提交錄音的按鈕設置自定義按鈕標簽.autoRecordWithDelaySec(5) //攝像機將在5秒倒計時后自動開始錄制。這將最初禁用前后攝像頭之間的切換。.autoRecordWithDelayMs(5000) //與上面相同,用毫秒而不是秒表示。.audioDisabled(false) //設置為true可記錄沒有任何音頻的視頻.start(CAMERA_RQ); //啟動相機活動,結果將被發回當前活動這都是api提供的設置的方法,通俗易懂,建議寫成一個工廠方法然后調用,省得每次構造一個新的MaterialCamera對象
作者在適配方面還是做的很用心的,高低版本的Fragment和通常的Activity都有做。兼容方面我分別在 華為,nexus,小米部分機型做過測試沒有明顯的差異和bug出現,我們來看下具體是如何調用的。
MaterialCamera materialCamera = new MaterialCamera(this) .saveDir(saveDir) .showPortraitWarning(true) .allowRetry(true) .defaultToFrontFacing(true) .allowRetry(true) .autoSubmit(false) .labelConfirm(R.string.mcam_use_video);materialCamera.stillShot() .labelConfirm(R.string.mcam_use_stillshot);materialCamera.start(CAMERA_RQ);按鈕啊或者其他地方調用下就好了,然后和使用普通相機一樣在onActivityResult里找結果就行
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Received recording or error from MaterialCamera if (requestCode == CAMERA_RQ) { if (resultCode == RESULT_OK) { final File file = new File(data.getData().getPath()); Toast.makeText(this, String.format("Saved to: %s, size: %s", file.getAbsolutePath(), fileSize(file)), Toast.LENGTH_LONG).show(); } else if (data != null) { Exception e = (Exception) data.getSerializableExtra(MaterialCamera.ERROR_EXTRA); if (e != null) { e.printStackTrace(); Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } } }首先判斷是否是自己之前預設的requestCode值是的話去讀取data里面的值 只要能讀到data值那就走正常的業務邏輯就好。 整體使用體驗和廠商自帶的相機相機功能沒有什么區別。
區別在于存儲部分幫你做了,常用功能幫你封了,長得很MD,還有很強的拓展性
1.暫時只支持android.support.v4.app.Fragment android.app.Fragment Activity調用相機,特殊場景的話自己得轉Context
2.manifest里面加的2個Activity節點不能漏,lib褲自己沒有存貨的進程,都依附于調用者(我沒試過不加會怎么樣,八成是找不到那個類) 那為什么需要有2個呢? 兼容看看2個類的注解就知道了
@TargetApi(Build.VERSION_CODES.LOLLipOP)public class Camera2Fragment extends BaseCameraFragment implements View.OnClickListener以及
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)public class CameraFragment extends BaseCameraFragment implements View.OnClickListener這個庫暫時就介紹到這里,這篇沒去拆源碼,我對這個庫的理解感覺 這是一個實用性大于教學性的開源庫,類似功能的庫實現都是大同小異 都是對自帶的照相機外面套了層ui,套了層功能強化,當然感興趣可以自己去讀讀,不是很難。
如果覺得部分功能自己需要拓展,繼承BaseCameraFragment 這部分開始自己實現我覺得也很方便。
項目地址:https://github.com/afollestad/material-camera
新聞熱點
疑難解答