我有内部类作为广播接收器:
public class ManualBacklightReceiver extends BroadcastReceiver {
public static final String ACTION_MANUAL_BACKLIGHT = "com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT";
public ManualBacklightReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("ManualBacklightReceiver", intent.getAction());
}
};
Run Code Online (Sandbox Code Playgroud)
AndroidManifest:
<receiver android:name=".statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver">
<intent-filter>
<action android:name="com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
当我用这段代码发送意图时:Intent intent = new Intent();
intent.setAction("com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
我得到以下例外:
java.lang.RuntimeException: Unable to instantiate receiver com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver:
java.lang.InstantiationException: can't instantiate class com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver; no empty constructor
Caused by: java.lang.InstantiationException: can't instantiate class com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver; no empty constructor
Run Code Online (Sandbox Code Playgroud)
但我有一个空的构造函数!为什么它不起作用?
我有一个带单键的耳机,按下按钮时想要做一个简单的Toast.
现在我有以下代码:
public class MediaButtonIntentReceiver extends BroadcastReceiver {
public MediaButtonIntentReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
return;
}
KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
return;
}
int action = event.getAction();
if (action == KeyEvent.ACTION_DOWN) {
// do something
Toast.makeText(context, "BUTTON PRESSED!", Toast.LENGTH_SHORT).show();
}
abortBroadcast();
}
}
Run Code Online (Sandbox Code Playgroud)
我的主要活动如下:
public class mainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void …Run Code Online (Sandbox Code Playgroud) 目标是拦截来自耳机的广播以及最终的蓝牙,以响应来自耳机的不同类型的点击以改变媒体播放器.此解决方案适用于ICS之前的所有版本.这是我尝试过的一些代码和事情:
....
private BroadcastReceiver mediaButtonReceiver = new MediaButtonIntentReceiver();
....
public void onCreate() {
...
IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
mediaFilter.setPriority(2147483647); // this is bad...I know
this.registerReceiver(mediaButtonReceiver, mediaFilter);
...
}
public class MediaButtonIntentReceiver extends BroadcastReceiver {
private KeyEvent event;
public MediaButtonIntentReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
return;
}
event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
return;
}
try {
int action = event.getAction();
switch(action) {
case KeyEvent.ACTION_UP …Run Code Online (Sandbox Code Playgroud) android media-player android-intent android-4.0-ice-cream-sandwich
这是我努力制作一个工作代码来处理耳机按钮事件的最佳方式.我阅读了Android开发人员指南,但这显然是错误的,因为他们要求开始监听注册类名.
am.registerMediaButtonEventReceiver(RemoteControlReceiver); // Wrong
Run Code Online (Sandbox Code Playgroud)
所以我查看其他示例以更正代码.例如,在这个问题中已经发布了许多秘密建议,我还尝试了其他代码,例如这个,以及MediaSession的另一个解决方案,并清理不需要的我写了这段代码:
我实现了RemoteControlReceiver类.显然,不需要静态内部类,事实上,请看这条评论:
public class RemoteControlReceiver extends BroadcastReceiver {
public RemoteControlReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show();
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {
Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在MainActivity onCreate(){ ...中注册了意图
AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
ComponentName mReceiverComponent = new ComponentName(this, RemoteControlReceiver.class);
am.registerMediaButtonEventReceiver(mReceiverComponent);
Run Code Online (Sandbox Code Playgroud)
registerMediaButtonEventReceiver被弃用了......
在清单中我记录了过滤器,在活动标记之后:
<activity>
... …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个在配对的蓝牙设备上按下按钮时触发点击侦听器的应用程序。搜寻了几个小时后,我认为我无法将蓝牙设备按钮的键码发送到广播接收器,如果该键码匹配,那么我可以呼叫点击监听器,或者我的方法和理解是错误的,所以有人可以指导我吗或指出正确的方法?提前致谢
蓝牙设备:蓝牙自拍遥控器AB快门3
我想要这样的东西 http://www.barbatricks.com/en/android-zh/remap-ab-shutter-3-selfie-remote/
我尝试了以下链接作为参考,但未成功
ACTION_MEDIA_BUTTON的BroadcastReceiver无法正常工作
http://blog.phonedeveloper.com/2015/04/how-to-receive-bluetooth-broadcast.html
android bluetooth broadcastreceiver android-broadcastreceiver
我试着花时间System.currentTimeMillis(),而不是用户按下媒体按钮.但回调是在媒体按钮再次上升时执行的action == KeyEvent.ACTION_UP.
我不想在我的解决方案中使用BroadcastReceiver.
这是我的代码:
MediaSession audioSession = new MediaSession(getApplicationContext(), "TAG");
audioSession.setCallback(new MediaSession.Callback() {
@Override
public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
String intentAction = mediaButtonIntent.getAction();
if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction))
{
KeyEvent event = (KeyEvent)mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event != null)
{
int action = event.getAction();
if (action == KeyEvent.ACTION_DOWN) {
long stopTimeOfGame_millis = System.currentTimeMillis();
UtilsRG.info("time stopped: " +stopTimeOfGame_millis);
}
if (action == KeyEvent.ACTION_UP) {
long test = System.currentTimeMillis();
UtilsRG.info("time stopped up: " +test);
}
}
}
return super.onMediaButtonEvent(mediaButtonIntent);
}
}); …Run Code Online (Sandbox Code Playgroud) 我想知道如何在长按媒体按钮时启动活动.在这种情况下,我不想启动默认活动:媒体阅读器,当短按媒体按钮时,必须保持该功能.
希望,我已经明白了.
AL
辅助问题:为什么某些硬键(如搜索按钮)可以直接启动在manifest.xml的activity属性中指定它的活动,而其他硬件(如媒体按钮)仅用于广播操作?
android ×7
java ×2
android-4.0-ice-cream-sandwich ×1
bluetooth ×1
button ×1
headset ×1
launch ×1
media ×1
media-player ×1