0
Android Camera                       the making of                               MarsJUG                       Aix en Prov...
Claude Falguière                      Architecte Technique Valtech                      http://cfalguiere.wordpress.com   ...
Objectif  questions           apprendre                      gadget fun pour Devoxx                      alimenter un hack...
IDE                      ADT : Eclipse + Plugins ADT + SDK                      Eclipse                      http://develo...
IDE                      ADT : Eclipse + Plugins ADT + SDK                      Plugins                      http://develo...
IDE                      ADT : Eclipse + Plugins ADT + SDK                      Platform Tools                      http:/...
IDE                 Android Virtual Device (AVD)@cfalguierejeudi 6 décembre 12
Hello               Hello World                       onCreate                       onPause                       onResum...
Hello                      Activity        GroupView                  Hello World                                       (l...
Camera                         SurfaceHolder                      Camera                                   (layout)       ...
Camera                         SurfaceHolder                      Camera                                   (layout)       ...
Camera                    open                            release                                         Camera          ...
Camera                      Activity   RelativeLayout                                       FrameLayout                   ...
Cameralayout/main_activity.xml                      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/    ...
Camera              MainActivity.java                      	   protected void onCreate(Bundle savedInstanceState) {       ...
Camera                   manifest.xml                      <?xml version="1.0" encoding="utf-8"?>                      <ma...
Camera                   manifest.xml                      <?xml version="1.0" encoding="utf-8"?>                      <ma...
Camera                                            SurfaceView                      RelativeLayout                      Ori...
open                      setCameraDisplay (holder)                            startPreview                           take...
Photo                      layout/main_activity.xml                               <Button                                 ...
Photo                   whenSave                                                   takePicture                            ...
Photo                   MainActivity.java                           private SoundPool mSoundPool;                         ...
Photo                   PictureCallback                      	    public void onPictureTaken(byte[] data, Camera camera) {...
Photo               PictureCallback                      	   private void addPictureToGalery(String path) {               ...
Incrustation                      Activity    RelativeLayout                                        FrameLayout           ...
Incrustation                      onDraw           DuchessSprite                                                       Can...
Incrustation                      onDraw                 DuchessSprite                                      draw          ...
Incrustation        DuchessSprite.java                      	   private Bitmap bitmap;   // the actual bitmap             ...
Incrustation        DuchessSprite.java                      	   private Bitmap bitmap;   // the actual bitmap             ...
Incrustation        DuchessSprite.java                      	   private Bitmap bitmap;   // the actual bitmap             ...
Incrustation        DuchessSprite.java                      	   private Bitmap bitmap;   // the actual bitmap             ...
DrawView.java                      public boolean onTouchEvent(MotionEvent event) {                      	                ...
Incrustation                           onTouchEvent                                                DrawView               ...
Merci  Questions           Claude Falguière                      @cfalguiere                      goo.gl/4mmJQ@cfalguierej...
@cfalguierejeudi 6 décembre 12
Lab 0                      Installer ADT                      http://developer.android.com/sdk/index.html                 ...
Lab 1               Créez un repo Git (git init)                      Créez un workspace Eclipse sur la racine            ...
Lab 2                      Affichez la caméra dans votre application                      vous aurez besoin                ...
Lab 3               Ajoutez le bouton et prennez une photo                      (Facultatif) ajoutez le son               ...
Lab 4               Ajoutez une vue ImageView custom et                      affichez Duchess                      vous aur...
Lab 5                      Ajoutez la possibilité de déplacer le sprite                      (Facultatif) affichez un feedb...
Upcoming SlideShare
Loading in...5
×

Pres android nuit de l'info v3

431

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
431
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Pres android nuit de l'info v3"

  1. 1. Android Camera the making of MarsJUG Aix en Provence - Marseille 6 Décembre 2012@cfalguierejeudi 6 décembre 12
  2. 2. Claude Falguière Architecte Technique Valtech http://cfalguiere.wordpress.com Duchess France, Paris JUG, Devoxx4Kids@cfalguierejeudi 6 décembre 12
  3. 3. Objectif questions apprendre gadget fun pour Devoxx alimenter un hacker space Duchess@cfalguierejeudi 6 décembre 12
  4. 4. IDE ADT : Eclipse + Plugins ADT + SDK Eclipse http://developer.android.com@cfalguierejeudi 6 décembre 12
  5. 5. IDE ADT : Eclipse + Plugins ADT + SDK Plugins http://developer.android.com@cfalguierejeudi 6 décembre 12
  6. 6. IDE ADT : Eclipse + Plugins ADT + SDK Platform Tools http://developer.android.com@cfalguierejeudi 6 décembre 12
  7. 7. IDE Android Virtual Device (AVD)@cfalguierejeudi 6 décembre 12
  8. 8. Hello Hello World onCreate onPause onResume onDestroy Activity GroupView Hello World (layout) TextView@cfalguierejeudi 6 décembre 12
  9. 9. Hello Activity GroupView Hello World (layout) Go TextView ImageView Button@cfalguierejeudi 6 décembre 12
  10. 10. Camera SurfaceHolder Camera (layout) Activity SurfaceView@cfalguierejeudi 6 décembre 12
  11. 11. Camera SurfaceHolder Camera (layout) Activity SurfaceView@cfalguierejeudi 6 décembre 12
  12. 12. Camera open release Camera Activity RelativeLayout SurfaceView SurfaceHolder surfaceCreated surfaceDestroyed surfaceChanged CameraPreview startPreview stopPreview Camera@cfalguierejeudi 6 décembre 12
  13. 13. Camera Activity RelativeLayout FrameLayout SurfaceView@cfalguiere CameraPreviewjeudi 6 décembre 12
  14. 14. Cameralayout/main_activity.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/ android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <FrameLayout android:id="@+id/cameraPreviewFrame" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > </FrameLayout> <Button android:id="@+id/saveButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:background="@drawable/camera_icon" android:onClick="whenSave" /> </RelativeLayout>@cfalguierejeudi 6 décembre 12
  15. 15. Camera MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCamera = Camera.open(); CameraPreview cameraPreview = new CameraPreview(this, mCamera); FrameLayout previewFrame = (FrameLayout) findViewById(R.id.cameraPreviewFrame); previewFrame.addView(cameraPreview); ... CameraPreview.java public CameraPreview(Context context, Camera camera) { super(context); mCamera = camera; mHolder = getHolder(); mHolder.addCallback(this); ...@cfalguierejeudi 6 décembre 12
  16. 16. Camera manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.duchescamera" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:screenOrientation="landscape"> <activity android:name="com.example.duchescamera.MainActivity" android:label="@string/app_name" > ...@cfalguierejeudi 6 décembre 12
  17. 17. Camera manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.duchescameramini2" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <!-- will make use of camera --> <uses-feature android:name="android.hardware.camera" android:required="true" /> <uses-permission android:name="android.permission.CAMERA" />@cfalguierejeudi 6 décembre 12
  18. 18. Camera SurfaceView RelativeLayout Orientation par Orientation par défaut du device défaut de la camera@cfalguierejeudi 6 décembre 12
  19. 19. open setCameraDisplay (holder) startPreview takePicture stopPreview release@cfalguierejeudi 6 décembre 12
  20. 20. Photo layout/main_activity.xml <Button android:id="@+id/saveButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:background="@drawable/camera_icon" android:onClick="whenSave" />@cfalguierejeudi 6 décembre 12
  21. 21. Photo whenSave takePicture Activity Camera onPictureTaken onShutter ShutterCallback RawCallback PictureCallback «Click» générer le fichier MainActivity.java public void whenSave(View view) { mCamera.takePicture(shutterCallback, null, jpegPictureCallback); }@cfalguierejeudi 6 décembre 12
  22. 22. Photo MainActivity.java private SoundPool mSoundPool; private int mShutterSoundId; private float mShutterSoundVolume = 0.5f; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSoundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0); mShutterSoundId = mSoundPool.load(this, R.raw.camera_click, 1); ... public void whenSave(View view) { Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback( public void onShutter() { mSoundPool.play(mShutterSoundId, mShutterSoundVolume, mShutterSoundVolume, 1, 0, 1); } }; mCamera.takePicture(shutterCallback, null, mJpegPictureCallback); ...@cfalguierejeudi 6 décembre 12
  23. 23. Photo PictureCallback public void onPictureTaken(byte[] data, Camera camera) { try { Bitmap photo = BitmapFactory.decodeByteArray(data, 0,data.length); // Create a new, empty bitmap with the original size. Bitmap bitmap = Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), photo.getConfig()); Canvas canvas = new Canvas(bitmap); canvas.drawBitmap(photo, 0, 0, null); // save file File pictureFile = getOutputMediaFile(); FileOutputStream fos = new FileOutputStream(pictureFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); addPictureToGalery(pictureFile.getPath()); } catch (Exception e) { Log.d(TAG, "ERROR Could not save picture: " + e.getMessage()); } }@cfalguierejeudi 6 décembre 12
  24. 24. Photo PictureCallback private void addPictureToGalery(String path) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(new File(path)); mediaScanIntent.setData(contentUri); mActivity.sendBroadcast(mediaScanIntent); }@cfalguierejeudi 6 décembre 12
  25. 25. Incrustation Activity RelativeLayout FrameLayout ImageView SurfaceView onDraw DrawView CameraPreview@cfalguierejeudi 6 décembre 12
  26. 26. Incrustation onDraw DuchessSprite Canvas DrawPreview draw y x@cfalguierejeudi 6 décembre 12
  27. 27. Incrustation onDraw DuchessSprite draw DrawPreview Canvas draw MoveFeedbackSprite draw RotationFeedbackSprite@cfalguierejeudi 6 décembre 12
  28. 28. Incrustation DuchessSprite.java private Bitmap bitmap; // the actual bitmap public void draw(Canvas canvas, float ratio) { Matrix matrix = new Matrix(); float s = 1 / bitmapScale; int cw = Math.round(bitmap.getWidth() / 2); int ch = Math.round(bitmap.getHeight() / 2); canvas.drawBitmap(bitmap, matrix, null); }@cfalguierejeudi 6 décembre 12
  29. 29. Incrustation DuchessSprite.java private Bitmap bitmap; // the actual bitmap public void draw(Canvas canvas, float ratio) { Matrix matrix = new Matrix(); float s = 1 / bitmapScale; int cw = Math.round(bitmap.getWidth() / 2); int ch = Math.round(bitmap.getHeight() / 2); matrix.setScale(s, s, cw, ch); canvas.drawBitmap(bitmap, matrix, null); }@cfalguierejeudi 6 décembre 12
  30. 30. Incrustation DuchessSprite.java private Bitmap bitmap; // the actual bitmap public void draw(Canvas canvas, float ratio) { Matrix matrix = new Matrix(); float s = 1 / bitmapScale; int cw = Math.round(bitmap.getWidth() / 2); int ch = Math.round(bitmap.getHeight() / 2); matrix.setScale(s, s, cw, ch); matrix.postTranslate(centerX - cw, centerY - ch); canvas.drawBitmap(bitmap, matrix, null); }@cfalguierejeudi 6 décembre 12
  31. 31. Incrustation DuchessSprite.java private Bitmap bitmap; // the actual bitmap public void draw(Canvas canvas, float ratio) { Matrix matrix = new Matrix(); float s = 1 / bitmapScale; int cw = Math.round(bitmap.getWidth() / 2); int ch = Math.round(bitmap.getHeight() / 2); matrix.setScale(s, s, cw, ch); matrix.postTranslate(centerX - cw, centerY - ch); matrix.postScale(ratio, ratio); canvas.drawBitmap(bitmap, matrix, null); }@cfalguierejeudi 6 décembre 12
  32. 32. DrawView.java public boolean onTouchEvent(MotionEvent event) { final int action = event.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { mDuchess.handleActionDown((int)event.getX(), (int)event.getY()); // update touched break; } case MotionEvent.ACTION_MOVE: { if (mDuchess.isTouched()) { mDuchess.setCenterX((int)event.getX()); mDuchess.setCenterY((int)event.getY()); invalidate(); } break; } case MotionEvent.ACTION_UP: { if (mDuchess.isTouched()) { mDuchess.setTouched(false); } reak; } } return true; }@cfalguierejeudi 6 décembre 12
  33. 33. Incrustation onTouchEvent DrawView public DrawView(Context context, DuchessSprite duchess) { super(context); ... // make the Panel focusable so it can handle events setFocusable(true); setFocusableInTouchMode(true); } @cfalguierejeudi 6 décembre 12
  34. 34. Merci Questions Claude Falguière @cfalguiere goo.gl/4mmJQ@cfalguierejeudi 6 décembre 12
  35. 35. @cfalguierejeudi 6 décembre 12
  36. 36. Lab 0 Installer ADT http://developer.android.com/sdk/index.html Installer git (préférable) http://developer.android.com@cfalguierejeudi 6 décembre 12
  37. 37. Lab 1 Créez un repo Git (git init) Créez un workspace Eclipse sur la racine du repo Créez un projet dans Eclipse • New «Android Application Project» • (Facultatif) choisissez l’icone Photo dans Clipart • une activité MainActivity par défaut Lancez l’application dans le simulateur • Créez un AVD Galaxy Nexus • Exécutez dans le simulateur Lancez l’application sur un device connecté@cfalguierejeudi 6 décembre 12
  38. 38. Lab 2 Affichez la caméra dans votre application vous aurez besoin • de modifier le layout (RelativeLayout et FrameLayout) • d’implémenter un SurfaceView • de la feature android.hardware.camera • de la permission android.permission.CAMERA • de corriger l’orientation@cfalguierejeudi 6 décembre 12
  39. 39. Lab 3 Ajoutez le bouton et prennez une photo (Facultatif) ajoutez le son vous aurez besoin • du composant graphique Button • de l’icône du bouton : drawable/camera_icon.png • de l’implémentation du PictureCallback • de la permission android.permission.WRITE_EXTERNAL_STORAGE • du fichier son camera_click.ogg (Facultatif) • de la classe SoundPool (Facultatif)@cfalguierejeudi 6 décembre 12
  40. 40. Lab 4 Ajoutez une vue ImageView custom et affichez Duchess vous aurez besoin • de l’image du sprite : drawable/ duchessfr_shadow.png • de l’implémentation du Sprite DuchessSprite@cfalguierejeudi 6 décembre 12
  41. 41. Lab 5 Ajoutez la possibilité de déplacer le sprite (Facultatif) affichez un feedback visuel vous aurez besoin • de l’implémentation du Sprite DragFeedbackSprite (Facultatif)@cfalguierejeudi 6 décembre 12
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×