Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

show notifications on lock screen

I set up GCM notifications successfully and can get the message from Server side success via GCM.

I also can show notification on notification bar system in android via these codes.

I try to show notification on lock screen by using these ways but not worked :

1 - Add <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> permission

2 - Add android:showOnLockScreen="true" in main activity defined in manifest.xml

3 - Add into main Activity in java file : getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

4 - Check Show notifications check box in App Settings System already.

People who know how to show notification on Lock screen,

Please help me, I did so many searching but not help.

Thank you,

p/s :

I'm testing with Samsung S3, Android 4.3. Enable Lock screen page already.

I call show notification method from Intent Service.

Codes show notification :

// Put the message into a notification and post it.
// This is just one simple example of what you might choose to do with
// a GCM message.
private void sendNotification(String msg) {
    mNotificationManager = (NotificationManager)
            this.getSystemService(Context.NOTIFICATION_SERVICE);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, Pas.class)
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                            | Intent.FLAG_ACTIVITY_CLEAR_TASK),
            PendingIntent.FLAG_CANCEL_CURRENT);
    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_play_dark)
                    .setContentTitle("");
    // Set Big View style to see full content of the message
    NotificationCompat.BigTextStyle inboxStyle =
            new NotificationCompat.BigTextStyle();

    inboxStyle.setBuilder(mBuilder);
    inboxStyle.bigText("");
    inboxStyle.setBigContentTitle("");
    inboxStyle.setSummaryText("");

    // Moves the big view style object into the notification object.
    mBuilder.setStyle(inboxStyle);
    mBuilder.setContentText(msg);
    mBuilder.setDefaults(Notification.DEFAULT_ALL);
    mBuilder.setContentIntent(contentIntent);

    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

I use these permissions :

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.trek2000.android.pas.permission.C2D_MESSAGE" />

<permission
    android:name="com.trek2000.android.pas.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name="com.android.pas.Pas"
        android:showOnLockScreen="true"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

    <!-- Receiver GCM -->
    <receiver
        android:name = "receiver.GcmBroadcastReceiver"
        android:permission = "com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name = "com.google.android.c2dm.intent.RECEIVE" />

            <category android:name = "com.trek2000.android.pas" />
        </intent-filter>
    </receiver>

    <!-- Services -->
    <service
        android:name = "service.GcmIntentService"
        android:exported = "true" />

</application>
like image 596
Huy Tower Avatar asked Aug 24 '15 03:08

Huy Tower


1 Answers

I managed to get notification shown in lock screen this way.

Here is the complete code with comments.

// Logic to turn on the screen
PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);

if (!powerManager.isInteractive()){ // if screen is not already on, turn it on (get wake_lock for 10 seconds)
    PowerManager.WakeLock wl = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK |PowerManager.ACQUIRE_CAUSES_WAKEUP |PowerManager.ON_AFTER_RELEASE,"MH24_SCREENLOCK");
    wl.acquire(10000);
    PowerManager.WakeLock wl_cpu = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MH24_SCREENLOCK");
    wl_cpu.acquire(10000);
}

// Notification stuff

NotificationCompat.Builder builder = new NotificationCompat.Builder(context.getApplicationContext());
builder.setSmallIcon(R.drawable.attendance_icon);
builder.setContentTitle("Attendance not marked");
builder.setContentText("Attendance is not marked for today. Please mark the same.");

TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context.getApplicationContext());
Intent intent = new Intent(context.getApplicationContext(), ActivityNewRecord.class);
taskStackBuilder.addParentStack(ActivityNewRecord.class);
taskStackBuilder.addNextIntent(intent);

PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(100, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
final long[] DEFAULT_VIBRATE_PATTERN = {0, 250, 250, 250};
builder.setVibrate(DEFAULT_VIBRATE_PATTERN);
builder.setLights(Color.WHITE, 2000, 3000);
builder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI);

// This is the answer to OP's question, set the visibility of notification to public.
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); 


NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(100, builder.build());

However, showing notification on lock screen might not work for some device. (I tested on on Nexus phones and it works, but didn't work on Xiaomi device)

But then again, once the notification is received, screen will light up, vibrate, and ring.

like image 148
Sumit Jha Avatar answered Sep 17 '22 03:09

Sumit Jha