Zusätzlich eintragen der Berechtigungen und der extra Klasse KameraAktivitaet im Manifest eingetragenKamera
sourceCompatibility JavaVersion.VERSION_1_8 | sourceCompatibility JavaVersion.VERSION_1_8 | ||||
targetCompatibility JavaVersion.VERSION_1_8 | targetCompatibility JavaVersion.VERSION_1_8 | ||||
} | } | ||||
namespace 'com.example.greenwatch' | |||||
} | } | ||||
dependencies { | dependencies { | ||||
testImplementation 'junit:junit:4.13.2' | testImplementation 'junit:junit:4.13.2' | ||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5' | androidTestImplementation 'androidx.test.ext:junit:1.1.5' | ||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' | 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}" | |||||
} | } |
<?xml version="1.0" encoding="utf-8"?> | <?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 | <application | ||||
android:allowBackup="true" | android:allowBackup="true" | ||||
<category android:name="android.intent.category.LAUNCHER" /> | <category android:name="android.intent.category.LAUNCHER" /> | ||||
</intent-filter> | </intent-filter> | ||||
</activity> | </activity> | ||||
<activity android:name=".KameraAktivitaet" /> | |||||
</application> | </application> | ||||
</manifest> | </manifest> |
package com.example.greenwatch; | |||||
public class Kamera { | |||||
} |
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); | |||||
} | |||||
} | |||||
package com.example.greenwatch; | package com.example.greenwatch; | ||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import android.content.Intent; | |||||
import android.content.pm.PackageManager; | |||||
import android.os.Bundle; | 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 { | public class MainActivity extends AppCompatActivity { | ||||
private static final int RECHTEANFORDERUNG_KAMERA = 10; | |||||
@Override | @Override | ||||
protected void onCreate(Bundle savedInstanceState) { | protected void onCreate(Bundle savedInstanceState) { | ||||
super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
setContentView(R.layout.activity_main); | 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)); | |||||
} | } | ||||
} | } |
android:layout_height="match_parent" | android:layout_height="match_parent" | ||||
tools:context=".MainActivity"> | tools:context=".MainActivity"> | ||||
<TextView | |||||
<Button | |||||
android:id="@+id/button_camera" | |||||
android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="Hello World!" | |||||
android:text="Kamera starten" | |||||
app:layout_constraintBottom_toBottomOf="parent" | 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> | </androidx.constraintlayout.widget.ConstraintLayout> |
// Top-level build file where you can add configuration options common to all sub-projects/modules. | // Top-level build file where you can add configuration options common to all sub-projects/modules. | ||||
plugins { | 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) { | task clean(type: Delete) { |
# Enables namespacing of each library's R class so that its R class includes only the | # 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, | # resources declared in the library itself and none from the library's dependencies, | ||||
# thereby reducing the size of the R class for that library | # 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 |
#Thu May 11 14:50:16 CEST 2023 | #Thu May 11 14:50:16 CEST 2023 | ||||
distributionBase=GRADLE_USER_HOME | 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 | distributionPath=wrapper/dists | ||||
zipStorePath=wrapper/dists | zipStorePath=wrapper/dists | ||||
zipStoreBase=GRADLE_USER_HOME | zipStoreBase=GRADLE_USER_HOME |