Android實(shí)現(xiàn)調(diào)用手機(jī)攝像頭錄像限制錄像時(shí)長(zhǎng)
本文實(shí)例為大家分享了Android實(shí)現(xiàn)調(diào)用手機(jī)攝像頭錄像限制錄像時(shí)長(zhǎng)的具體代碼,供大家參考,具體內(nèi)容如下
因?yàn)榉?wù)器空間有限,所以視頻時(shí)長(zhǎng)必須有所限制。
在xml中先布局一個(gè)按鈕,點(diǎn)擊開(kāi)始錄頻。布局一個(gè)TextView用于顯示倒計(jì)時(shí)的時(shí)間。
一、使用Hander+TimerTask完成定時(shí)操作
private TextView btn_stop; private int recLen = 11; Timer timer = new Timer(); //時(shí)間倒計(jì)時(shí)放在開(kāi)始按鈕事件后,看標(biāo)題7那里是時(shí)間倒計(jì)時(shí)開(kāi)始的時(shí)候 //timer.schedule(task,1000,1000); final Handler handler = new Handler(){ ? ? ? ? @Override ? ? ? ? public void handleMessage(Message msg){ ? ? ? ? ? ? switch (msg.what){ ? ? ? ? ? ? ? ? case 1: ? ? ? ? ? ? ? ? ? ? btn_stop.setText(""+recLen); ? ? ? ? ? ? ? ? ? ? if(recLen<0){ ? ? ? ? ? ? ? ? ? ? ? ? timer.cancel(); ? ? ? ? ? ? ? ? ? ? ? ? btn_stop.setVisibility(View.GONE); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? }; ? ? ? TimerTask task = new TimerTask() { ? ? ? ? @Override ? ? ? ? public void run() { ? ? ? ? ? ? recLen--; ? ? ? ? ? ? Message message = new Message(); ? ? ? ? ? ? message.what = 1; ? ? ? ? ? ? handler.sendMessage(message); ? ? ? ? ? ? ? //當(dāng)?shù)褂?jì)時(shí)時(shí)間到1的時(shí)候關(guān)閉錄像 ? ? ? ? ? ? if (recLen == 1){ ? ? ? ? ? ? ? ? customTimer.Stop(); ? ? ? ? ? ? ? ? stopRecord(); ? ? ? ? ? ? } ? ? ? ? } ? ? };
二、初始化攝像頭
private void initCamera() { ? ? ? ? mCamera = Camera.open(0); ?//① ? ? ? ? mCamera.setDisplayOrientation(90); ? ? ? ? try { ? ? ? ? ? ? mCamera.setPreviewDisplay(mSurfaceHolder); ? ? ? ? ? ? ? mCamera.cancelAutoFocus();//此句加上 可自動(dòng)聚焦 必須加 ? ? ? ? ? ? Camera.Parameters parameters = mCamera.getParameters(); ? ? ? ? ? ? //查詢攝像頭支持的分辨率 ? ? ? ? ? ? parameters.getSupportedPreviewSizes(); ? ? ? ? ? ? for (int i = 0; i < parameters.getSupportedPreviewSizes().size(); i++) { ? ? ? ? ? ? ? ? Log.i("<><><><>Width", parameters.getSupportedPreviewSizes().get(i).width + ""); ? ? ? ? ? ? ? ? Log.i("<><><><>Height", parameters.getSupportedPreviewSizes().get(i).height + ""); ? ? ? ? ? ? } ? ? ? ? ? ? //設(shè)置分辨率 ? ? ? ? ? ? parameters.setPreviewSize(1280, 720); ? ? ? ? ? ? //設(shè)置聚焦模式 ? ? ? ? ? ? parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); ? ? ? ? ? ? //縮短Recording啟動(dòng)時(shí)間 ? ? ? ? ? ? parameters.setRecordingHint(true); ? ? ? ? ? ? //是否支持影像穩(wěn)定能力,支持則開(kāi)啟 ? ? ? ? ? ? if (parameters.isVideoStabilizationSupported()) ? ? ? ? ? ? ? ? parameters.setVideoStabilization(true); ? ? ? ? ? ? mCamera.setParameters(parameters); ? ? ? ? ? ? mCamera.startPreview(); ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? Log.i(TAG, "Error starting camera preview: " + e.getMessage()); ? ? ? ? } ? ? }
三、創(chuàng)建視頻文件
private boolean createRecordDir() { ? ? ? ? if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { ? ? ? ? ? ? Toast.makeText(this, "SD卡不存在!", Toast.LENGTH_SHORT).show(); ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? ? File sampleDir = new File("/sdcard/myVideo/"); ? ? ? ? if (!sampleDir.exists()) { ? ? ? ? ? ? sampleDir.mkdirs(); ? ? ? ? } ? ? ? ? videoName = "VID_" + DateUtils.getData(DateUtils.FORMAT_YYYYMMDDHHMMSS) + ".mp4"; ? ? ? ? mVecordFile = new File(sampleDir, videoName); ? ? ? ? return true; ? ? }
四、配置MediaRecorder
private void setConfigRecord() { ? ? ? ? mediaRecorder = new MediaRecorder(); ? ? ? ? mediaRecorder.reset(); ? ? ? ? mediaRecorder.setCamera(mCamera); ? ? ? ? mediaRecorder.setOnErrorListener(onErrorListener); ? ? ? ? //錄像角度 ? ? ? ? mediaRecorder.setOrientationHint(90); ? ? ? ? //使用SurfaceView預(yù)覽 ? ? ? ? mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); ? ? ? ? //1.設(shè)置采集聲音 ? ? ? ? mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); ? ? ? ? //設(shè)置采集圖像 ? ? ? ? mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); ? ? ? ? //2.設(shè)置視頻,音頻的輸出格式 mp4 ? ? ? ? mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); ? ? ? ? //3.設(shè)置音頻的編碼格式 ? ? ? ? mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); ? ? ? ? //設(shè)置圖像的編碼格式 ? ? ? ? mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); ? ? ? ? CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P); ? ? ? ? ? mediaRecorder.setAudioEncodingBitRate(44100); ? ? ? ? if (mProfile.videoBitRate > 2 * 1024 * 1024) { ? ? ? ? ? ? mediaRecorder.setVideoEncodingBitRate(2 * 1024 * 1024); ? ? ? ? } else { ? ? ? ? ? ? mediaRecorder.setVideoEncodingBitRate(1024 * 1024); ? ? ? ? } ? ? ? ? mediaRecorder.setVideoFrameRate(mProfile.videoFrameRate); ? ? ? ? mediaRecorder.setVideoSize(1280, 720); ? ? ? ? ? mediaRecorder.setOutputFile(mVecordFile.getAbsolutePath()); ? ? }
五、停止錄制
private void stopRecord() { ? ? ? ? try { ? ? ? ? ? ? if (isRecording && mediaRecorder != null) { ? ? ? ? ? ? ? ? ? mediaRecorder.setOnErrorListener(null); ? ? ? ? ? ? ? ? mediaRecorder.setPreviewDisplay(null); ? ? ? ? ? ? ? ? mediaRecorder.stop(); ? ? ? ? ? ? ? ? mediaRecorder.reset(); ? ? ? ? ? ? ? ? mediaRecorder.release(); ? ? ? ? ? ? ? ? mediaRecorder = null; ? ? ? ? ? ? ? ? isRecording = false; ? ? ? ? ? ? ? ? Log.i(TAG, "" + mVecordFile.toString()); ? ? ? ? ? ? ? ? //new imageTask().execute(mVecordFile); ? ? ? ? ? ? ? ? ? MessageData md = new MessageData(); ? ? ? ? ? ? ? ? md.srdatatype = SRDataType.錄像返回; ? ? ? ? ? ? ? ? md.Data = mVecordFile.getAbsolutePath(); ? ? ? ? ? ? ? ? ? Intent intent = new Intent(BroadCastParameter.action); ? ? ? ? ? ? ? ? intent.putExtra("data", md); ? ? ? ? ? ? ? ? sendBroadcast(intent); ? ? ? ? ? ? ? ? // Fragment頁(yè)面廣播通知 ? ? ? ? ? ? ? ? LocalBroadcastManager.getInstance(CustomRecorder.this).sendBroadcast(intent); ? ? ? ? ? ? ? ? ? finish(); ? ? ? ? ? ? } ? ? ? ? }catch (Exception ex) ? ? ? ? { ? ? ? ? ? ? //Toast.makeText(getApplicationContext(),ex.getMessage(),1).show(); ? ? ? ? } ? ? }
六、關(guān)閉攝像頭
private void stopCamera() { ? ? ? ? if (mCamera != null) { ? ? ? ? ? ? mCamera.setPreviewCallback(null); ? ? ? ? ? ? mCamera.stopPreview(); ? ? ? ? ? ? mCamera.release(); ? ? ? ? ? ? mCamera = null; ? ? ? ? } ? ? }
七、點(diǎn)擊開(kāi)始錄像按鈕
public void onViewClicked(View view) { ? ? ? ? if (Build.VERSION.SDK_INT >= 23) { ? ? ? ? ? ? int REQUEST_CODE_CONTACT = 101; ? ? ? ? ? ? ? //驗(yàn)證是否許可權(quán)限 ? ? ? ? ? ? for (String str : permissions) { ? ? ? ? ? ? ? ? if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) { ? ? ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(),"存儲(chǔ)權(quán)限未授權(quán)",1).show(); ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? switch (view.getId()) { ? ? ? ? ? ? //開(kāi)始 ? ? ? ? ? ? case R.id.btn_start: ? ? ? ? ? ? ? ? btn_start.setVisibility(View.GONE); ? ? ? ? ? ? ? ? btn_stop.setVisibility(View.VISIBLE); ? ? ? ? ? ? ? ? ? //這是是判斷視頻文件有沒(méi)有創(chuàng)建,如果沒(méi)有就返回 ? ? ? ? ? ? ? ? boolean creakOk = createRecordDir(); ? ? ? ? ? ? ? ? if (!creakOk) { ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? mCamera.unlock(); ? ? ? ? ? ? ? ? ? ? setConfigRecord(); ? ? ? ? ? ? ? ? ? ? ? mediaRecorder.prepare(); ? ? ? ? ? ? ? ? ? ? mediaRecorder.start(); ? ? ? ? ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? ? ? ? ? //Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? StartTime = new Date(System.currentTimeMillis()); ? ? ? ? ? ? ? ? isRecording = true; ? ? ? ? ? ? ? ? customTimer.ReStart(); ? ? ? ? ? ? ? ? ? timer.schedule(task,1000,1000); ? ? ? ? ? ? ? ? break;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android CameraX打開(kāi)攝像頭預(yù)覽教程
- Android?CameraX?打開(kāi)攝像頭預(yù)覽功能
- Androidstudio調(diào)用攝像頭拍照并保存照片
- Android調(diào)用外置攝像頭的方法
- Android調(diào)用手機(jī)攝像頭拍照和錄音功能
- Android調(diào)用手機(jī)攝像頭的方法
- android開(kāi)發(fā)之調(diào)用手機(jī)的攝像頭使用MediaRecorder錄像并播放
- Android開(kāi)發(fā)教程之調(diào)用攝像頭功能的方法詳解
- Android實(shí)現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能
- Android實(shí)現(xiàn)極簡(jiǎn)打開(kāi)攝像頭
相關(guān)文章
Android LinearLayout實(shí)現(xiàn)自動(dòng)換行效果
這篇文章主要為大家詳細(xì)介紹了Android LinearLayout實(shí)現(xiàn)自動(dòng)換行效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Android自定義View實(shí)現(xiàn)開(kāi)關(guān)按鈕
android 自定義view知識(shí)非常廣泛,難以讓人掌握。但是也是andoroid進(jìn)階學(xué)習(xí)的必經(jīng)之路。下面通過(guò)本文給大家介紹Android自定義View實(shí)現(xiàn)開(kāi)關(guān)按鈕的知識(shí),非常不錯(cuò),感興趣的朋友一起看看吧2016-11-11Android實(shí)現(xiàn)平滑翻動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)平滑翻動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Android activity實(shí)現(xiàn)延時(shí)跳轉(zhuǎn)功能
Activity是一個(gè)Android的應(yīng)用組件,它提供屏幕進(jìn)行交互。今天通過(guò)本文給大家介紹Android activity實(shí)現(xiàn)延時(shí)跳轉(zhuǎn)功能,感興趣的朋友一起看看吧2021-06-06flutter 微信聊天輸入框功能實(shí)現(xiàn)
這篇文章主要介紹了flutter 微信聊天輸入框功能實(shí)現(xiàn),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Android?studio開(kāi)發(fā)實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Android?studio開(kāi)發(fā)實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Kotlin對(duì)象的懶加載方式by?lazy?與?lateinit?異同詳解
這篇文章主要為大家介紹了Kotlin對(duì)象的懶加載方式by?lazy?與?lateinit?異同詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10