Interacting with, and replacing, the camera application on Android

knapsackyarnΚινητά – Ασύρματες Τεχνολογίες

14 Δεκ 2013 (πριν από 3 χρόνια και 8 μήνες)

108 εμφανίσεις

Interacting  with,  and  replacing,  the  
camera  application  on  Android  
CS286  Project  (Spring  2013)  
Xiaohan  Li  
*

Use  Existing  Camera  App  
*

Create  your  own  Camera  App  
*

Replace  Stock  Camera  App  
Contents  
Use  Existing  Camera  App  
//  create  Intent  to  take  a  picture  
Intent  intent  =  new  Intent(
MediaStore.ACTION_IMAGE_CAPTURE
);  
 
//  start  the  image  capture  Intent
 
startActivityForResult
(intent,  CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE)
;  
 
 
How  it  works
[1]  
protected  void  
onActivityResult
(
int
 
requestCode
,  
int
 
resultCode
,  Intent  data)  {  
 
super.onActivityResult
(
requestCode
,  
resultCode
,  data);  
 
 
if  (RESULT_OK  ==  
resultCode
)  {  
   
B u n d l e  e x t r a s  =  
d a t a.g e t E x t r a s
( );  
   
b i t m a p  =  ( B i t m a p )  
e x t r a s.g e t
("d a t a");  
   
i v.s e t I m a g e B i t m a p
( b i t m a p );  
 
 
}  
}
 
R e c e i v i n g  C a m e r a  I n t e n t  R e s u l t  
*

Remove  the  restrictions  of  stock  camera  app  
*

Direct  access  to  Camera  
*

Obtain  preview  frames.  
*

Customized  User  Interface,  and  special  features.  
Customized  Camera  App  
Camera  Apps  
*

Create  a  
SurfaceView
 to  display  the  view  finder  (camera  
preview).  
*

Build  a  overlay  to  display  user  interface.  
*

Request  access  to  Camera  
*

Tell  Camera  display  preview  frames  in  the  
SurfaceView
 
*

Setup  Listeners  for  Capture  –  Preview  frames,  shutter  
pressed,  raw  data,  image  file  
*

Capture  and  Save  Files  -­‐  Setup  the  code  for  capturing  
pictures  (or  videos)  and  saving  the  output.  
*

Release  the  Camera  
How  it  works  
*

The  surface  is  Z  ordered  so  that  it  is  behind  the  
window  holding  its  
SurfaceView
;  the  
SurfaceView
 
punches  a  hole  in  its  window  to  allow  its  surface  to  be  
displayed.    
*

The  transparent  region  that  makes  the  surface  visible  
is  based  on  the  layout  positions  in  the  view  hierarchy  
*

Access  to  the  underlying  surface  is  provided  via  the  
SurfaceHolder
 interface  
SurfaceView
[2]  
//  open  camera  
mCamera
 =  
Camera.
open
();  
//  release  camera  
mCamera.release
();    
//  give  camera  a  
surfaceview
 
mCamera.setPreviewDisplay
(
mViewFinder.getHolder
());  
//  set  parameter  to  camera  
mCamera.setParameters
(
params
);  
 
 
 
Access  to  Camera  
//  give  camera  a  
surfaceview
 
mCamera.setPreviewDisplay
(
mViewFinder.getHolder
());  
//  start  the  view  finder  
mCamera.startPreview
();  
//  stop  the  view  finder  
mCamera.stopPreview
();  
 
 
 
Access  to  Camera  con.  
//  take  picture  
mCamera.takePicture
(this,  null,  null,  this);  
   
public  final  void  
takePicture
 (  
Camera.ShutterCallback
 shutter,    
Camera.PictureCallback
 raw,    
Camera.PictureCallback
 
postview
,  
 
Camera.PictureCallback
 jpeg  
)  
 
 
Access  to  Camera  con.  
*

@Override  
*

public  void  
onPictureTaken
(byte[]  data,  Camera  camera)  {  
*

 
//Store  the  picture  off  somewhere  
*

 
try  {  
*

 
 
FileOutputStream
 out  =  
openFileOutput
("
picture.jpg
",    
*

                                                                                                                                                                                         
Activity.MODE_PRIVATE
);  
*

                                                                         
out.write
(data);  
*

 
 
out.flush
();  
*

 
 
out.close
();  
*

 
}    
*

 
catch  (
IOException
 e)  {    
*

 
 
e.printStackTrace
();  
*

 
}  
*

}  
Save  Image  
My  Customized  Camera  App  
ViewFinder
 
Capture  
Camera  Features
[1]  
Camera  Features  con.
[1]  
*

To  allow  other  apps  to  start  your  activity,  we  need  to  
add  an  intent-­‐filter  in  the  activity  element.  
 
<intent-­‐filter>  
<action  
android:name
=
"
android.media.action.IMAGE_CAPTURE
"  />  
<category  
android:name
 =  
"
android.intent.category.DEFAULT
”  />  
</intent-­‐filter>  
Replace  Stock  Camera
 
 //  Get  the  intent  that  started  this  activity  
Intent  intent  =  
getIntent
();  
Uri  data  =  
intent.getData
();  
//  Figure  out  what  to  do  based  on  the  intent  type  
if  (
intent.getType
().
indexOf
("image/")  !=  -­‐1)  {  
               //  Handle  intents  with  image  data  ...  
}    
else  if  (
intent.getType
().equals("text/plain"))  {  
               //  Handle  intents  with  text  …  
 }  
Handle  Intent  from  other  App
[3]  
//  create  a  intent  for  result  
Intent  result  =  new  
Intent("
com.example.RESULT_ACTION
",  
Uri.parse
("content://
result_uri
");  
//  set  the  result  
setResult
(
Activity.RESULT_OK
,  result);  
//  close  and  return  to  the  caller  
finish();  
Return  a  Result
[3]  
Use  customized  app  in  Contacts  
[1]  Android  
API  Guide:  Camera  
http://developer.android.com/guide/topics/media/camera.html
 
[2]  Android  API  Reference  for  
SurfaceView
 
http://developer.android.com/reference/android/view/
SurfaceView.html
 
[3]  Android  API  Guide:  Allowing  Other  Apps  to  Start  Your  Activity  
http://developer.android.com/training/basics/intents/filters.html
 
[4]  Android  Recipes  A  Problem-­‐Solution  Approach  
Chapter  4  Interacting  with  Device  Hardware  and  Media  
 
 
References