2

我看到多个广播(例如ACTION_TIME_TICK)无法在清单中注册,必须通过Context.registerReceiver(). 我在ACTION_USER_PRESENT广播意图方面遇到问题。具体来说,我在模拟器上进行测试,我的应用程序会因错误而强制关闭:

08-30 09:44:23.397: ERROR/AndroidRuntime(290): java.lang.RuntimeException: Unable to start receiver me.turnerha.RegisterListeners: java.lang.IllegalArgumentException: Receiver not registered: me.turnerha.RegisterListeners@43d05690

这是由

08-30 09:44:23.397: ERROR/AndroidRuntime(290): Caused by: java.lang.IllegalArgumentException: Receiver not registered: me.turnerha.RegisterListeners@43d05690

我的清单相当简单:

    <receiver android:name=".RegisterListeners">
        <intent-filter>
            <action android:name="android.intent.action.SCREEN_ON" />
        </intent-filter>
    </receiver>

有什么想法吗?我实际上是在尝试创建一个在我的应用程序安装后尽快唤醒的接收器。第一次被唤醒时,它会注册一些监听器,然后它会注销自己,因此它不再被调用。(我真的希望在安装您的应用程序后立即触发一个意图,以便进行一些设置:))

4

4 回答 4

7

正确 - 既ACTION_SCREEN_ON不能也ACTION_USER_PRESENT不能在清单中注册。我已经就这个问题提交了一个文档错误

于 2010-08-30T15:03:37.260 回答
2

无论哪种方式,您都可以使用context.registerReceiver()which 来解决问题,并保持清单清洁。关联

于 2011-11-14T09:37:00.187 回答
1

在清单文件中注册 ACTION_USER_PRESENT 并不总是被触发。在我的 nexus4 中,如果我在清单文件中注册 ACTION_USER_PRESENT 则它根本不起作用,而在 Activity 中注册工作正常。

于 2013-09-26T06:12:36.303 回答
0

我遇到了同样的问题并修复了它(在 4.3 和 5.1 上测试)。我可以在清单中声明“android.intent.action.USER_PRESENT”,只要你有 READ_PHONE_STATE 权限,就可以了!!我的迷你应用程序包含一个广播接收器,它对屏幕的开/关状态做出反应,并运行一个后台服务来进行连续的语音识别。如果屏幕关闭,则识别将关闭。这是代码,享受:清单:

<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);}
于 2015-03-17T15:36:59.163 回答