Quellcode |
Download der Projekt Dateien:
Droid_Dice.java
package
com.DroidDice;
//-------------------------Implementierung von benötigten
Android Standard-Klassen-------------------------------------------------
import
android.app.Activity;
import
android.os.Bundle;
import
java.io.IOException;
import
java.util.Date;
import
java.util.Random;
import
java.util.Timer;
import
java.util.TimerTask;
import
android.media.AudioManager;
import
android.media.MediaPlayer;
import
android.os.Vibrator;
import
android.text.Layout;
import
android.util.Log;
import
android.view.KeyEvent;
import
android.view.Window;
import
android.view.WindowManager;
import
android.widget.LinearLayout;
import
android.widget.TextView;
import
android.content.Context;
import
android.content.res.Resources;
import
android.graphics.Typeface;
import
android.graphics.drawable.Drawable;
import
android.hardware.Sensor;
import
android.hardware.SensorEvent;
import
android.hardware.SensorEventListener;
import
android.hardware.SensorManager;
//-------------------------End------------------------------------------------------------------------------------
//-------------------------Haupt-Klasse------------------------------------------------------------------------
public
class
Droid_Dice
extends
Activity
implements
SensorEventListener
{
//-------------------------Attribute/Variablen deklaration--------------------------------------------------------
//---Standbyvariablen-------------------------------
//Diese Variablen werden benötigt um
die "Bitte Würfeln" Aufforderung
boolean
ruhe_mid;
//zu
deaktivieren, wenn das Gerät still auf dem
Tisch liegt
int
index_ruhe;
//---Medienvariablen---------------------------------
private
MediaPlayer
mPlayer;
//Funktion wird benötigt um mp3s aufzurufen
private
final
String
LOG_TAG
=
"AudioRecordTest";
//wird zur
Fehlermeldung benötigt
int
int_case;
//---Vibrationsvariablen---------------------------------
Vibrator
vibro;
//Pattern für Vibrationsmuster long lArray[] = {aus,an,aus,...
long
lArray1[]
= { 10, 600, 1000, 200 };
long
lArray2[]
= { 10, 600, 1000, 200, 200, 200 };
long
lArray3[]
= { 10, 600, 1000, 200, 200, 200, 200, 200 };
long
lArray4[]
= { 10, 600, 1000, 200, 200, 200, 200, 200, 200, 200 };
long
lArray5[]
= { 10, 600, 1000, 200, 200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 };
long
lArray6[]
= { 10, 600, 1000, 200, 200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 };
//---Bewegungs-Sensor-Variablen-----------------------------
private
SensorManager
sensorManager
=
null;
boolean
messung_aktiv;
boolean
gewuerfelt;
//true wenn stark genug geschüttelt
boolean
pause;
int
empfindlichkeit
= 14;
//Empfindlichkeitseinstellung
für Bewegungsdetektion
int
zaehler
= 7;
//Anzahl der nötigen Bewegungen um ein
Schütteln zu erkennen
int
bewegungja
= 0;
//Zaheler für Bewegungsdetektion
float
gx
= 0;
//Beschleunigungswert
in x-Richtung
float
gy
= 0;
//Beschleunigungswert
in y-Richtung
float
gz
= 0;
//Beschleunigungswert in z-Richtung
boolean
weitergabe;
boolean
wuerfeln_start;
//---Zeitvariablen----------------------------------//Variablen
werden für verschiedene Zeitbestimmungen benötigt
Date
today_messung;
double
ja=1E12;
double
zeit_neu;
double
zeit_alt;
double
zeit_aufforderung;
double
zeit_wuerfeln;
double
zeit_warten;
int
int_verzoegerung;
int
ausgabezeit;
//---Allgemeine
Variablen----------------------------------
int
zufallszahl;
//Zahl die der
Zufallsgenerator ausgibt
//---Bildschirm
Variablen----------------------------------
//Variablen um die Würfelbilder zuzuweisen
Drawable
drawable0;
Drawable
drawable1;
Drawable
drawable2;
Drawable
drawable3;
Drawable
drawable4;
Drawable
drawable5;
Drawable
drawable6;
LinearLayout
linearLayout;
//-------------------------End Attribute deklaration--------------------------------------------------------------
AudioManager
audioManager;
//-------------------------Methode
onCreate-----------------------------------------------------------------------
/** Called when the activity is first created. */
@Override
public
void
onCreate(Bundle savedInstanceState)
// Funktion on Create wird als erstes aufgerufen
bei Öffnen der Applikation
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//Entfernt Titelzeile am Oberen Bildschirmrand
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
//Entfernt Statuszeile am Oberen Bildschirmrand
setContentView(R.layout.main);
//Festlegung der Hauptoberfläche main.xml
Resources res = getResources();
//Ab hier: Zuweisung der Bildfiles zu den jeweiligen Variablen
drawable0
= res.getDrawable(R.drawable.wuerfel3);
//
drawable1
= res.getDrawable(R.drawable.wuerfel_1);
//
drawable2
= res.getDrawable(R.drawable.wuerfel_2);
//
drawable3
= res.getDrawable(R.drawable.wuerfel_3);
//
drawable4
= res.getDrawable(R.drawable.wuerfel_4);
//
drawable5
= res.getDrawable(R.drawable.wuerfel_5);
//
drawable6
= res.getDrawable(R.drawable.wuerfel_6);
//bis hier
linearLayout
= (LinearLayout)findViewById(R.id.LinearLayout02);
//
linearLayout.setBackgroundDrawable(drawable0);
// Anzeigen des
Standard-Hintergrundes
sensorManager
= (SensorManager) getSystemService(SENSOR_SERVICE);
//Funktionen für
Beschleunigungssensor Nutzung
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
vibro
= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
//Funktion für Vibrationsmotor ansteuerung
today_messung=new
Date();
//Anlegen einer
Datumsvariable
zeit_aufforderung=(today_messung.getTime()-ja);
//Zeit der Datumsvariable
wird in mSec ausgegeben
audioManager=(AudioManager)
getSystemService(Context.AUDIO_SERVICE);
//Konstanthalten der Ausgabelautstärke
audioManager.setStreamVolume(AudioManager.STREAM_RING,audioManager.getStreamMaxVolume(AudioManager.STREAM_RING),
AudioManager.FLAG_ALLOW_RINGER_MODES|AudioManager.FLAG_PLAY_SOUND);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
AudioManager.FLAG_ALLOW_RINGER_MODES|AudioManager.FLAG_PLAY_SOUND);
}
//-------------------------End Methode
onCreate--------------------------------------------------------------------
/*---------------Funktion für
Zufallsgenerator-------------------------------------------------------------------*/
public
void
erstelleZufallsZahl()
{
Random zufallsgenerator =
new
Random();
for(int
i=0; i<1; i++)
{
int
zahl = zufallsgenerator.nextInt(6);
// System.out.println(zahl);
zufallszahl
= zahl+1;
}
}
/*---------------Ende
Zufallsgenerator---------------------------------------------------------------------------*/
//-------------------------Methode
MP3-----------------------------------------------------------------------------
public
void
MP3_Starten()
//in dieser Funktion wird der Mediaplayer gestartet und über die switch/case
Anweisung das
//jeweilige MP3 abgespielt und festgelegt wann der Mediaplayer wieder gestoppt
wird
{
//desweiteren wird der
jeweilige Vibrationsrhythmus gestartet und die gewürfelten Augen auf
//den Display anzeigen
try
{
mPlayer
=
new
MediaPlayer();
switch
(int_case)
{
case
7:
mPlayer.setDataSource("/sdcard/music/droid_dice/bitte_wuerfeln.mp3");
break;
case
1:
mPlayer.setDataSource("/sdcard/music/droid_dice/eine_1.mp3");
linearLayout.setBackgroundDrawable(drawable1);
vibro.vibrate(lArray1,
-1);
ausgabezeit=2000;
zeit_warten=zeit_neu;
int_verzoegerung=2300;
Zeitverzoegerung2();
break;
case
2:
mPlayer.setDataSource("/sdcard/music/droid_dice/eine_2.mp3");
linearLayout.setBackgroundDrawable(drawable2);
vibro.vibrate(lArray2,
-1);
ausgabezeit=2400;
zeit_warten=zeit_neu;
int_verzoegerung=2300;
Zeitverzoegerung2();
break;
case
3:
mPlayer.setDataSource("/sdcard/music/droid_dice/eine_3.mp3");
linearLayout.setBackgroundDrawable(drawable3);
vibro.vibrate(lArray3,
-1);
ausgabezeit=2800;
zeit_warten=zeit_neu;
int_verzoegerung=2300;
Zeitverzoegerung2();
break;
case
4:
mPlayer.setDataSource("/sdcard/music/droid_dice/eine_4.mp3");
linearLayout.setBackgroundDrawable(drawable4);
vibro.vibrate(lArray4,
-1);
ausgabezeit=3200;
zeit_warten=zeit_neu;
int_verzoegerung=2300;
Zeitverzoegerung2();
break;
case
5:
mPlayer.setDataSource("/sdcard/music/droid_dice/eine_5.mp3");
linearLayout.setBackgroundDrawable(drawable5);
vibro.vibrate(lArray5,
-1);
ausgabezeit=3600;
zeit_warten=zeit_neu;
int_verzoegerung=2300;
Zeitverzoegerung2();
break;
case
6:
mPlayer.setDataSource("/sdcard/music/droid_dice/eine_6.mp3");
linearLayout.setBackgroundDrawable(drawable6);
vibro.vibrate(lArray6,
-1);
ausgabezeit=4000;
zeit_warten=zeit_neu;
int_verzoegerung=2300;
Zeitverzoegerung2();
break;
default:
break;
}
mPlayer.prepare();
mPlayer.start();
}
catch
(IOException e)
// wird benötigt um bei einem Fehlerhaften Dateizugriff ein Fehlerprotokoll zu
erzeugen
{
Log.e(LOG_TAG,
"prepare() failed");
}
}
//-------------------------End Methode
MP3-------------------------------------------------------------------------
//-------------------------Methode Zeit
abbrechen------------------------------------------------------------------
public
void
Zeitverzoegerung()
//Methode um nach aufheben
des in ruhe liegenden Gerätes zeitverzögert eine
//"Bitte Würfeln"
Aufforderung auszugeben
{
Timer timing =
new Timer();
timing.schedule(new
TimerTask()
{
@Override
public
void
run()
{
MP3_Starten();
zeit_aufforderung=zeit_neu;
}
},int_verzoegerung);
}
//-------------------------End Zeit
abbrechen----------------------------------------------------------------------
//-------------------------Methode Zeit
abbrechen2------------------------------------------------------------------
public
void
Zeitverzoegerung2()
//Methode um den Mediaplayer bei verschieden langen MP3 Ansagen gezielt zu
stoppen
{
Timer timing =
new Timer();
timing.schedule(new
TimerTask()
{
@Override
public
void
run()
{
if
(mPlayer
!=
null)
{
mPlayer.release();
mPlayer
=
null;
}
}
},int_verzoegerung);
}
//-------------------------End Zeit
abbrechen2----------------------------------------------------------------------
//-------------------------Methode Camera-/Volumebutton
off-------------------------------------------------------
@Override
//Methode um die seitlichen
Tasten während des Programmablaufs zu deaktivieren
public
boolean
onKeyDown(int
keyCode, KeyEvent event)
{
if
(keyCode == KeyEvent.KEYCODE_CAMERA)
{
return
true;
// do nothing on camera button
}
if
(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
{
return
true;
// do nothing on camera button
}
if
(keyCode == KeyEvent.KEYCODE_VOLUME_UP)
{
return
true;
// do nothing on camera button
}
return
super.onKeyDown(keyCode,
event);
}
//-------------------------End Methode Camera-/Volumebutton
off---------------------------------------------------
//-------------------------------Methode
onSensorChanged-----------------------------------------------------------
@Override
//Funktion wird bei jeder
Sensorwert-Änderung aufgerufen, da der Sensor jedoch rauscht,
//wird hier die volle
eingestellte Aktualisierungsrate von 15Hz ausgenutzt
public
void
onSensorChanged(SensorEvent event)
{
today_messung=new
Date();
zeit_neu=(today_messung.getTime()-ja);
gx
= event.values[0];
//Beschleunigungswerte in
x,y,z-Richtung auslesen und zuweisen
gy
= event.values[1];
gz
= event.values[2];
//Startbedingung
//Gerät liegt flach auf dem Tisch
--> messung_aktiv==false
if(!messung_aktiv)
{
if(Math.abs(gz)<9.8)
{
messung_aktiv=true;
int_verzoegerung=100;
int_case=7;
Zeitverzoegerung();
zeit_aufforderung=zeit_neu;
}
}
if(messung_aktiv)
//Gerät wurde aufgenommen
--> messung_aktiv==true
{
//-------------Start der Inaktivitätsprüfung-------------------
if(
(Math.abs(gz)>9.8)
&& (ruhe_mid==false) )
//Funktion überprüft ob Gerät inaktiv ist oder damit gewürfelt werden soll
{
ruhe_mid=true;
zeit_alt=zeit_neu;
index_ruhe=0;
}
if(ruhe_mid)
{
if(
(Math.abs(gz)>9.8)
&& ((zeit_neu-zeit_alt)<8000))
{
index_ruhe++;
}
if(((zeit_neu-zeit_alt)>8000)
&& (index_ruhe>100))
{
messung_aktiv=false;
ruhe_mid=false;
index_ruhe=0;
}
if(((zeit_neu-zeit_alt)>8000)
&& (index_ruhe<100))
{
ruhe_mid=false;
index_ruhe=0;
}
}
//-------------Ende der Inaktivitätsprüfung-------------------
if(
((zeit_neu-zeit_aufforderung)>6000)
&& ((weitergabe==true)||
wuerfeln_start==false
) )
//zyklisches Ausgeben
von "Bitte würfeln"
{
zeit_aufforderung=zeit_neu;
weitergabe=false;
gewuerfelt=false;
int_case=7;
MP3_Starten();
}
//Bewegungsdetektion
if(gewuerfelt==false)
//Funktion wird nur
aufgerufen wenn gerade kein Würfeln erkannt wurde
{
if((Math.sqrt(Math.pow(gx,2)+Math.pow(gy,2)+Math.pow(gz,2))>empfindlichkeit)
&& (wuerfeln_start==false)
)
//erste aussreichend starke
(Amplitude > Empfindlichkeit)
//Schüttel-Flanke wird
erwartet
{
zeit_wuerfeln=zeit_neu;
wuerfeln_start=true;
}
if(((zeit_neu-zeit_wuerfeln)<2000)
&& (bewegungja <
zaehler) &&
wuerfeln_start==true)
//Bewegungszähler wird innerhalb von 2sek hochgezählt
{
if(Math.sqrt(Math.pow(gx,2)+Math.pow(gy,2)+Math.pow(gz,2))>empfindlichkeit)
//Bewegungserkennung wenn Summe der absoluten Beschleunigung über Grenzwert
{
bewegungja++;
zeit_aufforderung=zeit_neu;
}
}
if(bewegungja
>=
zaehler)
//wenn Bewegungszähler Grenze
überschreitet wird ein "Gewürfelt-Flag" gesetzt und der Zähler zurückgesetzt
{
bewegungja
= 0;
gewuerfelt=true;
//pause=true;
}
if(((zeit_neu-zeit_wuerfeln)>2000)
&&
bewegungja<zaehler &&
wuerfeln_start==true)
//wenn innerhalb von 2sek nicht aussreichend geschüttelt wurde, Rücksetzen der
Variablen
{
zeit_aufforderung=zeit_neu;
bewegungja=0;
wuerfeln_start=false;
}
}
if ((gewuerfelt==true)
&& (weitergabe==false))
//Erzeugen der Zufallszahl und anschließendes Weitergeben an Audioausgabe und
Vibration
{
//Rücksetzen des
"Gewürfelt-Flags" um auf neues Würfeln zu warten
gewuerfelt=false;
zeit_aufforderung=zeit_neu;
erstelleZufallsZahl();
int_case=zufallszahl;
if
(mPlayer
!=
null)
{
mPlayer.release();
mPlayer
=
null;
}
MP3_Starten();
}
if((zeit_neu-zeit_warten)<ausgabezeit)
//Blockieren des Zählers,
solange Ergebnis noch ausgegeben wird
{
bewegungja
= 0;
}
}
}
@Override
public
void
onAccuracyChanged(Sensor sensor,
int accuracy)
{
//
TODO
Auto-generated method stub
}
//-------------------------------End Methode
onSensorChanged-------------------------------------------------------
//#######################################################----Methoden Beenden
(Destruktoren) ----###################################
@Override
protected
void
onResume()
{
super.onResume();
audioManager.setStreamVolume(AudioManager.STREAM_RING,audioManager.getStreamMaxVolume(AudioManager.STREAM_RING),
AudioManager.FLAG_ALLOW_RINGER_MODES|AudioManager.FLAG_PLAY_SOUND);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
AudioManager.FLAG_ALLOW_RINGER_MODES|AudioManager.FLAG_PLAY_SOUND);
}
@Override
protected
void
onPause()
//bei Druck auf die "Home" Taste wird das Programm beendet
{
super.onPause();
finish();
}
@Override
protected
void
onDestroy()
//bei Druck auf die "Zurück" Taste wird das Programm beendet
{
super.onDestroy();
//Destruktoren für Sensoren
und Mediaplayer
sensorManager.unregisterListener(this);
if
(mPlayer
!=
null)
{
mPlayer.release();
mPlayer
=
null;
}
}
//--------------------------------------End------------------------------------------------------------------------
}