Cloud-Lösungen der Zukunft - Testen!

Revolutionäre Cloud-Technologie, ganz ohne versteckte Kosten. Profitieren Sie von unserer Testphase und entdecken Sie umfassende Funktionen. Der Anmeldeprozess ist transparent und unkompliziert. Starten Sie jetzt Ihre Reise in die Cloud - Kostenfrei!

Android-Entwicklung: Bildaufnahme leicht gemacht

Tauchen Sie ein in die Welt der Android-Entwicklung mit unserem neuesten Blog-Beitrag! Lernen Sie, wie Sie mühelos Bilder sowohl von der Kamera als auch aus der Galerie in Ihre App integrieren und anzeigen. Von der Berechtigungsverwaltung bis hin zur Anzeige von Bildern in verschiedenen Ansichten führt Sie unser Leitfaden Schritt für Schritt durch den Prozess. Tauchen Sie ein und entdecken Sie die Möglichkeiten der Bildaufnahme in Android!

Einführung

In diesem Tutorial entwickeln wir eine Anwendung, die ein Bild entweder von der Kamera oder aus der Galerie auswählt und es in einem ImageView anzeigt. Hinweis: Der folgende Code funktioniert einwandfrei für Versionen vor Android Nougat.

Berechtigungen

Mit dem Aufkommen von Android Marshmallow müssen Berechtigungen zur Laufzeit implementiert werden. Fügen Sie die folgenden Berechtigungen in die Datei AndroidManifest.xml oberhalb des Anwendungstags ein.

<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Durch das Hinzufügen von android.hardware.camera erkennt der Play Store die Anwendung und verhindert die Installation auf Geräten ohne Kamera. Intent ist die Standardmethode, um Aktionen an eine andere Anwendung zu delegieren. Um die native Kamera zu starten, benötigt der Intent android.provider.MediaStore.ACTION_IMAGE_CAPTURE. Um ein Bild aus der Galerie auszuwählen, benötigt der Intent das folgende Argument: Intent.ACTION_GET_CONTENT. In diesem Tutorial rufen wir einen Bildauswahldialog auf, der es uns ermöglicht, ein Bild von der Kamera oder Galerie auszuwählen und es in einem runden ImageView und einem normalen ImageView anzuzeigen. Fügen Sie die folgende Abhängigkeit in die build.gradle-Datei ein:

compile 'de.hdodenhof:circleimageview:2.1.0'

Projektstruktur für die Android-Bildaufnahme

Das Layout für activity_main.xml bleibt gleich, mit Ausnahme der Änderung des Symbols für die FAB-Schaltfläche auf @android:drawable/ic_menu_camera. Der Inhalt der content_main.xml lautet wie folgt:

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/content_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    android:padding="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <RelativeLayout
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="@drawable/image_border">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop" />
    </RelativeLayout>

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/img_profile"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/profile"
        app:civ_border_width="5dp"
        app:civ_border_color="#FFFFFF"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

MainActivity.java

Der Code für MainActivity.java lautet wie folgt:

public class MainActivity extends AppCompatActivity {

    Bitmap myBitmap;
    Uri picUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(view -> startActivityForResult(getPickImageChooserIntent(), 200));
    }

    private Intent getPickImageChooserIntent() {
        Uri outputFileUri = getCaptureImageOutputUri();
        List<Intent> allIntents = new ArrayList<>();
        PackageManager packageManager = getPackageManager();

        Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
        for (ResolveInfo res : listCam) {
            Intent intent = new Intent(captureIntent);
            intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            if (outputFileUri != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            }
            allIntents.add(intent);
        }

        Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
        galleryIntent.setType("image/*");
        List<ResolveInfo> listGallery = packageManager.queryIntentActivities(galleryIntent, 0);
        for (ResolveInfo res : listGallery) {
            Intent intent = new Intent(galleryIntent);
            intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            allIntents.add(intent);
        }

        Intent mainIntent = allIntents.get(allIntents.size() - 1);
        for (Intent intent : allIntents) {
            if (intent.getComponent().getClassName().equals("com.android.documentsui.DocumentsActivity")) {
                mainIntent = intent;
                break;
            }
        }
        allIntents.remove(mainIntent);

        Intent chooserIntent = Intent.createChooser(mainIntent, "Quelle auswählen");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, allIntents.toArray(new Parcelable[0]));

        return chooserIntent;
    }

    private Uri getCaptureImageOutputUri() {
        File getImage = getExternalCacheDir();
        return getImage != null ? Uri.fromFile(new File(getImage.getPath(), "profile.png")) : null;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            ImageView imageView = findViewById(R.id.imageView);
            CircleImageView croppedImageView = findViewById(R.id.img_profile);

            if (getPickImageResultUri(data) != null) {
                picUri = getPickImageResultUri(data);
                try {
                    myBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), picUri);
                    croppedImageView.setImageBitmap(myBitmap);
                    imageView.setImageBitmap(myBitmap);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private Uri getPickImageResultUri(Intent data) {
        return data != null && data.getAction() != null && data.getAction().equals(MediaStore.ACTION_IMAGE_CAPTURE)
                ? getCaptureImageOutputUri() : data.getData();
    }
}

Testen Sie unsere Cloud-Lösungen für Android-Entwicklung

Entdecken Sie die Möglichkeiten der Android-Entwicklung mit unserer leistungsstarken Cloud-Infrastruktur. Integrieren Sie mühelos Kamera- und Galerie-Funktionen in Ihre App und profitieren Sie von unserer sicheren und zuverlässigen Cloud-Umgebung. Starten Sie jetzt Ihre kostenlose Testphase und erleben Sie die Vorteile unserer Cloud-Dienste für Entwickler.

Try for free!