hvordan kalder kameraet i androide apps del 2: opsamling og lagring af billeder

i sidste androide forelæsning, begyndte vi at opbygge en grundlæggende kamera aktivitet på androide.det vil give os mulighed for at kontrollere og styre anordning kamera direkte i stedet for bare at skyde en hensigt at misligholdelse kamera aktivitet.den kode i den sidste lektion satte kameraet op, og kameraet forpremiere.nu skal vi fange og opbevare et foto.,, fælde, vi allerede etableret sig for at tillade anvendelse af kameraet.opbevarer et foto, er vi også nødt til at tilføje, tilladelse til at anvende ekstern, redigering, androidmanifest. xml,,,,,,, < åbenbart...> < anvender tilladelse androide: navn = "androide. tilladelse. write_external_storage" />,, så vi er nødt til at tilføje en "foto" knap kameraet forpremiere.edit, main.xml, til at omfatte en knap:,, < linearlayout...> < framelayout.../> < knap androide: id = "@ + id /button_photo" androide: tekst = "foto" androide: layout_width = "wrap_content" androide: layout_height = "wrap_content" androide: layout_gravity = "centret" /> < /linearlayout >,, (det er at foretrække at anvende, strings.xml, opbevarer den knap tekst i stedet for hårdt, kodning, det som det er her.), opsamling og lagring af billeder,, hvis du løber den kode, du skulle se et billede på, men det gør ikke noget.vi er nødt til at skrive, der tager sig af det.det, setuplayout(), i mycameraactivity:,, knap capturebtn = (knap) findviewbyid (r.id.button_photo); capturebtn. setonclicklistener (ny mening. onclicklistener() (offentlige eller onclick (betragtning v) (takephoto();}});,,, takephoto(), arbejder for at tage et billede fra kameraet forpremiere:,, beskyttede statisk endelige int media_type_image = 0, private tomrum takephoto() {picturecallback picturecb = nye picturecallback() (offentlige eller onpicturetaken (byte [] oplysninger, kamera cam) (sag picfile = getoutputmediafile (media_type_image); hvis (picfile = = null) (log. e (et, "ikke kunne skabe medier fil kontrollere oplagring tilladelserne?"); tilbage;} prøve (fileoutputstream fos = nye fileoutputstream (picfile); fos. skrive (data), fos. close();} fangst (filenotfoundexception e) (log. e (et, "fil fundet:" + e. getmessage()); f. getstacktrace();} fangst (ioexception e) (log. e (- "jeg /o fejl skriftligt dokument:" + e. getmessage()); f. getstacktrace();}}} kamera. takepicture (nul, nul, picturecb)}, lad os se på det i detaljer.- androiden er picturecallback grænseflade til at få fat i det billede data fra et kamera.som du kan se, er de fleste af den kode, takephoto(), opstiller den picturecallback.den sidste linje, er den, der skal denne nye callback ind i kameraet ved at give den til, takepicture() fra kameraet api - grænseflade.så når brugeren slår opsamling knap, metoden anvendes, takepicture(), fortælle kameraet til at tage et billede, så går de oplysninger i picturecallback.,, i picturecallback, får vi en fil at skrive, skrive til det og at behandle de forskellige mulige fejl.- hvis du havde skrevet en anden slags app, kan du gøre noget helt andet med dette billede data, som viser det eller opbevare den i en database.) for at få en bestemt produktion fil, vi har brug for en hjælper metode:,, private fil getoutputmediafile (int) {fil dir = nye fil (miljø. getexternalstoragepublicdirectory (miljø. directory_pictures), getpackagename()); hvis (!dir. exists()) (hvis (!dir. mkdirs()) (log. e (rfid - "undladt at skabe oplagring fortegnelse."); tilbage for;}} snor timestamp = nye simpledateformat ("yyymmdd_hhmmss" locale. uk). format (nye date()); hvis (type = media_type_image) {tilbage nye fil (fortegnelse. getpath() + file.separator + "img_" + timestamp + "jpg)} andre {tilbage.;), er der to muligheder for at få en oplagring adresseregister for sd - kort:,,,, miljø. getexternalstoragepublicdirectory(): denne bruger en offentlig fortegnelse.hvis app er afmonteret, billederne bliver.,,, - sammenhæng. getexternalfilesdir(): denne bruger et register, der er privat til app.hvis app er afmonteret, billederne, vil også blive slettet.,,, ved afgørelsen af, hvilke af disse at anvende, bør du tænke grundigt over den opførsel, din brugere vil forvente, hvis eller når de slette din app.i de fleste tilfælde brugere kan være temmelig skuffet over, at finde billeder uventet udgår, men dette vil afhænge af de nærmere detaljer i din app.,, hvis anvendelse af det offentlige register, som her, sørg for at skabe en subdirectory til oplagring (som her, en eventuel fortegnelse navn er hvad der er tilbage af getpackagename(),).ellers bruger ender med en masse billeder forurenende deres rod ekstern.når registret er valgt... og, om nødvendigt, skabte vi også skabe et filnavn; her med dato /tidspunkt, som er standarden.her er vi kun behandler jpg medier filer.hvis du ønsker at klare video som du kan tilføje kode til at beskæftige sig med at redde det på passende vis.bemærk dog, at videoen er meget mere komplicerede at forvalte.,, baggrund kode, løb koden og prøve det.nu kan du redde en fil (som du vil se, hvis du bruger en fil manager app at navigere på oplagring directory).,, men du vil opdage, at forvisningen fryser du tager billedet.du kan starte den nemt ved at tilføje denne linje, takephoto():,, kamera. takepicture (nul, nul, picturecb); kamera. startpreview();, selv med denne linje, men den første fryser, mens dossieret opbevares.det er fordi, som vores kode står, alt bliver gjort på samme spor.vi kiggede på gevindskæring i gulvet forelæsning, men i stedet for at skrive din egen tråd, asynctask giver en hurtig metode til at give noget til en baggrund hjælper tråd med minimal kode.(husk androiden kode ikke er threadsafe: kun bruger en baggrund tråd til noget, der ikke involverer eu - erhvervsgrenen.her er vi kun at redde billedet i baggrunden. vi vil se på asynctask i detaljer i en forelæsning, men her er koden til at ordne problemet:,, private tomrum takephoto() {picturecallback picturecb = nye picturecallback() (offentlige eller onpicturetaken (byte [] oplysninger, kamera cam) (nye savephototask(). henret (data), cam. startpreview();}} kamera. takepicture (nul, nul, picturecb)} klasse savephototask udvider asynctask < byte [], snor, snor > (@ tilsidesætte beskyttede snor doinbackground (byte [].data) (sag picfile = getoutputmediafile (media_type_image); hvis (picfile = = null) (log. e (et, "fejl at skabe medier fil er oplagring tilladelser korrekt?")og tilbage for;}, byte [0] photodata = data [0] prøve (fileoutputstream fos = nye fileoutputstream (picfile); fos. skrive (photodata); fos. close();} fangst (filenotfoundexception e) (log. e (et, "fil fundet:" + e. getmessage()); f. getstacktrace();} fangst (ioexception e) (log. e (mærke, i /o fejl med fil: "+ e. getmessage()); f. getstacktrace();} tilbage for;}}, bemærke, at du har brug for at få det fælles system, photodata, ud af den flerdimensionelle system, data, før du kan skrive til sagen.ellers er det samme kode er lige flyttet ind i en særskilt klasse og tråd.løb, så tjek din reddede foto med din fil manager.,, der er mange forbedringer, som de kan yde til denne app; kameraer har mange forskellige muligheder, for eksempel.i flere tutorials ser vi på, at video og tilføje muligheder for flash - og andre kamera kapacitet.

android camera saved image
android camera capture



Previous:
Next Page: