Pergunta

Eu vejo que várias transmissões (Action_time_tick, por exemplo) não pode ser registrado no manifesto, o deve ser explicitamente registrado via Context.registerReceiver(). Estou tendo problemas com o Action_User_Present intenção de transmissão. Especificamente, eu testo no emulador e meu aplicativo mantém o fechamento da força com o erro:

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

Isso é causado por

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

Meu manifesto é bastante simples:

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

Alguma ideia? Estou essencialmente tentando criar um receptor que seja despertado o mais rápido possível após a instalação do meu aplicativo. A primeira vez que é despertada, ele registra alguns ouvintes e depois se recompra para que nunca seja chamado novamente. (Eu realmente gostaria que houvesse uma intenção disparada imediatamente após a instalação do seu aplicativo, para permitir um pouco de configuração :))

Foi útil?

Solução

Correto - nem ACTION_SCREEN_ON nem ACTION_USER_PRESENT pode ser registrado no manifesto. Eu tenho arquivou um bug de documentação nesse assunto.

Outras dicas

Qualquer caminho, você pode usar context.registerReceiver() O que fará o truque e manterá seu manifesto limpo. Link

Registrar Action_User_Present no arquivo manifesto nem é acionado sempre. No meu nexus4, se eu registrar action_user_presed no arquivo manifesto, ele não funciona de todo, enquanto o registro na atividade funciona bem.

Eu tive o mesmo problema e o corrigi (testado em 4.3 e 5.1). Consegui declarar "android.intent.action.user_presed" dentro do manifesto, desde que você tenha a permissão Read_Phone_State, está tudo bem !! Meu Mini App consiste em um receptor de transmissão que reage à tela On/Off State e executa um serviço em segundo plano que faz reconhecimento contínuo de voz. Se a tela estiver desativada, o reconhecimento será desligado. Aqui está o código, aproveite: Manifesto:

<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>

RECEPTOR DE RADIODIFUSÃO:

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);  
            }
        }  
}

Como você pode imaginar, meu receptor de transmissão user_presess não está registrado em nenhum outro lugar. Registro Action_screen_off e no método OnCreate do meu serviço, que foi acionado pelo meu receptor.

@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"); 
    }

Finalmente, eu registro a tela liga/desliga no OnDestroy () do meu serviço:

@Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(launcher);}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top