Android App Development: Hvordan Fange Video

I tidligere tutorials vi så på å skrive kode for å få tilgang til den innebygde kameraet, forhåndsvise displayet, og lagre et bilde. Mange Android-enhet kameraer vil også ta opp video, men koden for å håndtere dette må være litt mer komplisert.

Hvordan Ring av kameraet i Android App Development

Hvordan Ring Kamera i Android Apps Del 2: fange og lagre bilder

Sette opp MediaRecorder

Først åpner opp AndroidManifest.xml, for å legge lydopptak tillatelser til kamera tillatelser satt opp i tidligere tutorials:

 < manifest .... > < bruker-tillatelse android: name = "android.permission.CAMERA" /> < bruker-tillatelse android: name = "android.permission.ACCESS_NETWORK_STATE" /> < bruker-tillatelse android: name = "android.permission.RECORD_AUDIO" /> < bruker-feature android: name = "android.hardware.camera" /> 

Vi skal skrive en egen metode i MyCameraActivity.java å håndtere video. De første skritt er å låse kameraet, og for å skape en ny MediaRecorder. Vi trenger denne metoden for å returnere true /false slik at når senere prøver vi å starte opptaket, kan vi sjekke at alt er blitt satt opp med suksess før opptak (og dermed unngår ulike mulige feil):

 privat MediaRecorder mr; beskyttet boolean prepareForVideoRecording () {camera.unlock (); mr = new MediaRecorder (); mr.setCamera (kamera);} 

Å låse kameraet er nødvendig for at media prosess for å få tilgang til kameraet. (Hvis du bare å ta stillbilder, håndterer kameraet API alt dette automatisk for deg, trenger du bare å bekymre deg for det for video.)

Deretter må vi sette ulike aspekter av MediaRecorder: kilden (både lyd og video), profilen, utdatafilen, og forhåndsvisningen:

 private static final int MEDIA_TYPE_VIDEO = 1; beskyttet boolsk prepareForVideoRecording () {camera.unlock (); mr = new MediaRecorder (); mr.setCamera (kamera); mr.setAudioSource (MediaRecorder.AudioSource.CAMCORDER); mr.setVideoSource (MediaRecorder.VideoSource.CAMERA); mr.setProfile (CamcorderProfile.get (CamcorderProfile.QUALITY_HIGH)); mr.setOutputFile (getOutputMediaFile (MEDIA_TYPE_VIDEO) .toString ()); mr.setPreviewDisplay (preview.getHolder () getSurface ().);} 

AudioSource og VideoSource vet hva du forventer. Det finnes en haug av tilgjengelige alternativer for lyd (inkludert VOICE_CALL og MIC), men her bruker vi videokameraet (som matcher kameraet hvis tilgjengelig, eller bruker hovedmikrofonen ellers). For video dine eneste alternativene er CAMERA eller DEFAULT.

setProfile () er en snarvei (kun tilgjengelig siden API 8) som lar deg sette en haug med video og audio-koding og format informasjon på en gang. Hvis du ønsker å gjøre dette manuelt, for å enten kjøre mot tidligere APIer, eller fordi du vil ha mer finkornet kontroll, her er noen eksempler lines:

mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);mr.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

Check ut MediaRecorder API-dokumenter for flere alternativer, og de CamcorderProfile API docs for informasjon om hva som er automatisk hvis du bruker det alternativet

Merk for Samsung-telefoner.
Det er et problem med noen Samsung telefoner som betyr at de trenger noen flere innstillinger for å fungere korrekt. Sjekk ut denne Stackoverflow tråden og denne XDA Developers tråd for flere detaljer.

Du vil se at kallet til getOutputMediaFile () angir en videoutgang filetype, som vår eksisterende metoden ikke håndterer. Her er den ekstra kode til å administrere at:

 privat File getOutputMediaFile (int type) {//Få katalog og tidsstempel som før om (type == MEDIA_TYPE_IMAGE) {return new File (dir.getPath () + File. separator + "IMG_" + TimeStamp + ".jpg"); } Else if (type == MEDIA_TYPE_VIDEO) {return new File (dir.getPath () + File.separator + "VID_" + TimeStamp + ".3gp"); } Else {return null; }} 

Du må kanskje endre filtypen slutter hvis du har oppgitt en annen koding.

Til slutt, er forhåndsvisningen samme forhåndsvisning som vi satt opp før, og vi bare ringe de aktuelle metoder å få overflaten den bruker så MediaRecorder kan snakke med at overflaten

Opptak

Den siste ting å gjøre før innspillingen er å forberede MediaRecorder.

 beskyttet boolsk prepareForVideoRecording () {//som ovenfor forsøk {mr.prepare (); } Catch (IllegalStateException e) {Log.e (TAG, "IllegalStateException når du forbereder MediaRecorder" + e.getMessage ()); e.getStackTrace (); releaseMediaRecorder (); return false; } Catch (IOException e) {Log.e (TAG, "IOException ved utarbeidelse MediaRecorder" + e.getMessage ()); e.getStackTrace (); releaseMediaRecorder (); return false; } Return true;} private void releaseMediaRecorder () {if (mr = null) {mr.reset (); mr.release (); mr = null; camera.lock (); }} 

Dette er grei; vi bare ringe API forberede () metoden på vår MediaRecorder, og håndtere eventuelle unntak. Legg merke til at det er viktig å slippe MediaRecorder, og å returnere falsk, hvis det er noen unntak. Etter tilbakestilling og slippe MediaRecorder, trenger vi også å låse igjen kameraet slik at app beholder kontrollen over det. (Husk at du må slippe kameraet på pause! Vi har allerede jobbet med dette i koden i tidligere tutorials.)

For å starte opptaket, må vi legge til en knapp i forhåndsvisningsruten, og angi knappen opp for å stoppe og starte opptaket:

 privat Button recordVideoButton; private boolean isRecording = false; private void setUpLayout () {//som i tidligere tutorials setUpVideoButton ();} private void setUpVideoButton () {Button recordVideoButton = (Button) findViewById (R.id.button_video); setUpButton (recordVideoButton, «Start video"); recordVideoButton.setOnClickListener (ny View.OnClickListener () {public void onClick (Vis v) {if (isRecording) {mr.stop (); releaseMediaRecorder (); camera.lock (); recordVideoButton.setText («Start video"); isRecording = false;} else {if (prepareForVideoRecording ()) {mr.start (); recordVideoButton.setText ("Stop video"); isRecording = true;}! else {//Noe har gått galt Slipp kamera releaseMediaRecorder (); Toast.makeText (MyCameraActivity.this, "Beklager: Kan ikke starte video", Toast.LENGTH_LONG) .vis ();}}}}); } 

Du må også legge til en knapp til XML (og du vil ønske å redigere XML litt for å forbedre utseendet av hele greia).

Denne koden er skrevet slik at vi bruke den samme knappen for å starte og stoppe opptak. Dette betyr også at selve knappen viser om du for tiden spiller inn eller ikke, som er en praktisk måte å maksimere brukerinformasjon med minimal skjermen eiendomsmegling bruk. Hvis programmet allerede er opptak, når knappen klikkes, ønsker brukeren å stoppe opptaket. Så vi stoppe og slippe MediaRecorder, låse igjen kameraet, endre knappen teksten, og tilbake isRecording.

Hvis programmet ikke allerede spiller inn, ønsker vi å starte innspillingen. Hvis oppsettet metoden returnerer true (dvs. MediaRecorder har med hell blitt forberedt), starter vi innspillingen, endre knappen teksten, og tilbake isRecording. Hvis MediaRecorder ikke er vellykket forberedt, vi slipper den igjen, og viser en Toast melding å la brukeren vite at noe har gått galt.

Legg merke til at i motsetning til med kameraet bilde lagring, med MediaRecorder, passerer i filnavn for lagring automatisk tar seg av lagring av video; du trenger ikke å håndtere lagring av det selv. Men det er alt den gjør her lagre den til filnavnet du oppgir (sjekke dette ut via en fil explorer app); Hvis du ønsker å gjøre noe annet med opptakene (for eksempel vise den til brukeren eller tillate dem å redigere den) du trenger for å utvide programmet videre til å gjøre det.

I ytterligere tutorials Vi ll ta en titt på noen av de valgfrie egenskapene til kamera, og hvordan du bruker dynamisk layout å tilby bruker alternativene kun når de er tilgjengelige. Anmeldelser