Hallo zusammen,
ich versuche eien KameraApp zu erstellen, welche bereits bei Knopfdruck die auf dem Gerät vorinstallierte CameraApp nutzt um ein Foto zu machen.
Das Resultat wird bereits übernommen und in der Activity in einem "ImageView" angezeigt. Was allerdings nicht klappt, dass das gemachte Foto als Datei (in Originalgröße) abgelegt wird.
Hier der Code, den ich von der Seite https://developer.android.com/ genommen und etwas angepasst/ergänzt habe.
Das Problem ist, dass ich nicht genau verstehe, wie/wo ich "dispatchTakePictureIntent()" einsetzen bzw. nutzen soll.
Hat jemand ne Idee?
Egal wo ich "dispatchTakePictureIntent()" aufrufe, kommt es über die Zeile "(takePictureIntent.resolveActivity(getPackageManager()) != null)" nicht weg. Bedingung nicht erfüllt.
ich versuche eien KameraApp zu erstellen, welche bereits bei Knopfdruck die auf dem Gerät vorinstallierte CameraApp nutzt um ein Foto zu machen.
Das Resultat wird bereits übernommen und in der Activity in einem "ImageView" angezeigt. Was allerdings nicht klappt, dass das gemachte Foto als Datei (in Originalgröße) abgelegt wird.
Hier der Code, den ich von der Seite https://developer.android.com/ genommen und etwas angepasst/ergänzt habe.
Java:
package com.example.archivator;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
//https://developer.android.com/training/camera/photobasics
public class MainActivity extends AppCompatActivity {
// Define the pic id
private static final int CAMERA_REQUEST = 1888;
private static final int MY_CAMERA_PERMISSION_CODE = 100;
// Define the button and imageview type variable
Button cmdStartCamera;
ImageView cameraImage;
String currentPhotoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hideSystemUI();
cmdStartCamera = findViewById(R.id.cmdStartCamera);
cameraImage = findViewById(R.id.cameraImage);
cmdStartCamera.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
{
requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE);
}
else
{
System.out.println("Kamera Klick");
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
System.out.println("Bildvorschau gestartet");
Bundle extras = data.getExtras();
Bitmap photo = (Bitmap) data.getExtras().get("data");
cameraImage.setImageBitmap(photo);
dispatchTakePictureIntent();
} else {cameraImage.setImageResource(0);}
}
static final int REQUEST_IMAGE_CAPTURE = 1;
private void dispatchTakePictureIntent() {
System.out.println("dispatchTakePictureIntent");
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
System.out.println("dispatchTakePictureIntent - speichere Bild");
File photoFile = null;
try {
photoFile = createImageFile();
System.out.println(photoFile);
} catch (IOException ex) {
// Error occurred while creating the File
System.out.println(ex.getMessage());
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.android.fileprovider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
} else {System.out.println("dispatchTakePictureIntent - Foto nicht gespeichert");}
}
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("HHmm").format(new Date());
String imageFileName = "tmpImage"; // + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//File storageDir = new File("/storage/emulated/0/Pictures/");
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = image.getAbsolutePath();
return image;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_CAMERA_PERMISSION_CODE)
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
else
{
Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
//This is used to hide/show 'Status Bar' & 'System Bar'. Swip bar to get it as visible.
View decorView = getWindow().getDecorView();
if (hasFocus) {
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
public void hideSystemUI() {
// Enables regular immersive mode.
// For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
// Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE
// Set the content to appear under the system bars so that the
// content doesn't resize when the system bars hide and show.
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// Hide the nav bar and status bar
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
Das Problem ist, dass ich nicht genau verstehe, wie/wo ich "dispatchTakePictureIntent()" einsetzen bzw. nutzen soll.
Hat jemand ne Idee?
Egal wo ich "dispatchTakePictureIntent()" aufrufe, kommt es über die Zeile "(takePictureIntent.resolveActivity(getPackageManager()) != null)" nicht weg. Bedingung nicht erfüllt.