当我的应用程序在后台运行 运行 时插入耳机时执行某些操作。 (如果可能的话我想用广播接收器来做)

Do something when a headset is plugged in when my app is running in the background. (if possible i want to do it with broadcast receivers)

当我的应用程序在后台 运行 时,我想在插入耳机时执行一些操作。 (如果可能的话我想用广播接收器来做)

我试过下面的代码:

--接收广播--

package com.example.openmusiconheadsetconnect;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class ReceiveBroadcast extends BroadcastReceiver {
    public ReceiveBroadcast() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"Received!",Toast.LENGTH_LONG).show();
    }
}

--清单--

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.openmusiconheadsetconnect" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver
            android:name=".ReceiveBroadcast"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.HEADSET_PLUG" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

谢谢!

您的代码是正确的,但据我所知,您不能将 HEADSET_PLUG 过滤器放在清单上。 相反,在其自己的 class 中创建一个接收器,并让它在清单中监听 USER_PRESENT(屏幕解锁)或 BOOT_COMPLETED:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
<receiver android:name="classes.myReceiver" >        
             <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
    </receiver>

当被此类事件触发时,您的接收器应该启动服务:

public class myReceiver extends BroadcastReceiver {
    @Override 
    public void onReceive(Context ctx, Intent intent) {     
        Intent service = new Intent(ctx, VoiceLaunchService.class);
        if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)||intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            ctx.startService(service);
            }
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            ctx.stopService(service);  
            }
        }

该服务现在将在其 onCreate 方法中注册将侦听 HEADSET_PLUG 意图的接收器:

@Override
public void onCreate() {
    super.onCreate();   
    speechReconRx=new SpeechReconControlReceiver(this);//"this" will allow you to call service's methods from the receiver
    registerReceiver(speechReconRx, new IntentFilter(Intent.HEADSET_PLUG)); 
    }

这很麻烦,但如果您不想使用 activity,则需要它。 google 不让我们把 PLUG 接收器放在清单中是错的!最后制作插上耳机就会动作的Broadcast。

public class SpeechReconControlReceiver extends BroadcastReceiver {
    @Override 
    public void onReceive(Context ctx, Intent intent) {     
       Log.e("joshcsr","HEADSET PLUGGED!");
        if(intent.getStringExtra("command")!=null){
            c=intent.getStringExtra("command");
            }
        //run some methods from the service
        if (c.equals("resume")) {           
            sService.resume();  
            }

        if (c.equals("pause")) {            
            sService.pause();  
            }

        if (c.equals("stop")) {         
            sService.stop();  
            }       
        }
    }

最后,您需要: *BOOT/Screen 解锁事件的接收器。 *一项服务,用于在后台保存所有 运行 内容并注册您的耳机收听广播。 *还有耳机插头的接收器,它将采取行动并调用服务中托管的方法。

我昨天做了这个,它适用于从 Jelly bean 到 Lollipop ...甚至更旧的版本。干杯。

首先,您需要获得启动完成后在后台启动应用程序的权限。

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

并在您的广播接收器中指定此项,

<receiver android:name=".YourBroadcastReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

然后创建一个 service,运行 您的应用程序在后台,并在服务内部使用 AudioManager.isWiredHeadsetOn() 检查耳机是否已插入。如果是,则执行任务你要。

while(AudioManager.isWiredHeadsetOn()){
    //your task goes here
}

同时在manifest

中添加权限
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />