3

I am receiving a push notification, On that, calling a foreground service.

From the service, I am calling one Activity.

Here, I have 2 functionality.

1. Sound alarm for emergency

2. Call using ACTION_CALL.

Both are working fine if device unlocked.

But if a device is locked with password or pattern it did not work when push receives.

Below code to unlock the device. this method is called from onStart.

private void unlockDevice() {

    KeyguardManager loKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    Window loWindow = this.getWindow();

    if (Common.isAboveAPI27()) {
        setShowWhenLocked(true);
        setTurnScreenOn(true);
    } else if (Common.isAboveAPI26()) {
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        dismissKeyguard(loKeyguardManager);
    } else {
        if (loKeyguardManager != null) {
            KeyguardManager.KeyguardLock loKeyguardLock = loKeyguardManager.newKeyguardLock("FullWakeUps");
            loKeyguardLock.disableKeyguard();
        }
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); // Deprecated in 26
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); // Deprecated in 27
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); // Deprecated in 27
    }

    //Keep screen on
    loWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@RequiresApi(api = Build.VERSION_CODES.O)
private void dismissKeyguard(KeyguardManager loKeyguardManager) {
    if (loKeyguardManager != null) {
        loKeyguardManager.requestDismissKeyguard(SOSCallAndAlarmActivity.this, new KeyguardManager.KeyguardDismissCallback() {
            @Override
            public void onDismissError() {
                super.onDismissError();
                Log.i(TAG, Build.VERSION.SDK_INT + " : onDismissError");
            }

            @Override
            public void onDismissSucceeded() {
                super.onDismissSucceeded();
                Log.i(TAG, Build.VERSION.SDK_INT + " : onDismissSucceeded");
            }

            @Override
            public void onDismissCancelled() {
                super.onDismissCancelled();
                Log.i(TAG, Build.VERSION.SDK_INT + " : onDismissCancelled");
            }
        });
    }
}

The below method is call in onDestroy to reenable the lock:

private void reEnabledKeyguard() {
    KeyguardManager loKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    if (loKeyguardManager != null) {
        KeyguardManager.KeyguardLock loKeyguardLock = loKeyguardManager.newKeyguardLock("FullWakeUps");
        loKeyguardLock.reenableKeyguard();
    }
    Window loWindow = this.getWindow();
    loWindow.addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
}

Code to initiate the call.

public void callOnNumbers(String fsPhoneNumber) {
    Intent loCallIntent = new Intent(Intent.ACTION_CALL);
    loCallIntent.setData(Uri.parse("tel:" + fsPhoneNumber));
    //callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // tried this but not helped.
    if (ActivityCompat.checkSelfPermission(CallAndAlarmActivity.this,
            android.Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        Log.i(TAG, "call phone permission not granted");
        return;
    }
    startActivity(loCallIntent);
}

Strange is when this method opens the call screen blink and again displays the password screen on lock screen simply press back button I can see the call screen.

I need to know one more thing, even I set all app killing option and disabled battery optimization. the same code did not execute on push receive.

When device inactive half an hour and if push receives, the above code did not even turn on light. when I click on the lock/unlock button I can see my screens properly. even I press it after 30 seconds of push receives time.

The problem facing from android N.

Additional When the ACTION_CALL intent calls it to execute my activities onPause and I did not add any code in onPause and I can see one error in logcate

2020-04-27 16:23:47.400 25826-25826/app.safety E/ActivityThread: Performing stop of activity that is already stopped: {app.safety/app.safety.CallAndAlarmActivity}
java.lang.RuntimeException: Performing stop of activity that is already stopped: {app.safety/app.safety.CallAndAlarmActivity}
    at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:4089)
    at android.app.ActivityThread.handleStopActivity(ActivityThread.java:4177)
    at android.app.ActivityThread.-wrap24(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1648)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6687)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
2020-04-27 16:23:47.400 25826-25826/app.safety E/ActivityThread: ActivityClientRecord{paused=true, stopped=true, hideForNow=false, startsNotResumed=false, isForward=false, pendingConfigChanges=0, onlyLocalRequest=false, preserveWindow=false, Activity{resumed=false, stopped=true, finished=false, destroyed=false, startedActivity=false, temporaryPause=false, changingConfigurations=false}}

Thanks

RaRa
  • 2,024
  • 1
  • 18
  • 29

1 Answers1

0

I wonder if it has something to do with the Background Execution Limit. in Android. I would recommend looking at this article.

https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c

I hope this is of any help.

Amit Gupta
  • 633
  • 1
  • 8
  • 19