Note that there are some explanatory texts on larger screens.

plurals
  1. POHow do I save image from Camera?
    primarykey
    data
    text
    <p>Here is my code:</p> <pre><code>package com.commonsware.android.skeleton; import android.app.Activity; import android.content.Context; import android.hardware.Camera; import android.hardware.Camera.*; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Display; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; // ---------------------------------------------------------------------- public class SimpleBulbActivity extends Activity { private Preview mPreview; private static final String TAG = "CameraDemo"; FrameLayout preview; Camera mCamera; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Hide the window title. requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); } protected void onResume() { super.onResume(); //Setup the FrameLayout with the Camera Preview Screen mPreview = new Preview(this); preview = (FrameLayout)findViewById(R.id.preview); preview.addView(mPreview); } public void snap() { mCamera.takePicture(shutterCallback, rawCallback, jpegCallback); } ShutterCallback shutterCallback = new ShutterCallback() { public void onShutter() { Log.d(TAG, "onShutter'd"); } }; PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { Log.d(TAG, "onPictureTaken - raw"); } }; PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera _camera) { FileOutputStream outStream = null; try { // write to local sandbox file system // outStream = // CameraDemo.this.openFileOutput(String.format("%d.jpg", // System.currentTimeMillis()), 0); // Or write to sdcard outStream = new FileOutputStream(String.format( "/sdcard/%d.jpg", System.currentTimeMillis())); outStream.write(data); outStream.close(); Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } Log.d(TAG, "onPictureTaken - jpeg"); } }; // ---------------------------------------------------------------------- class Preview extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; Preview(Context context) { super(context); // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw. mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); mCamera.setPreviewCallback(new PreviewCallback() { public void onPreviewFrame(byte[] data, Camera arg1) { FileOutputStream outStream = null; try { outStream = new FileOutputStream(Environment.getExternalStorageDirectory().toString()); outStream.write(data); outStream.close(); Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } Preview.this.invalidate(); } }); } catch (IOException e) { mCamera.release(); mCamera = null; e.printStackTrace(); } } public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return, so stop the preview. // Because the CameraDevice object is not a shared resource, it's very // important to release it when the activity is paused. mCamera.stopPreview(); mCamera.release(); mCamera = null; } private Size getOptimalPreviewSize(List&lt;Size&gt; sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.05; double targetRatio = (double) w / h; if (sizes == null) return null; Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; // Try to find an size match aspect ratio and size for (Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) &gt; ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) &lt; minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } // Cannot find the one match the aspect ratio, ignore the requirement if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.height - targetHeight) &lt; minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // Now that the size is known, set up the camera parameters and begin // the preview. Camera.Parameters parameters = mCamera.getParameters(); List&lt;Size&gt; sizes = parameters.getSupportedPreviewSizes(); Size optimalSize = getOptimalPreviewSize(sizes, w, h); Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); if(display.getRotation() == Surface.ROTATION_0) { parameters.setPreviewSize(optimalSize.height, optimalSize.width); mCamera.setDisplayOrientation(90); } if(display.getRotation() == Surface.ROTATION_90) { parameters.setPreviewSize(optimalSize.width, optimalSize.height); } if(display.getRotation() == Surface.ROTATION_180) { parameters.setPreviewSize(optimalSize.width, optimalSize.height); } if(display.getRotation() == Surface.ROTATION_270) { parameters.setPreviewSize(optimalSize.width, optimalSize.height); mCamera.setDisplayOrientation(0); } mCamera.setParameters(parameters); mCamera.startPreview(); } } } </code></pre> <p>Okay I have modified my code a bit.</p> <p>I have this in my main layout:</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layout"&gt; &lt;TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Camera Demo" android:textSize="24sp" /&gt; &lt;FrameLayout android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent"&gt; &lt;FrameLayout android:id="@+id/preview" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent"&gt; &lt;/FrameLayout&gt; &lt;ImageView android:src="@drawable/litbulb" android:layout_width="match_parent" android:layout_height="112dip" /&gt; &lt;/FrameLayout&gt; &lt;Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/buttonClick" android:text="Snap!" android:layout_gravity="center"&gt;&lt;/Button&gt; &lt;/LinearLayout&gt; </code></pre> <p>When I click the "Snap!" or <code>buttonClick</code> button, it's supposed to capture and save the image, but it's not. Can anyone help me modify this code so it does?</p> <p>Also, it crashes every time I leave the app. Here is the relevant logcat data:</p> <pre><code>12-21 13:30:47.820: ERROR/AndroidRuntime(3906): FATAL EXCEPTION: main 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): java.lang.RuntimeException: Method called after release() 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at android.hardware.Camera.setHasPreviewCallback(Native Method) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at android.hardware.Camera.access$600(Camera.java:114) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:519) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at android.os.Handler.dispatchMessage(Handler.java:99) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at android.os.Looper.loop(Looper.java:123) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at android.app.ActivityThread.main(ActivityThread.java:4627) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at java.lang.reflect.Method.invokeNative(Native Method) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at java.lang.reflect.Method.invoke(Method.java:521) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 12-21 13:30:47.820: ERROR/AndroidRuntime(3906): at dalvik.system.NativeStart.main(Native Method) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload