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