Compare commits

..
Author SHA1 Message Date
pilhoefermi93253 abe79b1efe Merge remote-tracking branch 'origin/Kamera' into Kamera
# Conflicts:
#	app/src/main/java/com/example/greenwatch/Kamera.java
2023-05-30 18:38:58 +02:00
pilhoefermi93253 d06a1dd9b3 Kamera implementiert und Preview im Interface
Zusätzlich eintragen der Berechtigungen und der extra Klasse KameraAktivitaet im Manifest eingetragen
2023-05-30 18:37:38 +02:00
pilhoefermi93253 3a251ae72c Aktuelle xml Datei zur Darstellung der Preview der Kamera kann später gelöscht werden nur zu Testzwecken. 2023-05-30 18:34:00 +02:00
pilhoefermi93253 0b1eaee31d Test Leerzeichen 2023-05-11 16:28:22 +02:00
10 changed files with 153 additions and 189 deletions

No files matched your search

+7
View File
@@ -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}"
}
+11 -2
View File
@@ -1,9 +1,15 @@
<?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"
android:icon="@mipmap/ic_launcher"
@@ -20,6 +26,9 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".KameraAktivitaet" />
</application>
</manifest>
@@ -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,56 +1,40 @@
package com.example.greenwatch;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.net.SocketException;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
WifiCommunication communication; //Member WifiCommunication
TextView tvReceivedData; //Test Textview um empfangene Daten anzuzeigen -> Gegen finale Textview in der Anzeige austauschen
//ToDo: Falls finale Textview zum Anzeigen der Nachricht anders heißt, muss das in der Klasse WifiCommunication.java angepasst werden!
// Wo anpassen: Receive Thread, Zeile 58
private EditText etSendMessage; //Test Edittext um eine Nachricht zu senden -> gegen Nachricht von den Sensoren austauschen
private Button btnSend; //Test Sendebutton
private static final int RECHTEANFORDERUNG_KAMERA = 10;
private String sendmsg = "default";
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
xmlToJava(); //Funktionsaufruf, wo die Testbuttons etc angelegt sind
Button kameraStarten = findViewById(R.id.button_camera);
kameraStarten.setOnClickListener(v -> {
if (istZugriffAufKameraErlaubt()) {
starteKameraAktivitaet();
} else {
zugriffAufKameraAnfordern();
}
});
}
public void xmlToJava(){
tvReceivedData = findViewById(R.id.tvRecTxt); //Test Textview
etSendMessage = findViewById(R.id.sendMessage); //Test Nachricht
btnSend = findViewById(R.id.btnSend); //Test Sendebefehl
private boolean istZugriffAufKameraErlaubt() {
return ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
}
public void onClickSend(View view) throws SocketException{ //ToDo: Sendebefehl mit boolscher Variable lösen --> wo setzen?
sendmsg = etSendMessage.getText().toString(); //ToDo: hier String von Sensoren übergeben
communication.setMessage(sendmsg, true); //übergibt zu sendenden String und setzt die entscheidende Boolsche Variable fürs Senden
private void zugriffAufKameraAnfordern() {
ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.CAMERA}, RECHTEANFORDERUNG_KAMERA);
}
@Override
protected void onResume() {
super.onResume();
//Erstellen des Members
communication = new WifiCommunication(MainActivity.this, MainActivity.this, 1234);
}
@Override
protected void onPause() {
super.onPause();
//schließt socket
communication.stopCommunication();
private void starteKameraAktivitaet() {
startActivity(new Intent(this, KameraAktivitaet.class));
}
}
@@ -1,124 +0,0 @@
package com.example.greenwatch;
import android.annotation.SuppressLint;
import android.content.Context;
import android.widget.Toast;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
public class WifiCommunication {
private final MainActivity mainActivity;
private final InetAddress address;
private final int port;
private final Context context;
private boolean newMsg;
private String rxString;
private String sendMsg;
//private String sendMsg = "default";
private final DatagramSocket socket;
volatile private boolean running;
@SuppressLint("SetTextI18n")
public WifiCommunication(MainActivity mainActivity, Context context, int port) {
this.mainActivity = mainActivity;
this.port = port;
this.context = context;
try {
socket = new DatagramSocket(this.port);
socket.setBroadcast(true);
address = InetAddress.getByName("255.255.255.255");
running = true;
new ReceiveThread().start();
new SendThread().start();
} catch (SocketException | UnknownHostException e) {
throw new RuntimeException(e);
}
mainActivity.runOnUiThread(() -> Toast.makeText(context,"Communication running", Toast.LENGTH_SHORT).show());
}
private class ReceiveThread extends Thread {
private String rxString = "";
private String previousRxString = "";
@Override
public void run() {
try {
do {
byte[] rxBuffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(rxBuffer, rxBuffer.length);
socket.receive(packet);
rxString = new String(packet.getData(), 0, packet.getLength());
if(!previousRxString.equals(rxString))
mainActivity.runOnUiThread(() -> mainActivity.tvReceivedData.setText(rxString));
previousRxString = rxString;
} while (running);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
public String showMessage(){
return rxString;
}
public void setMessage(String message, boolean newMsg){
this.sendMsg=message;
this.newMsg = newMsg;
}
private class SendThread extends Thread {
private int tmpCnt = 0;
@Override
public void run() {
try {
do {
if(newMsg == true)
{
newMsg = false;
String txString = getLocalIpAddress() + " sends. #" + tmpCnt++ + sendMsg;
byte[] txBuffer = txString.getBytes();
DatagramPacket txPacket = new DatagramPacket(txBuffer, txBuffer.length, address, port);
for(int i = 0; i < 20; i++) {
socket.send(txPacket);
}
}
} while (running);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface networkInterface = (NetworkInterface) ((Enumeration<?>) en).nextElement();
for (Enumeration<InetAddress> addresses = networkInterface.getInetAddresses(); addresses.hasMoreElements();) {
InetAddress inetAddress = addresses.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException ex) {
ex.printStackTrace();
}
return null;
}
public void stopCommunication() {
running = false;
socket.close();
}
}
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".KameraAktivitaet">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/erklaerung">
<androidx.camera.view.PreviewView
android:id="@+id/previewView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/alarm"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="" />
<TextView
android:id="@+id/luminanz"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center"
android:gravity="center"
android:textSize="100sp"
android:textColor="#9999ff"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
+8 -22
View File
@@ -6,31 +6,17 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvRecTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Received Message"
app:layout_constraintTop_toBottomOf="@id/sendMessage"
app:layout_constraintStart_toStartOf="parent"/>
<EditText
android:id="@+id/sendMessage"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Send Message"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<Button
android:id="@+id/btnSend"
android:id="@+id/button_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send"
android:onClick="onClickSend"
android:text="Kamera starten"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.129"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/sendMessage"/>
app:layout_constraintVertical_bias="0.931" />
</androidx.constraintlayout.widget.ConstraintLayout>
+2 -2
View File
@@ -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) {
+3 -1
View File
@@ -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 -1
View File
@@ -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