相关疑难解决方法(0)

是否可以将广播接收器定义为清单文件中的内部类?

我想在我的主要活动中创建一个广播接收器作为内部类.但我在清单xml文件中定义广播接收器时遇到问题,因为android无法找到它.

码:

public class MyActivity extends Activity{
    ...

    public class Receiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            ....
        }

    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

表现:

<receiver android:name=".org.danizmax.myapp.MyActivity$Receiver" android:enabled="true">
            <intent-filter>
                <action android:name="org.danizmax.myapp.BROADCAST_INITIAL_DATA"></action>
            </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

我尝试过:

  • .org.danizmax.myapp.MyActivity $接收器
  • org.danizmax.myapp.MyActivity $接收器
  • .MyActivity $接收器
  • .接收机

我看到其他人也有类似的问题,但没有找到任何答案.

那有可能吗?如果没有,有什么更好的方式来使用广播接收器?

谢谢!

android broadcastreceiver android-manifest

40
推荐指数
2
解决办法
3万
查看次数

KeyEvent.ACTION_UP为ACTION_MEDIA_BUTTON触发了TWICE

我有这个ACTION_MEDIA_BUTTON的广播接收器,它实际上适用于Android 2.x和Android 4.1,但由于一些奇怪的原因,在Android 2.x(仅限)上,我得到每个甚至两次(只需单击暂停按钮,当然):

public class RemoteControlReceiver extends BroadcastReceiver {
  private static long prevEventTime = 0;

  @Override
  public void onReceive(Context ctx, Intent intent) {
    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
      KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
      long curEventTime = event.getEventTime();
      if (event != null && (event.getAction() == KeyEvent.ACTION_UP) /*&& (curEventTime != prevEventTime)*/) {
        int keycode = event.getKeyCode();
        switch (keycode)
        {
          case KeyEvent.KEYCODE_MEDIA_NEXT:
            Log.i(TAG, "KEYCODE_MEDIA_NEXT"); 
            break;
          case KeyEvent.KEYCODE_HEADSETHOOK:
            Log.i(TAG, "KEYCODE_HEADSETHOOK" + " " +  curEventTime + " <> " + …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-audiomanager

20
推荐指数
2
解决办法
4422
查看次数

BroadcastReceiver for ACTION_MEDIA_BUTTON无效

我正在为Android OS 4.0.3(ICS)编写一个Android应用程序.问题是我没有从BroadcastReceive的onReceive()方法获取Log.d()的输出,这意味着我的应用程序没有正确处理广播.

我已经阅读了关于如何在单击ACTION_MEDIA_BUTTON时运行代码的无数问题.当我的工作不起作用时,我甚至复制+粘贴代码,只是为了看看它是否可行.

我想要处理的ACTION_MEDIA_BUTTON是耳机上的单个按钮,允许用户接听/结束通话,播放/暂停音乐.当我点击它时,而不是我的应用程序处理此按钮,我的Nexus S Android上的股票音乐播放器开始播放一首歌曲.

我没有将我的代码放在另一个类中,也许这就是为什么它不起作用?

这是在onCreate()方法上找到的代码(这个特定的代码是在我编写的代码无效后从网站上复制的):

IntentFilter mediaButtonFilter = new IntentFilter(
            Intent.ACTION_MEDIA_BUTTON);
    mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
    BroadcastReceiver brMediaButton = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            Log.d("Event", "Media button!");
            this.abortBroadcast();

            KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
            if(key.getAction() == KeyEvent.ACTION_UP) {
                int keycode = key.getKeyCode();
                if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) {
                    Log.d("TestApp", "Next Pressed");
                } else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) {
                    Log.d("TestApp", "Previous pressed");
                } else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
                    Log.d("TestApp", "Head Set Hook pressed");
                }
            }

        } …
Run Code Online (Sandbox Code Playgroud)

java android broadcastreceiver android-intent

18
推荐指数
1
解决办法
2万
查看次数

如何将参数传递给BroadcastReceiver的子类?

我按下时设法让我的应用程序识别我的耳机按钮,但其中一个按钮需要调用MyCustomActivity中的方法.问题是onReceive的第一个参数是一个不能强制转换为Activity的Context,并且使用MyCustomActivity的内部类 在Android 4.1中不起作用,除非它是静态的(具有无法访问MyCustomActivity方法的相同问题).

所以我唯一的选择(为了支持2.x和4.1)是将活动作为参数传递给RemoteControlReceiver.

但是,如何实现它的唯一方法是通过:

private ComponentName mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class);
Run Code Online (Sandbox Code Playgroud)

哪个不接受任何其他参数?

任何想法如何解决这个限制?

注意:如果我尝试定义RemoteControlReceiver具有参数的构造函数,则会收到以下异常:

E/AndroidRuntime(2836): java.lang.RuntimeException: Unable to instantiate receiver com.example.RemoteControlReceiver: java.lang.InstantiationException: can't instantiate class com.example.RemoteControlReceiver; no empty constructor

Caused by:
E/AndroidRuntime(2836): Caused by: java.lang.InstantiationException: can't instantiate class com.example.RemoteControlReceiver; no empty constructor
E/AndroidRuntime(2836):     at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(2836):     at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime(2836):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2205)
Run Code Online (Sandbox Code Playgroud)

很明显,这个新的registerMediaButtonEventReceiver要求(在Android 4.1中引入)需要一个空的构造函数.

有没有办法解决这个问题?

例如,有没有办法获得对实际RemoteControlReceiver对象的引用(通过间接实例化mAudioManager.registerMediaButtonEventReceiver())?这样我可以使用访问器在实例化设置RemoteControlReceiver的数据成员吗?

java android broadcastreceiver android-audiomanager

11
推荐指数
1
解决办法
3238
查看次数

在Android上捕获媒体按钮> = 4.0(适用于2.3)

我写了一些服务,使用BroadcastReceiver来捕获媒体按钮之一(来自耳机的"播放按钮"),它在Android 2.3.x(HTC Nexus One或HTC Desire)上运行完美

当我试图在Android 4.0.3(三星Nexus S)上运行它不起作用(我的应用程序没有收到意图"android.intent.action.MEDIA_BUTTON"和"播放"按钮表现如常:停止/启动音乐).

清单内容:

...
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <receiver android:name=".buttonreceiver.MediaButtonIntentReceiver" >
        <intent-filter android:priority="10000" >
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
...
Run Code Online (Sandbox Code Playgroud)

有没有办法让它在android 4.0.3上运行


编辑:我已尝试提出解决方案,我已添加操作并运行它,但我的接收器仍然没有收到意图.什么更奇怪的代码注册接收器也不起作用:

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

    Log.d("MR", "onCreate - " + getIntent().getAction());

    mReceiver = new MediaButtonIntentReceiver();
    registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_MEDIA_BUTTON));
}
Run Code Online (Sandbox Code Playgroud)

现在我完全糊涂了.

android broadcastreceiver android-manifest android-4.0-ice-cream-sandwich

10
推荐指数
1
解决办法
2万
查看次数

Android:处理耳机按钮事件和向MainActivity发送信息

这是我努力制作一个工作代码来处理耳机按钮事件的最佳方式.我阅读了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)

android headset

7
推荐指数
1
解决办法
4356
查看次数

如何在清单中注册 *inner* MEDIA_BUTTON BroadcastReceiver?

设法让我的耳机按钮在按下时被我的应用程序识别,但其中一个按钮需要调用 MyCustomActivity 中的方法。问题是 onReceive 的第一个参数是一个无法转换为 Activity 的上下文,因此我被迫将 BroadcastReceiver 实现为 MyCustomActivity 中的内部类。

到目前为止一切顺利,但如何在清单中注册这个内部 MediaButtonEventReceiver?

对于独立类,这很简单:

<receiver android:name=".RemoteControlReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

对 MyCustomActivity 的 mReceiver 执行相同操作的技巧/语法是什么?

  private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context ctx, Intent intent) {
         // ...
        }
  }
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-audiomanager

3
推荐指数
1
解决办法
1603
查看次数