使用没有活动的服务监听媒体按钮(耳机挂钩)

时间:2013-08-24 22:43:28

标签: android broadcastreceiver android-service intentservice

如何在Android设备中提供服务侦听媒体按钮(耳机挂钩)。 我尝试使用此代码执行此操作但不起作用。 你能帮帮我吗?

服务代码:

public class RLservice extends IntentService {
    private Handler handler;

    public RLservice() {
        super("my service");
        // TODO Auto-generated constructor stub
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handler = new Handler();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    protected void onHandleIntent(Intent arg0) {

        String intentAction = arg0.getAction();
        if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
            KeyEvent event = (KeyEvent) arg0
                    .getParcelableExtra(Intent.EXTRA_KEY_EVENT);

            if (event == null) {
                return;
            }

            int keycode = event.getKeyCode();
            int action = event.getAction();
            long eventtime = event.getEventTime();

            if (keycode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
                    || keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
                if (action == KeyEvent.ACTION_DOWN) {
                    // Start your app here!
                    handler.post(new Runnable() {

                        public void run() {
                            // TODO Auto-generated method stub
                            Toast.makeText(getApplicationContext(), "Welcome",
                                    Toast.LENGTH_LONG).show();
                        }
                    });

                }
            }
        }

    }

}

这是reciver代码:

public class RLreciver extends BroadcastReceiver
{


    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub

        Intent i=new Intent(RLservice.class.getName());
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        arg0.startService(i);               
        }

}

这很明显:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ypu.RLservice"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <receiver android:name=".RLreciver" >
            <intent-filter android:priority="100000" >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.MEDIA_BUTTON" />
            </intent-filter>
        </receiver>

        <service
            android:name=".RLservice"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.ypu.RLservice.RLservice" />
            </intent-filter>
        </service>
    </application>

</manifest>

提前谢谢。

1 个答案:

答案 0 :(得分:2)

您的服务期望Intent采取ACTION_MEDIA_BUTTON Intent行动。您没有使用此类Intent启动服务。

变化:

    Intent i=new Intent(RLservice.class.getName());
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    arg0.startService(i);

为:

    arg1.setClass(this, RLservice.class);
    arg0.startService(arg1);

这将有效地将广播“重定向”为命令到您的服务,动作和附加功能完好无损。

此外:

  • 摆脱android:process=":remote",因为这里没有必要,并且是用户敌对的

  • 摆脱<intent-filter>中的<service>,除非您打算让其他百万个应用程序调用此服务