Camera Objekt speichert Bild nicht?

A

audacity363

Gast
Guten Tag,
ich versuche mich gerade etwas in die Camera API einzufuchsen. An sich scheint er auch etwas zu machen, nur speichert er kein Bild.
Habe folgenden Code zum laufen gebracht:
MainActivity:
Code:
public class MainActivity extends Activity {
	
	  private Camera camera;
	  private int cameraId = 0;

	  @Override
	  public void onCreate(Bundle savedInstanceState) 
	  {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.activity_main);

	    // do we have a camera?
	    if (!getPackageManager()
	        .hasSystemFeature(PackageManager.FEATURE_CAMERA)) 
	    {
	      Toast.makeText(this, "No camera on this device", 
	    		  		Toast.LENGTH_LONG)
	          .show();
	    } 
	    else 
	    {
	      cameraId = findFrontFacingCamera();
	      if (cameraId < 0) 
	      {
	        Toast.makeText(this, "No front facing camera found.",
	            Toast.LENGTH_LONG).show();
	      } 
	      else 
	      {
	    	System.out.println("CameaId:" + cameraId);
	        camera = Camera.open(cameraId);
	      }
	    }
	  }

	  
	  public void onClick(View view) 
	  {
		System.out.println("On Click Event");
	    camera.takePicture(null, null, 
	        new PhotoHandler(getApplicationContext()));
	    System.out.println("after Take picture");
	    }

	  private int findFrontFacingCamera() 
	  {
	    int cameraId = -1;
	    // Search for the front facing camera
	    int numberOfCameras = Camera.getNumberOfCameras();
	    for (int i = 0; i < numberOfCameras; i++) 
	    {
	      CameraInfo info = new Camera.CameraInfo();
	      Camera.getCameraInfo(i, info);
	      if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 
	      {
	    	System.out.println("Camera found");
	        cameraId = i;
	        break;
	      }      
	    }
	    return cameraId;
	  }

	  @Override
	  protected void onPause() 
	  {
	    if (camera != null) 
	    {
	      camera.release();
	      camera = null;
	    }
	    super.onPause();
	  }
}

PhotoHandler:
Code:
public class PhotoHandler implements PictureCallback {

  private final Context context;

  public PhotoHandler(Context context) 
  {
    this.context = context;
    System.out.println("in Photo Handler");
  }

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

    File pictureFileDir = getDir();

    if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) 
    {
      System.out.println("Can't create directory to save image.");
      Toast.makeText(context, "Can't create directory to save image.",
          Toast.LENGTH_LONG).show();
      return;
    }

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
    String date = dateFormat.format(new Date());
    String photoFile = "Picture_" + date + ".jpg";

    String filename = pictureFileDir.getPath() + File.separator 
    										   + photoFile;
    System.out.println("Filename: " + filename);
    Log.v("Camera", "Filename: "+ filename);

    File pictureFile = new File(filename);

    try 
    {
      FileOutputStream fos = new FileOutputStream(pictureFile);
      fos.write(data);
      fos.close();
      System.out.println("Photo saved");
      Toast.makeText(context, "New Image saved:" + photoFile,
          Toast.LENGTH_LONG).show();
    } 
    catch (Exception error) 
    {
    	System.out.println("File" + filename + "not saved: " + 
    			error.getMessage());
      Toast.makeText(context, "Image could not be saved.",
          Toast.LENGTH_LONG).show();
    }
  }

  private File getDir() {
    File sdDir = Environment
      .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    return new File(sdDir, "CameraAPIDemo");
  }
}

Den Code habe ich mir halb zusammen gegoogelt und halb selber geschrieben. An sich verstehe ich den Code, nur beim Speichern komme ich noch nicht so ganz dahinter. Bei takePicture wird ja der PhotoHandler übergeben, der eigentlich den Speicherteil übernehmen sollte.
Ich habe allerdings das Gefühl, dass das "onPictureTaken" nicht getriggert wird.
Habe ich da jetzt ein Denkfehler oder funktioniert es wirklich nicht so wie es sollte?
 
Okey Sorry, dass ich jetzt erst Antworte aber ich hatte keine Zeit.

Ja eine Doku habe ich gelesen, aber nicht diese. Gut habe mein Code nun aktualisiert und trotzdem werden die PictureCallbacks nicht aufgerufen:
Code:
package com.example.test1;

import java.io.IOException;

import android.support.v7.app.ActionBarActivity;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.View;

public class MainActivity extends ActionBarActivity {

	Camera cam;
	Parameters parma;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		try
		{
			cam = Camera.open(0);
			System.out.println("Camera open");
		}
		catch(RuntimeException e)
		{
			System.out.println("Camera not open");
		}
		parma = cam.getParameters();
		cam.setParameters(parma);
		
		SurfaceView view = new SurfaceView(this);
		try 
		{
			cam.setPreviewDisplay(view.getHolder());
			cam.startPreview();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
			System.out.println("Fail start Preview");
		}
		
		
		
		
	}
	
	public void onClick(View view)
	{
		System.out.println("On Click");
		cam.takePicture(shutterCallback, rawCallback, jpgCallback);
		System.out.println("Nach Picture Taken");
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	PictureCallback jpgCallback = new PictureCallback()
	{
		public void onPictureTaken(byte[] data, Camera camera)
		{
			System.out.println("OnPictureTaken");
			camera.stopPreview();
			camera.release();
		}
	};
	
	ShutterCallback shutterCallback = new ShutterCallback()
	{
		public void onShutter()
		{
			System.out.println("On Shutter");
		}
		
	};
	
	PictureCallback rawCallback = new PictureCallback()
	{
		public void onPictureTaken(byte[] data, Camera camera)
		{
			System.out.println("OnPictureTaken - raw");
			camera.stopPreview();
			camera.release();
		}
	};
	
	
}
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.051
jogimuc
J
SaniMatthias
Antworten
19
Aufrufe
963
swa00
swa00
F
Antworten
4
Aufrufe
912
swa00
swa00
Zurück
Oben Unten