Accelerometer ohne Activity

guguli

Bekanntes Mitglied
Hallo zusammen,

ich möchte gerne eine Klasse Accelerometer schreiben die keine Activity ist.

Also so hab ich mir das vorgestellt.
Ich ab eine klasse MainActivity mit einem Start Button. wenn ich den Button betätige dann rufe ich die Klasse Accelerometer, wodrin ich dann für x,y,z Achsen die Beschleunigungen berechne. In der Klasse Accelerometer werden noch andere Methoden sein, die jetzt keine Relevanz haben.

Wieso ich das so machen möchte ist weil ich versuche meine App modular zu entwickeln.
D.h. ich möchte noch zustätzlich nach dem ich den Start Button in MainActivity betätigt habe nicht nur den Accelerometer starte sonder auch andere Messsensoren. (Pulsmesssensor,....)

Könnt mir einen Tipp geben wie ch sowas am besten realisieren kann???

THX
 

dzim

Top Contributor
Indem du eine Klasse erstellst, die in ihrem Konstruktor einen Context übergeben bekommt. Auch wenn es dann keine Activity ist, benötigt diese Klasse dennoch Zugriff auf einen Context (eine Activity erbt ja von Context), um sich beim Accelometer registrieren zu können.

Ich hab das mal für die Internet-Verbindung gemacht, so dass ich nur einen "Handler" (a.k.a. Listener) implementieren muss, um auf eine ganze Reihe von Daten Zugriff zu bekommen. Konkret brauche ich Zugriff auf ConnectivityManager, WifiManager, TelephonyManager und zusätzlich brauche noch einen Network-Receiver, sowie PhoneStateListener um auf eine grosse Bandbreite an Daten zurückgreifen zu können und meine Activity eben nicht mit sinnlosen Kram zu befüllen.

Ist alles keine Hexerei sondern stincknormale und -langweilige Modularisierung/Objektorientierung...
 

guguli

Bekanntes Mitglied
Also du meinst ich soll eine klasse ModuleHandler erstellen, die in ihrem Konstruktor einen Context übergeben bekommt ???
So :
Java:
public class ModuleHandler {

	public ModuleHandler(Context context){
		
	}
}

Also meine Idee ist erst nach dem ich start button betätigt habe, die sensoren anfangen daten zu ermitteln.
so sieht meine MainActivity aus:
Java:
public class MainActivity extends Activity  {

	RelativeLayout layout;
	

	Button start = (Button) findViewById(R.id.btnStart);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		
		
		start.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {

				start.getBackground().setColorFilter(
						new LightingColorFilter(0x0000FF00, 0x0000FF00));
				

			}
		});
}
wie komme ich von hier zu der Module klasse??? wie kann ich dieses klasse aufrufen???

THX
 

guguli

Bekanntes Mitglied
Hallo,

ich hab das wie folgt gemacht:
MainActivity klasse:
Java:
protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mStartButton = (Button) findViewById(R.id.btnStart);
		mDebugButton = (Button) findViewById(R.id.changeToDebug);
		mModuleHandler = new ModuleHandler(this);

		initializeViewsAcc();

		mStartButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {

				mStartButton.getBackground().setColorFilter(
						new LightingColorFilter(0x0000FF00, 0x0000FF00));
				mModuleHandler.start();

			}
		});

		changeToDebugView();

	}
public void initializeViewsAcc() {
		Accelerometer.currentX = (TextView) findViewById(R.id.currentX);
		Accelerometer.currentY = (TextView) findViewById(R.id.currentY);
		Accelerometer.currentZ = (TextView) findViewById(R.id.currentZ);
	}

	public static void displayCleanValues() {
		Accelerometer.currentX.setText("0.0");
		Accelerometer.currentY.setText("0.0");
		Accelerometer.currentZ.setText("0.0");
	}

	// display the current x,y,z accelerometer values
	public static void displayCurrentValues() {
		Accelerometer.currentX
				.setText(Float.toString(Accelerometer.getDeltaX()));
		Accelerometer.currentY
				.setText(Float.toString(Accelerometer.getDeltaY()));
		Accelerometer.currentZ
				.setText(Float.toString(Accelerometer.getDeltaZ()));
	}
Modulehandler Klasse:
Java:
public class ModuleHandler {
	private Context mContext;
	private final Accelerometer mAccelerometer;
	private boolean mRunning = false;

	public ModuleHandler(Context context) {
		mContext = context;
		mAccelerometer = new Accelerometer(mContext);
	}

	public void start() {
		if (!mRunning) {
			mAccelerometer.start();
			mRunning = true;
		}
	}

	public void stop() {
		if(mRunning) {
			mAccelerometer.stop();
			mRunning = false;
		}
	}
}
und accelerometer klasse:
Java:
public class Accelerometer implements SensorEventListener {

	public static TextView currentX;
	public static TextView currentY;
	public static TextView currentZ;

	private float lastX, lastY, lastZ;

	private SensorManager sensorManager;
	private Sensor accelerometer;

	private static float deltaX = 0;
	private static float deltaY = 0;
	private static float deltaZ = 0;

	static float vibrateThreshold = 0;

	public static Vibrator v;
	private Context mContext;

	public Accelerometer(Context context) {
		mContext = context;

		sensorManager = (SensorManager) mContext
				.getSystemService(Context.SENSOR_SERVICE);
		if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
			// success! we have an accelerometer

			accelerometer = sensorManager
					.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
			sensorManager.registerListener(this, accelerometer,
					SensorManager.SENSOR_DELAY_NORMAL);
			vibrateThreshold = accelerometer.getMaximumRange() / 2;
		} else {
			// fai! we dont have an accelerometer!
		}

		// initialize vibration
		v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		// clean current values
		MainActivity.displayCleanValues();
		// display the current x,y,z accelerometer values
		MainActivity.displayCurrentValues();
		// display the max x,y,z accelerometer values
		// displayMaxValues();

		// get the change of the x,y,z values of the accelerometer
		deltaX = Math.abs(lastX - event.values[0]);
		deltaY = Math.abs(lastY - event.values[1]);
		deltaZ = Math.abs(lastZ - event.values[2]);

		// if the change is below 2, it is just plain noise
		if (deltaX < 2)
			deltaX = 0;
		if (deltaY < 2)
			deltaY = 0;
		if (deltaZ < 2)
			deltaZ = 0;

		// set the last know values of x,y,z
		lastX = event.values[0];
		lastY = event.values[1];
		lastZ = event.values[2];

		vibrate();

	}

	// if the change in the accelerometer value is big enough, then vibrate!
	// our threshold is MaxValue/2
	public void vibrate() {
		if ((deltaX > vibrateThreshold) || (deltaY > vibrateThreshold)
				|| (deltaZ > vibrateThreshold)) {
			v.vibrate(50);
		}
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {

	}

	protected void stop() {
		sensorManager.unregisterListener(this);
	}

	protected void start() {
		sensorManager.registerListener(this, accelerometer,
				SensorManager.SENSOR_DELAY_NORMAL);
	}

	public static float getDeltaX() {
		return deltaX;
	}

	public static float getDeltaY() {
		return deltaY;
	}

	public static float getDeltaZ() {
		return deltaZ;
	}
}

Wie gesagt ich will das Acc erst dann startet wenn ich den button gedruckt habe, aber auch ohne dasss ich den button gedruckt habe, wenn ich das handy bewege kriege ich für X,Y und Z achsen werte angezeigt. kann einer bitte mir sagen wo mein Fehler ist.

THX
 

dzim

Top Contributor
Ich würde spontan mal sagen, du startest ihn zwar mit dem Button, stoppst ihn aber nirgens. Dann wird er wohl munter weiter Daten empfangen...
 

guguli

Bekanntes Mitglied
Eigentlich schon. Ich meine wen ich die App neu starte dann soll die werte von X Y Z alle 0 sein, aber bevor ich den startbutton betätige ändern sich die werte trotzdem. also anders gesagt, ich starte die App und wenn ich das Gerät bewege dann ändern sich die werte, obwohl man davon ausgeht, dass der Accelerometer nicht aktive ist und erst mit der Betätigung der Start button soll er aktiviert/startet werden.

Ich stehe aufm Schlauch :(
 

dzim

Top Contributor
Wenn ich den Code (beim überfliegen) richtig verstehe, registrierst du den Sensor-Listener schon im Konstruktor. Da könnte dein Problem bereits begründet sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Accelerometer daten umwandeln Android & Cross-Platform Mobile Apps 41
G accelerometer Android & Cross-Platform Mobile Apps 2
Naxon89 Duplicate class kotlin - und dies ohne das es angewendet wird Android & Cross-Platform Mobile Apps 1
I Android ListView, Werte aktualisieren ohne die Liste komplett neu zu laden Android & Cross-Platform Mobile Apps 5
T Screenshot speichern ohne alte Datei überschreiben Android & Cross-Platform Mobile Apps 3
T Android ArrayList sortieren mit 2 Werten ohne thencomparing , Wie? Android & Cross-Platform Mobile Apps 10
Jackii Android Android Studio Error im Testlauf ohne zu programmieren Android & Cross-Platform Mobile Apps 9
L Android App ohne MainActivity Android & Cross-Platform Mobile Apps 3
J Android LogIn/Registrierung ohne Mail-Adresse Android & Cross-Platform Mobile Apps 1
B Android USB Debugging ohne kabel möglich? Android & Cross-Platform Mobile Apps 5
M Fehler ohne Sinn? java.lang.RuntimeException: Unable to start activity ComponentInfo Android & Cross-Platform Mobile Apps 11
G Activity-Wechsel bitte ohne Notification Android & Cross-Platform Mobile Apps 6
G Pause ohne sleep und ohne zweiten Thread Android & Cross-Platform Mobile Apps 5
G Pause im Programmablauf ohne extra Thread Android & Cross-Platform Mobile Apps 2
C Activity ohne Aktion starten Android & Cross-Platform Mobile Apps 8
S Entwicklung von Smartphone programmen ohne selber eins zu besitzen Android & Cross-Platform Mobile Apps 17
StrikeTom Android tabs ohne xml Android & Cross-Platform Mobile Apps 6
W JSONARRAY per Intent an andere Activity übergeben und umwandeln ggbf. Android & Cross-Platform Mobile Apps 1
M Activity einer anderen App mit result Android & Cross-Platform Mobile Apps 2
CT9288 Methode von Fragment durch Activity rufen scheitert Android & Cross-Platform Mobile Apps 7
ruutaiokwu Android Daten von "Activity A" nach "Activity B" umleiten? Android & Cross-Platform Mobile Apps 13
L Android Lockscreen-Sperrmuster activity verwenden Android & Cross-Platform Mobile Apps 1
J Android App stürzt ab wenn neue activity gestartet Android & Cross-Platform Mobile Apps 6
D Android Activity wechseln per Button Android & Cross-Platform Mobile Apps 3
P Android Android-App Crash - Unable to start activity ComponentInfo Android & Cross-Platform Mobile Apps 2
S Neue Activity lässt sich nicht starten Android & Cross-Platform Mobile Apps 28
B Android Activity nach gedrückte Returntaste weiterlaufen lassen Android & Cross-Platform Mobile Apps 2
J Probleme mit ViewPager und Activity Android & Cross-Platform Mobile Apps 1
B Android In einem View der ersten Activity zweite anzeigen Android & Cross-Platform Mobile Apps 2
J Android BroadcastHandler extends BroadcastReceiver; auf Activity zugreifen? Android & Cross-Platform Mobile Apps 5
K Android Übergeordnete Activity herausfinden? Android & Cross-Platform Mobile Apps 7
W Android Designfrage / Layout / Activity / Fragments Android & Cross-Platform Mobile Apps 2
B Login Activity Android & Cross-Platform Mobile Apps 1
M Android Suche Activity/View Namen Android & Cross-Platform Mobile Apps 1
K Unbekannte Menge von Daten (Strings oder Ints) an Activity übergeben Android & Cross-Platform Mobile Apps 0
S Android Eclipse erstellt keine main Activity Android & Cross-Platform Mobile Apps 4
B java.lang.RuntimeException: Unable to start activity ComponentInfo Android & Cross-Platform Mobile Apps 2
K Android Activity for result aus Dialog Android & Cross-Platform Mobile Apps 1
S Android "Weiches wechseln" zwischen Views in einer Activity Android & Cross-Platform Mobile Apps 3
D Android Activity mit mehreren Views "spliten" Android & Cross-Platform Mobile Apps 10
G eine Methode einer anderen Activity aufrufen Android & Cross-Platform Mobile Apps 9
D Android Neue Activity im TabWidget laden Android & Cross-Platform Mobile Apps 8
S Android In Service überprüfen ob eine Activity gebunden ist? Android & Cross-Platform Mobile Apps 6
T Android Activity finished testen Android & Cross-Platform Mobile Apps 5
T Activity / Application fundamentals Android & Cross-Platform Mobile Apps 4
M Activity wechseln aus List View mit Android & Cross-Platform Mobile Apps 2
G extends Activity für Berechnungen? Android & Cross-Platform Mobile Apps 7
G Daten von einer Activity zur nächsten übergeben Android & Cross-Platform Mobile Apps 6
G selbes Menü auf jeder Activity Android & Cross-Platform Mobile Apps 4
C Android Kommunikation zwischen Service und Activity Android & Cross-Platform Mobile Apps 8
Maxim6394 [ Android ] Activity ändern Android & Cross-Platform Mobile Apps 9
A Activity Intent 'source not found' Android & Cross-Platform Mobile Apps 4
A Android Activity Variablen-Initialisierung Android & Cross-Platform Mobile Apps 8
A Beenden einer 2ten Activity Android & Cross-Platform Mobile Apps 3
W Standard Gallery Activity? Android & Cross-Platform Mobile Apps 22
schlingel Android: Overlay in Activity Android & Cross-Platform Mobile Apps 3
G Activity beenden Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben