Может ли ACTION_USER_PRESENT BroadcastReceiver не быть зарегистрирован в манифесте? - PullRequest
2 голосов
/ 30 августа 2010

Я вижу, что несколько трансляций (например, 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>

Есть мысли? По сути, я пытаюсь создать Receiver, который пробуждается как можно скорее после установки моего приложения. В первый раз, когда он пробуждается, он регистрирует несколько слушателей, а затем он сам отменяет регистрацию, чтобы его никогда не вызывали снова. (Мне бы очень хотелось, чтобы сразу после установки приложения было выполнено намерение, чтобы можно было немного настроить :))

Ответы [ 4 ]

6 голосов
/ 30 августа 2010

Правильно - ни ACTION_SCREEN_ON, ни ACTION_USER_PRESENT не могут быть зарегистрированы в манифесте.Я подал ошибку документации по этому вопросу.

2 голосов
/ 14 ноября 2011

В любом случае, вы можете использовать context.registerReceiver(), который поможет вам и сохранит чистоту вашего манифеста. Ссылка

1 голос
/ 26 сентября 2013

регистрация ACTION_USER_PRESENT в файле манифеста срабатывает не всегда.В моем nexus4, если я регистрирую ACTION_USER_PRESENT в файле манифеста, он вообще не работает, тогда как регистрация в Activity работает нормально.

0 голосов
/ 17 марта 2015

У меня была такая же проблема, и я ее исправил (проверено на 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 больше нигде не зарегистрирован. Я регистрирую ACTION_SCREEN_OFF и ON в методе onCreate моего сервиса, который был вызван моим получателем.

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