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:
PhotoHandler:
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?
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?