Hardware-Keys in Android

Hallo. Ich versuche gerade, mir beizubringen, wie man services schreibt, die auf Key-Events reagieren. Beispielsweise gibt es Apps, die auf das Drücken des Power-Knopfes reagieren, ohne seine sonstige funktion zu ändern.

Ich bin allerdings ein bisschen verwirrt. Ich habe folgende AndroidManifest.xml:

[XML]<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.uxul.androidspam"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.VIBRATE"/>
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<receiver android:name=".RemoteControlReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>

<activity android:name="MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
[/XML]

Dann habe ich eine MainActivity.java, die ohne die Zeilen 30 und 31 auch compiliert:

Java:
package de.uxul.androidspam;

import android.app.*;
import android.view.*;
import android.os.*;
import android.content.*;
import android.util.*;
import android.media.*;

public class MainActivity extends Activity
{

    private static final String TAG = "MainActivity";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    /** Called when the user clicks the Send button */
    public void sendMessage(View view) {
	// Do something in response to button
	Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
	v.vibrate(300);
	Log.d(TAG, "Vibrate!");

	AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
	am.registerMediaButtonEventReceiver(RemoteControlReceiver);

	//am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

    }

}

Dann habe ich noch eine RemoteControlReceiver.java:

Java:
package de.uxul.androidspam;

import android.app.*;
import android.view.*;
import android.os.*;
import android.content.*;
import android.util.*;
import android.media.*;

public class RemoteControlReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
	Log.d("RCR", "QUIEK");
    }
}

Wenn ich die genannten zwei Zeilen weglasse, passiert nichts, egal welche Hardwareknöpfe ich drücke. In
Code:
adb logcat
erscheinen die Tastendrücke, aber nicht mein Log-Text. Die beiden Zeilen compilieren aber auch nicht. am.registerMediaButtonEventReceiver möchte ein PendingIntent. Ich habe aber keine Ahnung, wo ich das herbekomme.

Könnt ihr mir helfen?

Wie gesagt, das ganze ist eher so ein Patchwork-Ding, wo ich mit verschiedenen Sachen experimentiere, der erste Teil ist zum Beispiel direkt aus dem Android-Tutorial. Ich hab mir das aus diversen Quellen zusammengetragen. Unter Anderem:

https://developer.android.com/training/managing-audio/volume-playback.html
https://developer.android.com/reference/android/view/KeyEvent.html
android - Key listener in Service - Stack Overflow
 

dzim

Top Contributor
Verstehe das Grundsätzliche Problem, aber nicht, was bei dir jetzt genau nicht klappt. Wird dein BroadcastReceiver benachrichtigt, oder nicht? Ist das das Log-Level von logcat korrekt eingestellt (in Eclipse kann man sich auch nur auf Warning und aufwärts beschränken, vielleicht ist das ja da auch)? Kannst du vielleicht einmal irgend ein Intent vom Reciever aus feuern, der etwas sinnvolles macht? Oder kurz ein Toast anzeigen?
Ich hab mit BroadcastReceivern noch nicht so viel Erfahrung, daher kann ich nur sagen, das dein Code korrekt aussieht, aber leider nicht mehr als das...
 

dzim

Top Contributor
Hm... Sag mal: Du hast doch schon deinen Receiver im Manifest registriert, oder? Ist es dann überhaupt noch notwendig, ihn im Code zu registrieren? Vielleicht mal eine der beiden Sachen wegnehmen...
 
Verstehe das Grundsätzliche Problem, aber nicht, was bei dir jetzt genau nicht klappt.
Geht mir genauso, leider.

Wird dein BroadcastReceiver benachrichtigt, oder nicht?
Wenn ich hdas richtig interpretiere, dann nicht.

Ist das das Log-Level von logcat korrekt eingestellt (in Eclipse kann man sich auch nur auf Warning und aufwärts beschränken, vielleicht ist das ja da auch)? Kannst du vielleicht einmal irgend ein Intent vom Reciever aus feuern, der etwas sinnvolles macht? Oder kurz ein Toast anzeigen?
Ich benutze kein Eclipse. Das LogLevel sollte debug sein, also das selbe sein wie beim Button, und dessen Ausgabe wird angezeigt.


dzim hat gesagt.:
Hm... Sag mal: Du hast doch schon deinen Receiver im Manifest registriert, oder? Ist es dann überhaupt noch notwendig, ihn im Code zu registrieren? Vielleicht mal eine der beiden Sachen wegnehmen...
Wie gesagt, anscheinend reicht das nicht. Die Zeilen 30 und 31 gehen so nicht, aus genannten Gründen. Ich nehme also an, dass man das Ding aktivieren muss, ich habe nur keine Ahnung, woher ich ein PendingIntent dazu bekommen soll.
 

dzim

Top Contributor
Ich benutze kein Eclipse. Das LogLevel sollte debug sein, also das selbe sein wie beim Button, und dessen Ausgabe wird angezeigt.
Einen Toast kannst du trotzdem anzeigen lassen:
Java:
Toast.makeText(context, "Ein Toast auf die Toasts!", Toast.LENGTH_SHORT).show();
anstelle oder zusätzlich zu dem Log...

Die beiden Zeilen compilieren aber auch nicht. am.registerMediaButtonEventReceiver möchte ein PendingIntent. Ich habe aber keine Ahnung, wo ich das herbekomme.
Ok, die Zeile habe ich beim ersten Mal glatt überlesen. Aber: du hast dir schon mal die Doku zu Gemüte geführt, oder??? Da findet man schon, wie man einen PendingIntent erstellen kann, aber das ist eigentlich unwichtig, weil du eines übersehen hast. Es gibt zwei Register-Methoden: Die erste für einen PendingIntent, die Zweite für einen ComponentName. Die Doku sagt beim Zweiten auch noch, das es für BroadcastReceiver ist...

Beispielcode (nicht getestet, aber soll auch nur die beiden unterschiedlichen Ansätze erläutern):
Java:
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
		
am.registerMediaButtonEventReceiver(new ComponentName("<dein.android.package>", BroadCastReceiver.class)); // package can be a context as well
		
Intent intent = new Intent(context, BroadCastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(contenxt, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.registerMediaButtonEventReceiver(pendingIntent);
Und du, mein Freund, verwendest am besten das Erste! Und da du es im Code registrierst, verwendest du anstelle des Strings für den Package-Namen gefälligst den Context! I.O.?
 
Einen Toast kannst du trotzdem anzeigen lassen:
Java:
Toast.makeText(context, "Ein Toast auf die Toasts!", Toast.LENGTH_SHORT).show();
anstelle oder zusätzlich zu dem Log...
Ok, habe ich jetzt gemacht.

Ok, die Zeile habe ich beim ersten Mal glatt überlesen. Aber: du hast dir schon mal die Doku zu Gemüte geführt, oder??? Da findet man schon, wie man einen PendingIntent erstellen kann, aber das ist eigentlich unwichtig, weil du eines übersehen hast.
Das Zeug wirkt halt alles wahnsinnig überabstrahiert. Kann durchaus sein dass ich einiges übersehen habe.

Und du, mein Freund, verwendest am besten das Erste! Und da du es im Code registrierst, verwendest du anstelle des Strings für den Package-Namen gefälligst den Context! I.O.?
Okeh. Mein Kot sieht jetzt wie folgt aus, und geht immernochnicht:

[XML]<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.uxul.androidspam"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.VIBRATE"/>
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">


<activity android:name="MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>[/XML]

Java:
package de.uxul.androidspam;

import android.app.*;
import android.view.*;
import android.os.*;
import android.content.*;
import android.util.*;
import android.media.*;
import android.widget.*;

public class RemoteControlReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
	Log.d("RCR", "QUIEK");
	Toast.makeText(context, "Ein Toast auf die Toasts!", Toast.LENGTH_SHORT).show();
    }
}


Java:
package de.uxul.androidspam;

import android.app.*;
import android.view.*;
import android.os.*;
import android.content.*;
import android.util.*;
import android.media.*;
import android.widget.*;


public class MainActivity extends Activity
{

    private static final String TAG = "MainActivity";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    /** Called when the user clicks the Send button */
    public void sendMessage(View view) {
	// Do something in response to button
	Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
	v.vibrate(300);
	Log.d(TAG, "Vibrate!");
	Context c = view.getContext();
	Toast.makeText(view.getContext(), "Ein Toast auf die Toasts 2!", Toast.LENGTH_SHORT).show();
	AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
	am.registerMediaButtonEventReceiver(new ComponentName(c, RemoteControlReceiver.class));
    }
}

Es geht auch nicht mit dem intent-filter in XML.
 

dzim

Top Contributor
Der Doku des AudioManagers nach (AudioManager @AndroidDeveloper) muss dein BroadcastReceiver ebenfalls im Manifest registriert werden.

Lars Vogel erklärt das BroadcastReceiver und PendingIntends noch mal vielleicht etwas verständlicher auf seiner Seite. Ich denke du musst deinen Receiver nur noch im Manifest registrieren und kannst dabei auf spezielle intent-filter verzichten. Da ich aber noch nie mit dem AudioManager gespielt habe, weiss ich das natürlich nicht zu 100%, aber das ist mein educated guess.

Probier es also noch einmal mit dem Registrieren des BroadcasReceiver ohne einen Intent Filter.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Textfeld in Canvas, implementation der keys aendern Android & Cross-Platform Mobile Apps 8
J Benachrichtigung Freigabe ab Android 14 Android & Cross-Platform Mobile Apps 1
J Android Benachrichtigung zum Zeitpunkt ers Android & Cross-Platform Mobile Apps 15
J Das Beispiel von Android erzeugt Fehler Android & Cross-Platform Mobile Apps 8
J Zeitdifferenzen unter Android 7 (API < 26) berechnen Android & Cross-Platform Mobile Apps 4
W Netzwerk Verbindungen Java Android Android & Cross-Platform Mobile Apps 107
Z Android IntelliJ Android & Cross-Platform Mobile Apps 2
M Repository bei Room-Database in Android Studio (Java) Android & Cross-Platform Mobile Apps 2
Android App auf das eigene Handy bekommen Android & Cross-Platform Mobile Apps 3
Alex IV Android App erstellen Android & Cross-Platform Mobile Apps 3
OnDemand CrossPlatform Kotlin iOs/Android Datenverbrauch Android & Cross-Platform Mobile Apps 2
W In Android Studio Integer an andere activities übergeben Android & Cross-Platform Mobile Apps 2
wladp Android Studio Room Database Android & Cross-Platform Mobile Apps 1
N "Schöne" Datatable in Android und setzen von Parametern von Textview im Code Android & Cross-Platform Mobile Apps 5
N Android game programmieren Android & Cross-Platform Mobile Apps 5
T Android Studio: Einen Button in einer For Schleife verwenden Android & Cross-Platform Mobile Apps 2
K BLE Komunikation mit Android studio und esp32 Android & Cross-Platform Mobile Apps 5
G Android UDP Kommunikation Android & Cross-Platform Mobile Apps 1
M Paper DB wird in Android Studio nicht erkannt Android & Cross-Platform Mobile Apps 7
J Android zugrif auf Thread nach Handy drehen. Android & Cross-Platform Mobile Apps 10
T Android Android Augmented Faces in Java. Neue Landmarks erstellen Android & Cross-Platform Mobile Apps 1
K Android Android In-App-Purchase lädt nicht Android & Cross-Platform Mobile Apps 0
Besset Android http request an interne ip adresse funktioniert nicht Android & Cross-Platform Mobile Apps 8
J Is Android Development Head First Outdated? Android & Cross-Platform Mobile Apps 3
J Android Android Datenbankverbindung zum Raspberry Pi Android & Cross-Platform Mobile Apps 1
lolcore Android Studio -Download Documentation for Android SDK Android & Cross-Platform Mobile Apps 0
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
W Problem mit Android Studio Android & Cross-Platform Mobile Apps 0
W App Abo Android Android & Cross-Platform Mobile Apps 10
OSchriever Android Android MediaPlayer bei Anruf stoppen/pausieren Android & Cross-Platform Mobile Apps 2
OSchriever Auf onClick-Listener reagieren und Parameter übergeben (Android Studio) Android & Cross-Platform Mobile Apps 4
W removeNetwork Android App mit Spendenaktion fürs Tierheim! Android & Cross-Platform Mobile Apps 1
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
P undefinierbarer Fehler Android Android & Cross-Platform Mobile Apps 8
T Android ArrayList sortieren mit 2 Werten ohne thencomparing , Wie? Android & Cross-Platform Mobile Apps 10
W Variable überschreiben (Android Studio) Android & Cross-Platform Mobile Apps 2
ruutaiokwu Android Selbst entwickelter SMTP-Client läuft auf PC, nicht aber auf Android Android & Cross-Platform Mobile Apps 9
ruutaiokwu Android Warum muss man bei Android Studio immer 2x auf "Run" klicken damit die App auf dem Gerät startet Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android Wo das 'android.useAndroidX' property hinzufügen? Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android In einem Android-“Spinner”-Element GLEICHZEITIG Bild (links) UND Text (rechts) anzeigen Android & Cross-Platform Mobile Apps 0
P Login und Registrierung Android Anzeige Android & Cross-Platform Mobile Apps 7
S Von JavaFx zu Android Android & Cross-Platform Mobile Apps 12
K Android to Pi | Websocket Problem Android & Cross-Platform Mobile Apps 3
ruutaiokwu Wie fügt man bei Android Studio .jar-Libraries zu einem Android-Java-Projekt hinzu? Android & Cross-Platform Mobile Apps 33
M Komponenten positionieren in Android Studio 3.6.3 Android & Cross-Platform Mobile Apps 1
M Android Studio - Property-Fenster einblenden Android & Cross-Platform Mobile Apps 1
M Android Studio - App auf dem Smartphone testen Android & Cross-Platform Mobile Apps 7
M Barrierefreie Appentwicklung für Android - Suche Codebeispiele Android & Cross-Platform Mobile Apps 8
M Android Studio - Configuration fehlt Android & Cross-Platform Mobile Apps 20
M Wo kann ich das Android SDK herunterladen / wie kann ich es installieren Android & Cross-Platform Mobile Apps 3
M Unsupported class file major version 57 - Fehlermeldung bei Android Studio Android & Cross-Platform Mobile Apps 27
ruutaiokwu Android Studio (SDK) ANDROID_SDK_ROOT-Variable? Android & Cross-Platform Mobile Apps 5
O Web API in Android (JAVA) einbinden Android & Cross-Platform Mobile Apps 3
J Android Studio macht seltsame Sachen Android & Cross-Platform Mobile Apps 2
J Android 9.1 aber android Studio findet API22 Android & Cross-Platform Mobile Apps 0
Dimax Web-Seite in native app convertieren mit Android Studio Android & Cross-Platform Mobile Apps 8
A Android Studio: while-Schleife beginnt nicht Android & Cross-Platform Mobile Apps 5
lolcore android studio: fehler bei laden des emulators Android & Cross-Platform Mobile Apps 10
J Android App - Browser öffnen und Text eingeben/Button click auslösen Android & Cross-Platform Mobile Apps 10
A Android-Studio: 2. Layout nach kurzer Zeit aufzeigen Android & Cross-Platform Mobile Apps 2
A jpg wird im Android Studio nicht akzeptiert Android & Cross-Platform Mobile Apps 3
J Android Studio - ArrayList - Selected Item ermitteln Android & Cross-Platform Mobile Apps 13
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
T Bringen mir die Java-Basics irgendetwas für die Android-Programmierung Android & Cross-Platform Mobile Apps 4
J Was soll das bedeuten ? does not require android.permission.BIND_JOB_SERVICE permission Android & Cross-Platform Mobile Apps 7
A Android Studio: ImageView verpixelt Android & Cross-Platform Mobile Apps 2
J intend Service im Android Studio Android & Cross-Platform Mobile Apps 4
L Android Android Development eventuell mit Flutter Android & Cross-Platform Mobile Apps 1
S Android Layout - welchen Typ? Android & Cross-Platform Mobile Apps 3
T Fehler Android Studio: java.net.MalformedURLException: no protocol: http%3A%2F%2Fwww.mal ..... Android & Cross-Platform Mobile Apps 2
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L Android Android Contacts DB auslesen Android & Cross-Platform Mobile Apps 1
A Android Studio - App mit Nearby Android & Cross-Platform Mobile Apps 1
L Android content URI Datei einlesen Android & Cross-Platform Mobile Apps 9
N Android Game Background Service Android & Cross-Platform Mobile Apps 11
Jackii Android Android Studio Error im Testlauf ohne zu programmieren Android & Cross-Platform Mobile Apps 9
B Android Probleme mit Android Studio Android & Cross-Platform Mobile Apps 6
Excess Android Service läuft nicht in Sandby weiter Android & Cross-Platform Mobile Apps 2
B Android Projekt für Android und IOS erstellen? Android & Cross-Platform Mobile Apps 5
J App funktioniert auf Android 5, auf 6 nicht Android & Cross-Platform Mobile Apps 2
J Android Snake Android & Cross-Platform Mobile Apps 15
J Android TaschenRechner Android & Cross-Platform Mobile Apps 22
I Das Problem mit der Tastatur... android:windowSoftInputMode="adjustPan" Android & Cross-Platform Mobile Apps 1
E Wie erhalte ich Zugriff auf das Microfon? (Android Studio) Android & Cross-Platform Mobile Apps 9
C Android Programmierung speziell oder einfach Java Buch kaufen? Android & Cross-Platform Mobile Apps 3
B Android Kein Zugriff auf Telefonspeicher (Android 6) Android & Cross-Platform Mobile Apps 1
T Android Equalizer für Android Android & Cross-Platform Mobile Apps 3
L Android Android Studio - Exportierte APK funktioniert nicht Android & Cross-Platform Mobile Apps 6
L Android Methode funktioniert nicht unter Android Android & Cross-Platform Mobile Apps 3
A Beginnen mit Serverkommunikatsion in Android Studio Android & Cross-Platform Mobile Apps 6
E Android Studio Android & Cross-Platform Mobile Apps 15
L Android Android Studio Setup killt Explorer Android & Cross-Platform Mobile Apps 3
K Android Videos rendern Android & Cross-Platform Mobile Apps 1
J Variable in strings.xml (Android Studio) Android & Cross-Platform Mobile Apps 0
B Android Android Studio lässt PC abstürzen Android & Cross-Platform Mobile Apps 3
B Android App Fehler Android & Cross-Platform Mobile Apps 21
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14
G Android Push Notification Android & Cross-Platform Mobile Apps 2
Light Lux Fehlermeldung unter Android Studio Android & Cross-Platform Mobile Apps 1
D Android Android Apps direkt vom Handy aus programmieren? Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben