【问题标题】:Capture media button on Android >=4.0 (works on 2.3)在 Android >=4.0 上捕获媒体按钮(适用于 2.3)
【发布时间】:2013-11-21 08:32:03
【问题描述】:

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

当我尝试在 Android 4.0.3 (Samsung 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>
...

有没有办法让它在 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));
}

现在我完全糊涂了。

【问题讨论】:

  • 另请注意,Intent 优先级必须大于 -1000 且小于 1000。

标签: android broadcastreceiver android-manifest android-4.0-ice-cream-sandwich


【解决方案1】:

确保您的应用中有一个 Activity,并且用户在尝试按下该按钮之前运行了该 Activity。在那之前,你的&lt;receiver&gt;will not receive any broadcasts


更新

在 Android 4.0 及更高版本上,您似乎还需要调用 registerMediaButtonEventReceiver() on AudioManager 才能接收事件。该状态将一直保持到其他人调用registerMediaButtonEventReceiver() 或直到您调用unregisterMediaButtonEventReceiver()

例如,像这样的活动:

public class MediaButtonActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(
                                                                                                       this,
                                                                                                       MediaButtonReceiver.class));
  }
}

将使清单注册的MediaButtonReceiver 能够获取 ACTION_MEDIA_BUTTON 事件。

【讨论】:

  • 我只有运行语音识别并发送一些其他信息的服务。这在 Android 2.3.x 上运行良好。这是唯一可能的解决方法吗?运行活动需要活动屏幕来接收意图,这对我来说是不可接受的..
  • @MarekR:“这是唯一可能的解决方法吗?” - 是的,虽然我怀疑你不理解修复。他们不必让活动继续运行。他们只需手动启动一次您的活动,即可将您的应用程序从停止状态中移出。请阅读我的回答中链接到的博客文章。
  • 它不起作用。我的意思是我已经添加了 Activity 并运行它,但我仍然无法捕获“android.intent.action.MEDIA_BUTTON”,即使 Activity 正在运行我的接收器没有得到这个意图。
  • 由于某些原因,Samsung Nexus S 的键映射不同,此外它仅在活动开启时才有效。我应该提供不同的上下文以使其始终工作(我的意思是在活动至少启动一次之后)?
  • @MarekR:“出于某种原因,Samsung Nexus S 的键映射不同,此外它仅在活动开启时才有效。” -- 即使我使用 DDMS 强制终止进程,我的测试应用也成功接收到事件。
【解决方案2】:

如果您只想让您的应用成为默认应用,但不需要对按钮进行任何操作,您可以使用以下方法。

将此添加到清单文件(在“应用程序”节点中):

    <receiver android:name="BroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
</receiver>

将此添加到主活动中的 onCreate() 或应用程序运行时调用的任何位置。在 onResume() 事件中也可能有用:

    mAudioManager =  (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
    mRemoteControlResponder = new ComponentName(getActivity().getPackageName(), BroadcastReceiver.class.getCanonicalName());

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多