it-swarm.com.de

Fotografieren mit eingeschalteter Kamera Android programmgesteuert)

Ich habe eine App mit einem Button erstellt und für diesen Button onClickListener geschrieben. Ich habe mehrere Beispielcodebeispiele ausprobiert, von denen keines funktioniert hat. Sie alle rufen die Kamera-App Android auf und machen keine Fotos. Ich möchte einen Code, den ich in meinen onClickListener einfügen kann. Wenn ich also die Taste auf dem Bildschirm drücke, wird ein Bild aufgenommen .

Wie kann ich die Kamera dazu bringen, ein Bild aufzunehmen, wenn ich eine Taste in einer Android Aktivität drücke?

56
Kevik

Schauen Sie sich den folgenden Demo-Code an.

Hier ist Ihre XML-Datei für die Benutzeroberfläche,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <Button
        Android:id="@+id/btnCapture"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Camera" />

</LinearLayout>

Und hier ist Ihre Java class Datei,

public class CameraDemoActivity extends Activity {
    int TAKE_PHOTO_CODE = 0;
    public static int count = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Here, we are making a folder named picFolder to store
        // pics taken by the camera using this application.
        final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/picFolder/";
        File newdir = new File(dir);
        newdir.mkdirs();

        Button capture = (Button) findViewById(R.id.btnCapture);
        capture.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                // Here, the counter will be incremented each time, and the
                // picture taken by camera will be stored as 1.jpg,2.jpg
                // and likewise.
                count++;
                String file = dir+count+".jpg";
                File newfile = new File(file);
                try {
                    newfile.createNewFile();
                }
                catch (IOException e)
                {
                }

                Uri outputFileUri = Uri.fromFile(newfile);

                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

                startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
            Log.d("CameraDemo", "Pic saved");
        }
    }
}

Anmerkung:

Geben Sie die folgenden Berechtigungen in Ihrer Manifestdatei an:

<uses-permission Android:name="Android.permission.CAMERA"/>

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
97
Mehul Joisar

Es gibt zwei Möglichkeiten, ein Foto aufzunehmen:

1 - Verwenden einer Absicht, um ein Foto zu machen

2 - Verwenden der Kamera-API

Ich denke, Sie sollten den zweiten Weg verwenden und es gibt ein Beispielcode hier für zwei von ihnen.

29
hm1984ir

Sie können die Magical Take Photo-Bibliothek verwenden.

1. versuche es mit compile in gradle

compile 'com.frosquivel:magicaltakephoto:1.0'

2. Sie benötigen diese Berechtigung in Ihrer manifest.xml

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.CAMERA"/>

. Instanz der Klasse wie folgt

// "this" ist der aktuelle Aktivitätsparameter

MagicalTakePhoto magicalTakePhoto =  new MagicalTakePhoto(this,ANY_INTEGER_0_TO_4000_FOR_QUALITY);

4. Wenn Sie ein Bild aufnehmen möchten, verwenden Sie die Methode

magicalTakePhoto.takePhoto("my_photo_name");

5. Wenn Sie ein Bild im Gerät auswählen müssen, versuchen Sie es mit der Methode:

magicalTakePhoto.selectedPicture("my_header_name");

6. Sie müssen die Methode onActivityResult der Aktivität oder des Fragments wie folgt überschreiben:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     magicalTakePhoto.resultPhoto(requestCode, resultCode, data);

     // example to get photo
     // imageView.setImageBitmap(magicalTakePhoto.getMyPhoto());
}

Hinweis: Nur mit dieser Bibliothek können Sie Bilder auf dem Gerät aufnehmen und auswählen. Verwenden Sie dazu eine minimale API 15.

5
fabian7593

Nehmen Sie das Bild auf und speichern Sie es im gewünschten Ordner

 //Global Variables
   private static final int CAMERA_IMAGE_REQUEST = 101;
    private String imageName;

Nehmen Sie die Bildfunktion auf

 public void captureImage() {

            // Creating folders for Image
            String imageFolderPath = Environment.getExternalStorageDirectory().toString()
                    + "/AutoFare";
            File imagesFolder = new File(imageFolderPath);
            imagesFolder.mkdirs();

            // Generating file name
            imageName = new Date().toString() + ".png";

            // Creating image here
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imageFolderPath, imageName)));
            startActivityForResult(takePictureIntent,
                    CAMERA_IMAGE_REQUEST);

        }

Broadcast new image added else Bild wird in der Bildergalerie nicht angezeigt

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
                // TODO Auto-generated method stub
                super.onActivityResult(requestCode, resultCode, data);

                if (resultCode == Activity.RESULT_OK && requestCode == CAMERA_IMAGE_REQUEST) {

                    Toast.makeText(getActivity(), "Success",
                            Toast.LENGTH_SHORT).show();

 //Scan new image added
                    MediaScannerConnection.scanFile(getActivity(), new String[]{new File(Environment.getExternalStorageDirectory()
                            + "/AutoFare/" + imageName).getPath()}, new String[]{"image/png"}, null);


 // Work in few phones
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {

                        getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(Environment.getExternalStorageDirectory()
                                + "/AutoFare/" + imageName)));

                    } else {
                        getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(Environment.getExternalStorageDirectory()
                                + "/AutoFare/" + imageName)));
                    }
                } else {
                    Toast.makeText(getActivity(), "Take Picture Failed or canceled",
                            Toast.LENGTH_SHORT).show();
                }
            }

Berechtigungen

    <uses-permission Android:name="Android.permission.CAMERA" />
    <uses-feature Android:name="Android.hardware.camera" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
2
Hitesh Sahu

Wer hierher gekommen ist, um programmgesteuert Bilder/Fotos mit der Kamera- und der Kamera2-API von Android aufzunehmen, sollte sich das Open-Source-Beispiel von Google ansehen hier .

2
Phileo99