gpt4 book ai didi

android - 为什么这个广播接收器在 Android Lollipop 中不起作用?

转载 作者:行者123 更新时间:2023-11-29 01:34:43 25 4
gpt4 key购买 nike

我在 list 中声明了这个广播接收器:

<receiver android:name="classes.VoiceLaunchReceiver" >
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

我的接收器类:

public class VoiceLaunchReceiver extends android.content.BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent intent) {
Intent service = new Intent(ctx, VoiceLaunchService.class);
// service.putExtra(action, true);
Log.i("joscsr","Incoming Voice Launch Broadcast...");

if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
Log.e("joshcsr", "***********\nCSR Resumed (BC)\n************");
ctx.startService(service);
}
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Log.e("joshcsr", "***********\nCSR STOPPED by SCREEN (BC)\n************");
ctx.stopService(service);
}
}
}

我在服务的 onCreate 方法中注册了 SCREEN_OFF Intent :

@Override
public void onCreate() {
super.onCreate();
//Register screen OFF BroadCast
IntentFilter mIntentFilter=new IntentFilter(Intent.ACTION_SCREEN_OFF);
registerReceiver(speechBroadcastReceiver, mIntentFilter);
}

只要用户取消阻止并打开屏幕,它就会执行它的操作。它在 Jellybean 4.3 及更低版本中完美运行:每当屏幕锁定或解锁时,我的广播接收器中的 Logcat 都会显示。为什么这个确切的代码在 Lollipop 中不起作用?是否有我必须改听的新 Intent?

(我已经知道系统发送了那个 Intent ,我想要的是用我的接收器检测它)

最佳答案

我遇到了同样的问题并修复了它(在 4.3 和 5.1 上测试过)。我能够在 list 中声明 "android.intent.action.USER_PRESENT",只要您拥有 READ_PHONE_STATE 权限,就可以了!!我的迷你应用程序包含一个对屏幕开/关状态使用react的广播接收器,并运行一个后台服务来进行连续语音识别。如果屏幕关闭,则识别被关闭。

代码如下,欣赏:MANIFEST:

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

广播接收器:

public class VoiceLaunchReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent intent) {
Intent service = new Intent(ctx, VoiceLaunchService.class);
// service.putExtra(action, true);
Log.i("joscsr","Incoming Voice Launch Broadcast...");

if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
Log.i("joshcsr", "************\nCSR Resumed (BC)\n************");
ctx.startService(service);
}
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Log.i("joshcsr", "************\nCSR STOPPED by SCREEN (BC)\n************");
ctx.stopService(service);
}
}
}

如您所想,我的 USER_PRESENT 广播接收器未在其他任何地方注册。我确实在我的服务的 onCreate 方法中注册了 ACTION_SCREEN_OFF 和 ON,这是由我的接收器触发的。

@Override
public void onCreate() {
super.onCreate();
//Register screen ON/OFF BroadCast
launcher=new VoiceLaunchReceiver();
IntentFilter i=new IntentFilter(Intent.ACTION_SCREEN_OFF);
i.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(launcher,i);
Log.d("joshcsr","VoiceLaunch Service CREATED");
}

最后,我在服务的 onDestroy() 中注销屏幕开/关:

@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(launcher);}

关于android - 为什么这个广播接收器在 Android Lollipop 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29094928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com