Zusätzlich eintragen der Berechtigungen und der extra Klasse KameraAktivitaet im Manifest eingetragenKamera
@@ -25,6 +25,7 @@ android { | |||
sourceCompatibility JavaVersion.VERSION_1_8 | |||
targetCompatibility JavaVersion.VERSION_1_8 | |||
} | |||
namespace 'com.example.greenwatch' | |||
} | |||
dependencies { | |||
@@ -35,4 +36,10 @@ dependencies { | |||
testImplementation 'junit:junit:4.13.2' | |||
androidTestImplementation 'androidx.test.ext:junit:1.1.5' | |||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' | |||
def camerax_version = "1.2.3" | |||
implementation "androidx.camera:camera-camera2:${camerax_version}" | |||
implementation "androidx.camera:camera-lifecycle:${camerax_version}" | |||
implementation "androidx.camera:camera-view:${camerax_version}" | |||
} |
@@ -1,6 +1,14 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
package="com.example.greenwatch"> | |||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> | |||
<uses-permission android:name="android.permission.RECORD_AUDIO"/> | |||
<uses-permission android:name="android.permission.CAMERA"/> | |||
<uses-permission android:name="android.permission.BLUETOOTH"/> | |||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> | |||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> | |||
<uses-permission android:name="android.permission.INTERNET" /> | |||
<uses-feature android:name="android.hardware.camera"/> | |||
<application | |||
android:allowBackup="true" | |||
@@ -18,6 +26,9 @@ | |||
<category android:name="android.intent.category.LAUNCHER" /> | |||
</intent-filter> | |||
</activity> | |||
<activity android:name=".KameraAktivitaet" /> | |||
</application> | |||
</manifest> |
@@ -1,4 +0,0 @@ | |||
package com.example.greenwatch; | |||
public class Kamera { | |||
} |
@@ -0,0 +1,59 @@ | |||
package com.example.greenwatch; | |||
import android.graphics.ImageFormat; | |||
import android.media.Image; | |||
import android.os.Bundle; | |||
import android.util.Size; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import androidx.camera.core.CameraSelector; | |||
import androidx.camera.core.ImageAnalysis; | |||
import androidx.camera.core.Preview; | |||
import androidx.camera.lifecycle.ProcessCameraProvider; | |||
import androidx.camera.view.PreviewView; | |||
import androidx.core.content.ContextCompat; | |||
import com.google.common.util.concurrent.ListenableFuture; | |||
import java.util.concurrent.ExecutionException; | |||
public class KameraAktivitaet extends AppCompatActivity { | |||
private PreviewView previewView; | |||
@Override | |||
protected void onCreate(Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_demo_kamera2_nebenaktivitaet); | |||
previewView = findViewById(R.id.previewView); | |||
final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this); | |||
cameraProviderFuture.addListener(() -> { | |||
try { | |||
bindImageAnalysis(cameraProviderFuture.get()); | |||
} catch (ExecutionException | InterruptedException e) { | |||
e.printStackTrace(); | |||
} | |||
}, ContextCompat.getMainExecutor(this)); | |||
} | |||
private void bindImageAnalysis(ProcessCameraProvider cameraProvider) { | |||
ImageAnalysis.Builder builder = new ImageAnalysis.Builder(); | |||
builder.setTargetResolution(new Size(640, 480)); | |||
builder.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST); | |||
ImageAnalysis imageAnalysis = builder.build(); | |||
imageAnalysis.setAnalyzer( | |||
ContextCompat.getMainExecutor(this), | |||
imageProxy -> { | |||
int imageFormat = imageProxy.getFormat(); | |||
if (imageFormat == ImageFormat.YUV_420_888) { | |||
Image image = imageProxy.getImage(); | |||
} | |||
imageProxy.close(); | |||
}); | |||
Preview preview = new Preview.Builder().build(); | |||
CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build(); | |||
preview.setSurfaceProvider(previewView.getSurfaceProvider()); | |||
cameraProvider.bindToLifecycle(this, cameraSelector, imageAnalysis, preview); | |||
} | |||
} | |||
@@ -1,14 +1,40 @@ | |||
package com.example.greenwatch; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import android.content.Intent; | |||
import android.content.pm.PackageManager; | |||
import android.os.Bundle; | |||
import android.widget.Button; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import androidx.core.app.ActivityCompat; | |||
import androidx.core.content.ContextCompat; | |||
public class MainActivity extends AppCompatActivity { | |||
private static final int RECHTEANFORDERUNG_KAMERA = 10; | |||
@Override | |||
protected void onCreate(Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_main); | |||
Button kameraStarten = findViewById(R.id.button_camera); | |||
kameraStarten.setOnClickListener(v -> { | |||
if (istZugriffAufKameraErlaubt()) { | |||
starteKameraAktivitaet(); | |||
} else { | |||
zugriffAufKameraAnfordern(); | |||
} | |||
}); | |||
} | |||
private boolean istZugriffAufKameraErlaubt() { | |||
return ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; | |||
} | |||
private void zugriffAufKameraAnfordern() { | |||
ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.CAMERA}, RECHTEANFORDERUNG_KAMERA); | |||
} | |||
private void starteKameraAktivitaet() { | |||
startActivity(new Intent(this, KameraAktivitaet.class)); | |||
} | |||
} |
@@ -6,13 +6,17 @@ | |||
android:layout_height="match_parent" | |||
tools:context=".MainActivity"> | |||
<TextView | |||
<Button | |||
android:id="@+id/button_camera" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="Hello World!" | |||
android:text="Kamera starten" | |||
app:layout_constraintBottom_toBottomOf="parent" | |||
app:layout_constraintLeft_toLeftOf="parent" | |||
app:layout_constraintRight_toRightOf="parent" | |||
app:layout_constraintTop_toTopOf="parent" /> | |||
app:layout_constraintEnd_toEndOf="parent" | |||
app:layout_constraintHorizontal_bias="0.129" | |||
app:layout_constraintStart_toStartOf="parent" | |||
app:layout_constraintTop_toTopOf="parent" | |||
app:layout_constraintVertical_bias="0.931" /> | |||
</androidx.constraintlayout.widget.ConstraintLayout> |
@@ -1,7 +1,7 @@ | |||
// Top-level build file where you can add configuration options common to all sub-projects/modules. | |||
plugins { | |||
id 'com.android.application' version '7.1.3' apply false | |||
id 'com.android.library' version '7.1.3' apply false | |||
id 'com.android.application' version '8.0.0' apply false | |||
id 'com.android.library' version '8.0.0' apply false | |||
} | |||
task clean(type: Delete) { |
@@ -18,4 +18,6 @@ android.useAndroidX=true | |||
# Enables namespacing of each library's R class so that its R class includes only the | |||
# resources declared in the library itself and none from the library's dependencies, | |||
# thereby reducing the size of the R class for that library | |||
android.nonTransitiveRClass=true | |||
android.nonTransitiveRClass=true | |||
android.defaults.buildfeatures.buildconfig=true | |||
android.nonFinalResIds=false |
@@ -1,6 +1,6 @@ | |||
#Thu May 11 14:50:16 CEST 2023 | |||
distributionBase=GRADLE_USER_HOME | |||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip | |||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip | |||
distributionPath=wrapper/dists | |||
zipStorePath=wrapper/dists | |||
zipStoreBase=GRADLE_USER_HOME |