mirror of
https://github.com/LightningMcK/schafkopfzaehler.git
synced 2025-02-05 21:46:09 +00:00
- Own camera preview added
- Removed openCV libs - Issues: Take more than one picture fails - TODO: Saving the picture not needed, just send it to the server
This commit is contained in:
parent
e6602d3d4e
commit
3bca29767a
BIN
.idea/caches/build_file_checksums.ser
generated
BIN
.idea/caches/build_file_checksums.ser
generated
Binary file not shown.
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@ -25,7 +25,7 @@
|
|||||||
</value>
|
</value>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
|
@ -23,8 +23,6 @@ dependencies {
|
|||||||
implementation 'com.android.support:appcompat-v7:27.1.1'
|
implementation 'com.android.support:appcompat-v7:27.1.1'
|
||||||
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
||||||
implementation 'com.android.support:design:27.1.1'
|
implementation 'com.android.support:design:27.1.1'
|
||||||
testImplementation 'junit:junit:4.12'
|
|
||||||
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
||||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
||||||
implementation project(':openCVLibrary343')
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,24 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="project.schafkopfzaehler_2">
|
package="project.schafkopfzaehler_2">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-feature android:name="android.hardware.camera" android:required="false"/>
|
|
||||||
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
|
<uses-feature
|
||||||
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
|
android:name="android.hardware.camera"
|
||||||
<uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>
|
android:required="true" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.camera.autofocus"
|
||||||
|
android:required="true" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.camera.front"
|
||||||
|
android:required="true" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.camera.front.autofocus"
|
||||||
|
android:required="true" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
@ -29,14 +41,16 @@
|
|||||||
android:name=".MainGameActivity"
|
android:name=".MainGameActivity"
|
||||||
android:label="@string/title_activity_main_game"
|
android:label="@string/title_activity_main_game"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:theme="@style/AppTheme.NoActionBar"
|
android:theme="@style/AppTheme.NoActionBar" />
|
||||||
/>
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ChooseGame"
|
android:name=".ChooseGame"
|
||||||
android:label="@string/title_choose_game"
|
android:label="@string/title_choose_game"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:theme="@style/AppTheme.NoActionBar"
|
android:theme="@style/AppTheme.NoActionBar" />
|
||||||
/>
|
<activity
|
||||||
|
android:name=".CardCaptureActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
android:theme="@style/AppTheme.NoActionBar"/>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@ -0,0 +1,164 @@
|
|||||||
|
package project.schafkopfzaehler_2;
|
||||||
|
|
||||||
|
import android.hardware.Camera;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class CardCaptureActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
private Camera mCamera;
|
||||||
|
private cameraPreview mPreview;
|
||||||
|
Button capture; // Button init
|
||||||
|
TextView captureLog; // TextView init
|
||||||
|
public static final int MEDIA_TYPE_IMAGE = 1;
|
||||||
|
|
||||||
|
// Add a listener to the Capture button
|
||||||
|
private View.OnClickListener startCaptureListener = new View.OnClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick (View v) {
|
||||||
|
if (v == capture) {
|
||||||
|
mCamera.takePicture(null, null, mPicture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.cardcapture);
|
||||||
|
|
||||||
|
// Create an instance of Camera
|
||||||
|
mCamera = getCameraInstance();
|
||||||
|
|
||||||
|
// Create our Preview view and set it as the content of our activity.
|
||||||
|
mPreview = new cameraPreview(this, mCamera);
|
||||||
|
FrameLayout preview = findViewById(R.id.cameraPreview);
|
||||||
|
preview.addView(mPreview);
|
||||||
|
|
||||||
|
capture = findViewById(R.id.capture);
|
||||||
|
capture.setOnClickListener(startCaptureListener);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get an instance of the Camera object. */
|
||||||
|
public static Camera getCameraInstance(){
|
||||||
|
Camera c = null;
|
||||||
|
try {
|
||||||
|
c = Camera.open(); // attempt to get a Camera instance
|
||||||
|
}
|
||||||
|
catch (Exception e){
|
||||||
|
// Camera is not available (in use or does not exist)
|
||||||
|
}
|
||||||
|
return c; // returns null if camera is unavailable
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPause() {
|
||||||
|
|
||||||
|
super.onPause();
|
||||||
|
releaseCamera();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onRestart() {
|
||||||
|
super.onRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPictureTaken(byte[] data, Camera camera) {
|
||||||
|
|
||||||
|
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
|
||||||
|
if (pictureFile == null){
|
||||||
|
Log.d("CAMERA", "Error creating media file, check storage permissions");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
FileOutputStream fos = new FileOutputStream(pictureFile);
|
||||||
|
fos.write(data);
|
||||||
|
fos.close();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
Log.d("CAMERA", "File not found: " + e.getMessage());
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.d("CAMERA", "Error accessing file: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
captureLog = findViewById(R.id.capture_log);
|
||||||
|
captureLog.setText("Karte scannen --> an Server senden");
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private void releaseCamera(){
|
||||||
|
if (mCamera != null){
|
||||||
|
mCamera.release(); // release the camera for other applications
|
||||||
|
mCamera = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Create a file Uri for saving an image or video */
|
||||||
|
private static Uri getOutputMediaFileUri(int type){
|
||||||
|
return Uri.fromFile(getOutputMediaFile(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Create a File for saving the captured image */
|
||||||
|
private static File getOutputMediaFile(int type){
|
||||||
|
// To be safe, you should check that the SDCard is mounted
|
||||||
|
// using Environment.getExternalStorageState() before doing this.
|
||||||
|
|
||||||
|
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
|
||||||
|
Environment.DIRECTORY_PICTURES), "MyCameraApp");
|
||||||
|
// This location works best if you want the created images to be shared
|
||||||
|
// between applications and persist after your app has been uninstalled.
|
||||||
|
|
||||||
|
// Create the storage directory if it does not exist
|
||||||
|
if (! mediaStorageDir.exists()){
|
||||||
|
if (! mediaStorageDir.mkdirs()){
|
||||||
|
Log.d("MyCameraApp", "failed to create directory");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a media file name
|
||||||
|
Long tsLong = System.currentTimeMillis()/1000;
|
||||||
|
String timeStamp = tsLong.toString();
|
||||||
|
File mediaFile;
|
||||||
|
if (type == MEDIA_TYPE_IMAGE){
|
||||||
|
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
|
||||||
|
"IMG_"+ timeStamp + ".jpg");
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mediaFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,8 @@
|
|||||||
package project.schafkopfzaehler_2;
|
package project.schafkopfzaehler_2;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.hardware.camera2.CameraMetadata;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.support.design.widget.FloatingActionButton;
|
import android.support.design.widget.FloatingActionButton;
|
||||||
@ -11,13 +13,14 @@ import android.util.Log;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.VideoView;
|
||||||
|
|
||||||
public class MainGameActivity extends AppCompatActivity {
|
public class MainGameActivity extends AppCompatActivity {
|
||||||
|
|
||||||
private Button p1, p2, p3, p4, chooseGame; // Button init
|
private Button p1, p2, p3, p4, chooseGame; // Button init
|
||||||
private TextView choice;
|
private TextView choice;
|
||||||
private String playerNames[] = {"", "", "", ""}; // Player names init
|
private String playerNames[] = {"", "", "", ""}; // Player names init
|
||||||
static final int REQUEST_VIDEO_CAPTURE = 1;
|
static final int REQUEST_IMAGE_CAPTURE = 1;
|
||||||
|
|
||||||
private View.OnClickListener startClickListener = new View.OnClickListener() {
|
private View.OnClickListener startClickListener = new View.OnClickListener() {
|
||||||
|
|
||||||
@ -87,12 +90,9 @@ public class MainGameActivity extends AppCompatActivity {
|
|||||||
private void playerButtonClicked (View v) {
|
private void playerButtonClicked (View v) {
|
||||||
|
|
||||||
Log.d("MainGame", v + " clicked...");
|
Log.d("MainGame", v + " clicked...");
|
||||||
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
|
// Start card capture activity with the camera preview
|
||||||
if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
|
Intent cardCaptureIntent = new Intent(this, CardCaptureActivity.class);
|
||||||
startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
|
startActivity(cardCaptureIntent);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void gameChoosing () {
|
private void gameChoosing () {
|
||||||
@ -109,10 +109,6 @@ public class MainGameActivity extends AppCompatActivity {
|
|||||||
choice.setText(announcement);
|
choice.setText(announcement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
|
|
||||||
// Do nothing...
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,69 @@
|
|||||||
|
package project.schafkopfzaehler_2;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.hardware.Camera;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.SurfaceHolder;
|
||||||
|
import android.view.SurfaceView;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/** A basic Camera preview class */
|
||||||
|
public class cameraPreview extends SurfaceView implements SurfaceHolder.Callback {
|
||||||
|
private SurfaceHolder mHolder;
|
||||||
|
private Camera mCamera;
|
||||||
|
|
||||||
|
public cameraPreview(Context context, Camera camera) {
|
||||||
|
super(context);
|
||||||
|
mCamera = camera;
|
||||||
|
|
||||||
|
// Install a SurfaceHolder.Callback so we get notified when the
|
||||||
|
// underlying surface is created and destroyed.
|
||||||
|
mHolder = getHolder();
|
||||||
|
mHolder.addCallback(this);
|
||||||
|
// deprecated setting, but required on Android versions prior to 3.0
|
||||||
|
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void surfaceCreated(SurfaceHolder holder) {
|
||||||
|
// The Surface has been created, now tell the camera where to draw the preview.
|
||||||
|
try {
|
||||||
|
mCamera.setPreviewDisplay(holder);
|
||||||
|
mCamera.startPreview();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.d("CAMERA", "Error setting camera preview: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||||
|
// empty. Take care of releasing the Camera preview in your activity.
|
||||||
|
}
|
||||||
|
|
||||||
|
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
||||||
|
// If your preview can change or rotate, take care of those events here.
|
||||||
|
// Make sure to stop the preview before resizing or reformatting it.
|
||||||
|
|
||||||
|
if (mHolder.getSurface() == null){
|
||||||
|
// preview surface does not exist
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop preview before making changes
|
||||||
|
try {
|
||||||
|
mCamera.stopPreview();
|
||||||
|
} catch (Exception e){
|
||||||
|
// ignore: tried to stop a non-existent preview
|
||||||
|
}
|
||||||
|
|
||||||
|
mCamera.setDisplayOrientation(90);
|
||||||
|
|
||||||
|
// start preview with new settings
|
||||||
|
try {
|
||||||
|
mCamera.setPreviewDisplay(mHolder);
|
||||||
|
mCamera.startPreview();
|
||||||
|
|
||||||
|
} catch (Exception e){
|
||||||
|
Log.d("CAMERA", "Error starting camera preview: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,36 +1,42 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
android:background="@drawable/woodentable">
|
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/camera_preview"
|
android:id="@+id/cameraPreview"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
android:layout_above="@+id/button_capture"
|
|
||||||
android:layout_alignParentTop="true">
|
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/woodentable"
|
||||||
|
android:layout_alignParentBottom="true">
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/button_capture"
|
android:id="@+id/capture"
|
||||||
style="?android:borderlessButtonStyle"
|
style="?android:borderlessButtonStyle"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
android:layout_centerHorizontal="true"
|
android:layout_centerHorizontal="true"
|
||||||
android:background="@android:color/holo_green_dark"
|
android:background="@android:color/holo_green_dark"
|
||||||
android:fontFamily="@font/germania_one"
|
android:fontFamily="@font/germania_one"
|
||||||
android:text="@string/announcement"
|
android:text="@string/capture"
|
||||||
android:textColor="@android:color/black"
|
android:textColor="@android:color/black"
|
||||||
android:textSize="24sp" />
|
android:textSize="24sp" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/capture_log"
|
android:id="@+id/capture_log"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentBottom="true"
|
android:text="@string/app_name"
|
||||||
android:layout_below="@+id/button_capture"
|
android:layout_alignParentBottom="false"
|
||||||
android:text="TextView" />
|
android:layout_below="@+id/capture" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fontFamily="@font/germania_one"
|
android:fontFamily="@font/germania_one"
|
||||||
android:gravity="fill_horizontal"
|
android:gravity="fill_horizontal"
|
||||||
android:paddingStart="10dp"
|
|
||||||
android:paddingTop="10dp"
|
android:paddingTop="10dp"
|
||||||
android:text="@string/announcementMade"
|
android:text="@string/announcementMade"
|
||||||
android:textAlignment="center"
|
android:textAlignment="center"
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
<string name="soloCall">Was war die Trumpffarbe?</string>
|
<string name="soloCall">Was war die Trumpffarbe?</string>
|
||||||
<string name="title_activity_main_game">ActivityMainGame</string>
|
<string name="title_activity_main_game">ActivityMainGame</string>
|
||||||
<string name="title_choose_game">ChooseGame</string>
|
<string name="title_choose_game">ChooseGame</string>
|
||||||
|
<string name="capture">Karte scannen</string>
|
||||||
<string name="announcement">Neue Ansage</string>
|
<string name="announcement">Neue Ansage</string>
|
||||||
<string name="announcementMade">Angesagt\:</string>
|
<string name="announcementMade">Angesagt\:</string>
|
||||||
<string name="noChoice">Es wurde noch nichts angesagt...</string>
|
<string name="noChoice">Es wurde noch nichts angesagt...</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user