2145年的上海,霓虹灯如同繁星般点缀着这座繁华都市的夜空。科技的进步使得人类的生活发生了翻天覆地的变化,智能助手、自动交通工具以及虚拟现实已经融入了日常生活的每个角落。
陈欣是一位顶尖的人工智能研究员,目前正致力于开发一款名为“21点关机”的应用程序。这款应用旨在帮助用户在晚上9点(即21点)自动关闭设备,以促进更好的睡眠质量。然而,随着用户群体的扩大,两个主要问题逐渐浮现:
1. **显示在屏幕最上方**:一些用户反馈说,在某些情况下,应用程序不能始终显示在屏幕最上方,导致重要提醒被其他应用覆盖。
2. **通知权限**:从Android 13 (API level 33)开始,应用程序需要显式请求`POST_NOTIFICATIONS`权限才能发送通知,而许多用户并没有手动授予这一权限,导致他们错过了重要的提示信息。
这些问题不仅影响用户体验,也威胁到“21点关机”项目的成功推广。作为项目的主要开发者之一,陈欣感到肩上的责任重大。她知道,必须尽快找到解决方案,否则项目的前景将变得不明朗。
为了应对这两个问题,陈欣决定深入研究并寻找有效的解决方案。首先,她着手解决悬浮窗权限的问题,使应用程序窗口能够始终显示在屏幕最上方。经过一系列实验,她找到了一个有效的方案——通过代码确保应用程序窗口总是在最前。
// 检查并请求悬浮窗权限的方法
private boolean hasOverlayPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Android 6.0及以上
return Settings.canDrawOverlays(this); // 检查是否有悬浮窗权限
} else {
return true; // 在Android 6.0以下版本中,此权限总是被授予
}
}
private void requestOverlayPermission() {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_OVERLAY_PERMISSION);
}
接下来,陈欣转向了解决通知权限的问题。她更新了应用程序的`AndroidManifest.xml`文件,添加了对`POST_NOTIFICATIONS`权限的声明,并编写了相应的代码来请求和处理这个权限。
// 检查通知权限的方法
private boolean hasNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13及以上
return ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED;
} else {
return true; // 在Android 13以下版本中,此权限总是被授予
}
}
// 请求通知权限的方法
private void requestNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
REQUEST_CODE_POST_NOTIFICATIONS);
}
}
陈欣将新功能集成到`FullscreenActivity.java`中,并进行了全面的测试。以下是整合后的代码片段:
package com.stupidbeauty.shutdownat2100androidnative;
import android.Manifest;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.content.Intent;
import androidx.core.app.ActivityCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
public class FullscreenActivity extends AppCompatActivity {
private static final int REQUEST_CODE_OVERLAY_PERMISSION = 12345;
private static final int REQUEST_CODE_POST_NOTIFICATIONS = 12346;
private void checkPermissions() {
// 首先检查悬浮窗权限
if (!hasOverlayPermission()) {
requestOverlayPermission();
return; // 如果悬浮窗权限没有被授予,则先处理悬浮窗权限
}
// 检查通知权限
if (!hasNotificationPermission()) {
requestNotificationPermission();
return; // 如果通知权限没有被授予,则先处理通知权限
}
// 继续执行其他逻辑...
}
private boolean hasOverlayPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return Settings.canDrawOverlays(this);
} else {
return true;
}
}
private void requestOverlayPermission() {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_OVERLAY_PERMISSION);
}
private boolean hasNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
return ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED;
} else {
return true;
}
}
private void requestNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
REQUEST_CODE_POST_NOTIFICATIONS);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_OVERLAY_PERMISSION) {
if (hasOverlayPermission()) {
checkPermissions(); // 重新检查其他权限或直接执行下一步操作
} else {
Toast.makeText(this, "悬浮窗权限被拒绝", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_POST_NOTIFICATIONS) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "通知权限已授予", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "通知权限被拒绝", Toast.LENGTH_SHORT).show();
}
}
}
}
经过几天的努力,陈欣终于解决了“21点关机”应用的两个关键问题。现在,应用程序不仅能始终显示在屏幕最上方,而且能够顺利获得用户的显示通知权限,从而确保所有重要提醒都能及时传达给用户。
陈欣站在新的办公楼前,望着初升的太阳,心中充满了成就感。她知道,这只是开始,更多未知的挑战等待着她去探索和克服。而她,已经准备好迎接这一切。
解决了这两个技术难题后,陈欣并没有停下脚步。她意识到,科技进步带来的不仅是机遇,更是责任。每一个新的功能和改进都需要考虑到用户体验和社会影响。在未来的工作中,陈欣将继续致力于推动科技创新,同时保持谨慎和智慧,让科技更好地服务于人类社会的发展。
她相信,只要人类保持创新精神和责任感,未来的道路将会充满光明。而她,也将在这条道路上继续前行,为创造更美好的世界贡献自己的力量。
Your opinionsHxLauncher: Launch Android applications by voice commands