web-dev-qa-db-ja.com

Android全画面通知はロック画面に表示されません

Android全画面通知を作成して、目覚まし時計のようなロック画面上でのアクティビティを表示しようとしています。

通知は常に発生しますが、ロック画面でアクティビティが開始されることはありません。電話がオフの場合は、着信音が鳴り、ロック画面に通知アイコンが表示されます。電話が期待どおりにオンの場合、ヘッドアップ通知が表示されます。デバッグプリントは、通知チャネルが要求どおりに重要度HIGH/4で正常に登録されたことを示します。

5つの異なるAndroidデバイスのバージョン:Android 10、8.0.0、6.0.1、5.1.1で試してみました。

以下にリンクしているAndroid開発者向けドキュメントを参照しました。同様のスタックオーバーフローの質問もいくつかリンクしました。

https://developer.Android.com/training/notify-user/time-sensitive

https://developer.Android.com/training/notify-user/build-notification#urgent-message

フルスクリーンインテントではアクティビティは開始されませんが、通知は表示されますAndroid 1

フルスクリーン通知

以下は、最小限のバージョンのアプリケーションコードです。画面がロックされた後に発生するようにブロードキャストレシーバーで通知をスケジュールするためのボタンが1つあるアクティビティがあります。

    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    minSdkVersion 25
    targetSdkVersion 29

    <uses-permission Android:name="Android.permission.DISABLE_KEYGUARD" />
    <uses-permission Android:name="Android.permission.USE_FULL_SCREEN_INTENT" />

public class AppReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (FullscreenActivity.FULL_SCREEN_ACTION.equals(intent.getAction()))
            FullscreenActivity.CreateFullScreenNotification(context);
    }
}

public class FullscreenActivity extends AppCompatActivity {

    private static final String CHANNEL_ID = "my_channel";
    static final String FULL_SCREEN_ACTION = "FullScreenAction";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_fullscreen);
        createNotificationChannel(this);
    }

    /**
     * Use button to set alarm manager with a pending intent to create the full screen notification
     * after use has time to shut off device to test with the lock screen showing
     */
    public void buttonClick(View view) {
        Intent intent = new Intent(this, AppReceiver.class);
        intent.setAction(FULL_SCREEN_ACTION);
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        if (am != null) {
            am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 15000, pi);
        }
    }

    static void CreateFullScreenNotification(Context context) {
        Intent fullScreenIntent = new Intent(context, FullscreenActivity.class);
        fullScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);//?
        PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(context, 0,
                fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(context, CHANNEL_ID)
                        .setSmallIcon(R.drawable.ic_launcher_background)
                        .setContentTitle("Full Screen Alarm Test")
                        .setContentText("This is a test")
                        .setPriority(NotificationCompat.PRIORITY_HIGH)
                        .setCategory(NotificationCompat.CATEGORY_CALL)
                        .setDefaults(NotificationCompat.DEFAULT_ALL) //?
                        .setFullScreenIntent(fullScreenPendingIntent, true);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
        notificationManager.notify(1, notificationBuilder.build());
    }

    private static void createNotificationChannel(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager notificationManager = context.getSystemService(NotificationManager.class);

            if (notificationManager != null && notificationManager.getNotificationChannel(CHANNEL_ID) == null) {
                NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "channel_name", NotificationManager.IMPORTANCE_HIGH);
                channel.setDescription("channel_description");
                notificationManager.createNotificationChannel(channel);
            }

            //DEBUG print registered channel importance
            if (notificationManager != null && notificationManager.getNotificationChannel(CHANNEL_ID) != null) {
                Log.d("FullScreenActivity", "notification channel importance is " + notificationManager.getNotificationChannel(CHANNEL_ID).getImportance());
            }
        }
    }
}
2
Robb Peebles

私にとって、助けとなったのは この質問に対するRanjith Kumarの回答 でした。

以下は、Javaでの同じコードです。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    // For newer than Android Oreo: call setShowWhenLocked, setTurnScreenOn
    setShowWhenLocked(true);
    setTurnScreenOn(true);

    // If you want to display the keyguard to Prompt the user to unlock the phone:
    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    keyguardManager.requestDismissKeyguard(this, null);
} else {
    // For older versions, do it as you did before.
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
0
user1987392