У меня была такая же проблема, и я ее исправил (проверено на 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);}