gpt4 book ai didi

android - 如何在 Android Q 屏幕锁定时从广播接收器启动 Activity

转载 作者:行者123 更新时间:2023-11-29 22:37:01 25 4
gpt4 key购买 nike

我正在尝试使用广播接收器在 Android Q 中实现基于警报的应用程序。我正在使用触发警报广播接收器的通知运行前台服务。该服务工作正常,它也在触发广播接收器。如果我们在设置闹钟后关闭应用程序或锁定屏幕,该服务将在前台运行并发出通知。

当调用警报广播时,我试图在屏幕锁定时打开一个新 Activity 以提供停止警报和服务的功能。我尝试禁用键盘锁,打开屏幕,然后从广播接收器打开 Activity ,但我无法成功。

我尝试使用 WindowManager 标志,但它们已被弃用并且对代码没有任何影响。

WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

因为我试图从 BroadcastReceiver 开始一个 Activity ,所以我不会有任何 Activity 可以使用 KeyguardManager.requestDismissKeyguard(Activity activity, KeyguardDismissCallback callback)

有没有什么办法可以在锁屏的时候启动一个activity来关闭闹钟。我的实现如下,

我还在 list 文件中添加了权限。

AndroidManifest.xml

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

AlarmBroadcastReceiver.class

public class AlarmBroadcastReceiver extends BroadcastReceiver {
public static MediaPlayer mp;
public static Vibrator vibrator;

private boolean isVibrationEnabled = false;

@Override
public void onReceive(Context context, Intent intent) {

long[] mVibratePattern = new long[]{0, 400, 400, 400, 400, 400, 400, 400};
final int[] mAmplitudes = new int[]{0, 128, 0, 128, 0, 128, 0, 128};

isVibrationEnabled = intent.getExtras().getBoolean(LocationAlertService.IS_VIBRATE);

mp=MediaPlayer.create(context, R.raw.ring1);
mp.setLooping(true);
mp.start();

if(isVibrationEnabled) {
vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
vibrator.vibrate(VibrationEffect.createWaveform(mVibratePattern, mAmplitudes, 0));
} else {
//deprecated in API 26
vibrator.vibrate(mVibratePattern, 3);
}
}

Intent wakeIntent = new Intent(context, WakeUpActivity.class);
wakeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(wakeIntent);
}
}

我知道我错过了什么。如果有任何建议可以解决我面临的问题,我会很高兴。在此先感谢您帮助我。

最佳答案

对于 Android Q,如果您的应用不包含以下链接中列出的异常(exception)情况,则无法从后台自动启动 Activity。您可以选择仅显示服务通知,并通过点击启动待定 Intent 。

https://developer.android.com/guide/components/activities/background-starts

使系统正常工作。在我看来,最可能的解决方案是将“SYSTEM_ALERT_WINDOW”添加到 list 文件。并在应用程序第一次打开时请求用户权限一次。(用户可以手动授予此权限 - (设置 - 应用程序 - 你的应用程序 - 高级 - 在其他应用程序上绘制))请求权限的示例代码:

在 list 中:

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

应用中的某处:

 private void RequestPermission() {
// Check if Android M or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getActivity().getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}
}

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(getContext())) {
PermissionDenied();
}
else
{
//Permission Granted-System will work
}

}
}

关于android - 如何在 Android Q 屏幕锁定时从广播接收器启动 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com