我看到多种广播( 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>

任何想法?我基本上是试图创建安装我的应用程序后很快惊醒尽可能接收器。它第一次被唤醒时,它注册了几个听众,然后将其注销本身,以便它永远不会再次调用。 (我真希望有意向马上还以颜色已安装应用程式后,允许设置一个小一点的:))

有帮助吗?

解决方案

正确 - ACTION_SCREEN_ON也不ACTION_USER_PRESENT既不可以在清单中注册。我有对这个问题提出了文档错误

其他提示

Eitherway,你可以使用context.registerReceiver()这将这样的伎俩,并保持你的清单干净。 链接

在清单文件注册ACTION_USER_PRESENT并不总是得到触发。在我nexus4如果我注册清单文件ACTION_USER_PRESENT那么它根本不工作,而在活动注册工作正常。

我有同样的问题,我固定它(在4.3和5.1测试)。我能够申报“android.intent.action.USER_PRESENT”里面的表现,只要你有READ_PHONE_STATE许可,这是OK!我的迷你应用程序由广播接收机的是反作用于屏幕ON / OFF状态,并运行一个后台服务,做连续语音识别。如果屏幕处于关闭状态,识别被关闭。下面是代码,享受:清单:

<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);}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top