Обнаружение разблокировки экрана

Я использовал решение оттуда: Android - обнаружить событие разблокировки телефона, а не экран

Итак, моя активность onCreate:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    registerReceiver(
       new PhoneUnlockedReceiver(), new IntentFilter("android.intent.action.USER_PRESENT")
    );
}

И мой класс приемника:

public class PhoneUnlockedReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        KeyguardManager keyguardManager = 
            (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
        if (keyguardManager.isKeyguardSecure())
        {
            Toast.makeText(context, "Screen unlocked", Toast.LENGTH_LONG).show();
        }
    }
}

Но это не работает, мой метод onReceive никогда не вызывается. Есть идеи, что не так?

Мой манифест Android:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.michal.popupmenu"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

Насколько я знаю, нет необходимости что-либо добавлять в манифест, если я решу использовать registerReceiver, верно?


person user1209216    schedule 09.09.2016    source источник
comment
опубликуйте свой Manifest.xml здесь   -  person Nikhil    schedule 09.09.2016
comment
Возможный дубликат Способ получить событие разблокировки в Android?   -  person Jitesh Prajapati    schedule 09.09.2016
comment
Будет ли это работать, если вместо этого вы зарегистрируетесь в манифесте?   -  person Tim    schedule 09.09.2016
comment
Не делайте этого registerReceiver(new PhoneUnlockedReceiver(), ..), вы не сможете отменить регистрацию, потому что у вас нет ссылки на получателя и есть утечка   -  person Tim    schedule 09.09.2016


Ответы (2)


Насколько я знаю, нет необходимости что-либо добавлять в манифест, если я решу использовать registerReceiver, верно?

Неправильный. Преимущество зарегистрированного приемника в манифесте заключается в том, что оно не требует, чтобы ваше приложение было запущено при запуске Intent.

Таким образом, ваше приложение, вероятно, не активно, когда пользователь разблокирует экран, поэтому registerReceiver() не вызывается, и поэтому ваш приемник не реагирует.

Добавьте приемник в свой манифест, и он будет работать.

person WarrenFaith    schedule 09.09.2016

Извините, но может ли кто-нибудь объяснить функцию: keyguardManager.isKeyguardSecure() всегда возвращать false, когда я не устанавливаю PIN-код/шаблон/пароль, возвращать true при установке PIN-кода/шаблона/пароля, хотя экран заблокирован/разблокирован. Так как же может работать приведенный выше код:

if (keyguardManager.isKeyguardSecure())
        {
            Toast.makeText(context, "Screen unlocked", Toast.LENGTH_LONG).show();
        }

Спасибо.

person RoShan Shan    schedule 09.09.2016
comment
Я удалил его из своего кода, я использовал только onReceive. Я тоже не уверен, для чего это было. - person user1209216; 09.09.2016