material-camera
介绍:
安卓的录制api很难搞明白,主要因为许多制造商喜欢随意定制他们的sensor。这个库是经过许多研究和试验之后的结果,让视频录制的适用范围更广。
运行效果:
使用说明:
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #323333; -webkit-text-stroke: #323333; background-color: #f2f2f5} span.s1 {font-kerning: none}
在5.0之前的手机上仍然会有较大可能会出问题。
jCenter
repositories {
jcenter()
maven { url "https://dl.bintray.com/drummer-aidan/maven" }
}
module's build.gradle
dependencies {
// ... other dependencies
compile 'com.afollestad:material-camera:0.4.4'
}
Android Manifest
在AndroidManifest.xml文件中注册库中的两个Activity:
<activity
android:name="com.afollestad.materialcamera.CaptureActivity"
android:theme="@style/MaterialCamera.CaptureActivity" />
<activity
android:name="com.afollestad.materialcamera.CaptureActivity2"
android:theme="@style/MaterialCamera.CaptureActivity" />
可以随意使用自定义的主题。自带的主题可以让这两个Activity默认有一个好快的外观。更多细节请看sample project 。
Code for Video
private final static int CAMERA_RQ = 6969;
File saveFolder = new File(Environment.getExternalStorageDirectory(), "MaterialCamera Sample");
if (!saveFolder.mkdirs())
throw new RuntimeException("Unable to create save directory, make sure WRITE_EXTERNAL_STORAGE permission is granted.");
new MaterialCamera(this) // Constructor takes an Activity
.allowRetry(true) // Whether or not 'Retry' is visible during playback
.autoSubmit(false) // Whether or not user is allowed to playback videos after recording. This can affect other things, discussed in the next section.
.saveDir(saveFolder) // The folder recorded videos are saved to
.primaryColorAttr(R.attr.colorPrimary) // The theme color used for the camera, defaults to colorPrimary of Activity in the constructor
.showPortraitWarning(true) // Whether or not a warning is displayed if the user presses record in portrait orientation
.defaultToFrontFacing(false) // Whether or not the camera will initially show the front facing camera
.retryExits(false) // If true, the 'Retry' button in the playback screen will exit the camera instead of going back to the recorder
.restartTimerOnRetry(false) // If true, the countdown timer is reset to 0 when the user taps 'Retry' in playback
.continueTimerInPlayback(false) // If true, the countdown timer will continue to go down during playback, rather than pausing.
.videoEncodingBitRate(1024000) // Sets a custom bit rate for video recording.
.audioEncodingBitRate(50000) // Sets a custom bit rate for audio recording.
.videoFrameRate(24) // Sets a custom frame rate (FPS) for video recording.
.qualityProfile(MaterialCamera.QUALITY_HIGH) // Sets a quality profile, manually setting bit rates or frame rates with other settings will overwrite individual quality profile settings
.videoPreferredHeight(720) // Sets a preferred height for the recorded video output.
.videoPreferredAspect(4f / 3f) // Sets a preferred aspect ratio for the recorded video output.
.maxAllowedFileSize(1024 * 1024 * 5) // Sets a max file size of 5MB, recording will stop if file reaches this limit. Keep in mind, the FAT file system has a file size limit of 4GB.
.iconRecord(R.drawable.mcam_action_capture) // Sets a custom icon for the button used to start recording
.iconStop(R.drawable.mcam_action_stop) // Sets a custom icon for the button used to stop recording
.iconFrontCamera(R.drawable.mcam_camera_front) // Sets a custom icon for the button used to switch to the front camera
.iconRearCamera(R.drawable.mcam_camera_rear) // Sets a custom icon for the button used to switch to the rear camera
.iconPlay(R.drawable.evp_action_play) // Sets a custom icon used to start playback
.iconPause(R.drawable.evp_action_pause) // Sets a custom icon used to pause playback
.iconRestart(R.drawable.evp_action_restart) // Sets a custom icon used to restart playback
.labelRetry(R.string.mcam_retry) // Sets a custom button label for the button used to retry recording, when available
.labelConfirm(R.string.mcam_use_video) // Sets a custom button label for the button used to confirm/submit a recording
.autoRecordWithDelaySec(5) // The video camera will start recording automatically after a 5 second countdown. This disables switching between the front and back camera initially.
.autoRecordWithDelayMs(5000) // Same as the above, expressed with milliseconds instead of seconds.
.audioDisabled(false) // Set to true to record video without any audio.
.start(CAMERA_RQ); // Starts the camera activity, the result will be sent back to the current Activity
Note: For retryExists(true), onActivityResult() in the Activity that starts the camera will receive MaterialCamera.STATUS_RETRY as the value of the MaterialCamera.STATUS_EXTRA intent extra.
录制时长
你可以指定一个录制的时间限制。countdownMillis(long), countdownSeconds(float), 以及 countdownMinutes(float)都是用来限制时长的方法。
new MaterialCamera(this)
.countdownMinutes(2.5f)
.start(CAMERA_RQ);
当倒计时到了0,停止录制。在此之后根据autoSubmit 和 autoRetry的情况会发生如下行为:
- autoSubmit(false), allowRetry(true)
用户将可以回放录制的视频, 'Retry' 按钮将可见。这是默认的行为。
- autoSubmit(false), allowRetry(false)
用户可以回放录制的视频,但是 'Retry' 按钮将隐藏。
- autoSubmit(true), allowRetry(false)
用户不能回放录制的视频,录制结果立即返回到starting Activity。
- autoSubmit(true), allowRetry(true)
如果你不指定一个长度限制,和3的行为相同。如果指定的话,用户可以retry,但是倒计时将继续直到为0.当倒计时技术之后,结果将自动返回到 starting Activity。
如果你希望camera打开之后立即开始倒计时,而不是等用户按下‘Record’,你可以设置 countdownImmediately(true):
new MaterialCamera(this)
.countdownMinutes(2.5f)
.countdownImmediately(true)
.start(CAMERA_RQ);
Code for Stillshots (Pictures)
new MaterialCamera(this)
/** all the previous methods can be called, but video ones would be ignored */
.stillShot() // launches the Camera in stillshot mode
.start(CAMERA_RQ);
Receiving Results
public class MainActivity extends AppCompatActivity {
private final static int CAMERA_RQ = 6969;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MaterialCamera(this)
.start(CAMERA_RQ);
}
@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) {
Toast.makeText(this, "Saved to: " + data.getDataString(), Toast.LENGTH_LONG).show();
} else if(data != null) {
Exception e = (Exception) data.getSerializableExtra(MaterialCamera.ERROR_EXTRA);
e.printStackTrace();
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
}