当我的应用程序在后台运行 运行 时插入耳机时执行某些操作。 (如果可能的话我想用广播接收器来做)
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" />
当我的应用程序在后台 运行 时,我想在插入耳机时执行一些操作。 (如果可能的话我想用广播接收器来做)
我试过下面的代码:
--接收广播--
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" />