轉載請注明出處:王亟亟的大牛之路
年后第一篇,自從來了某司產量驟減,這里批評下自己,這一篇的素材來源于老牌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 這部分開始自己實現我覺得也很方便。