Android Pie (9.0) - 编写关闭或重启函数 - 应用程序具有特权

Android Pie (9.0) - Writing a Shutdown or Restart Function - Application is Privileged

我在学校有一个安全系统,我的平板电脑是每个教室的控制台。我注意到老师和管理员不会经常(或从来没有)重启平板电脑,这导致了问题。我想从客户那里接过任务并计划每周重启或关机。我已经朝着正确的方向采取了一些步骤:

我有:

  1. 与平板电脑 Provider/Scheme 提供商交谈,他们已将我的应用程序添加为特权应用程序。
  2. 为(我认为的)所有必需权限添加了白名单。
  3. 确认权限存在。

检查权限的代码:

public void getGrantedPermissions(final String appPackage) {
    List<String> granted = new ArrayList<String>();
    try {
        PackageInfo pi = getPackageManager().getPackageInfo(appPackage, PackageManager.GET_PERMISSIONS);
        for (int i = 0; i < pi.requestedPermissions.length; i++) {
            if ((pi.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
                granted.add(pi.requestedPermissions[i]);
            }
        }
    } catch (Exception e) {}

    for(int i = 0; i < granted.size(); i++){
        Log.e("Permissions", granted.get(i));
    }
}

以下是日志报告的内容。绿色权限是我个人能拿到的全部phone。黄色权限是我能够从平板电脑提供商的白名单中获得的权限。我们可以通过这些权限确认我有一个特权应用程序,以及关机和重启权限。

我找到了一段代码来关闭应用程序,但我似乎不太明白如何使用它。下面是我试过的代码,错误如下:

Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
intent.putExtra("android.intent.extra.KEY_CONFIRM", false);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

运行 代码出错:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.ACTION_REQUEST_SHUTDOWN flg=0x10000000 (has extras) }

"This exception is thrown when a call to Context#startActivity or one of its variants fails because an Activity can not be found to execute the given Intent."

我假设这可能需要我修改我的 manifist.xml,对吗?如果是这样,我不确定该怎么做。我觉得我可能必须在我的主要 activity 中添加一个调用。不过,我试过了,还是不行,或者是我代码写的不对。

提前感谢您的帮助!

想通了这一点。我没有意识到 PowerManager 的存在,但它确实存在,而且可以正常工作。我的解决方案如下。另外,如果您没有阅读完整的问题,我的应用程序是 privileged/System 应用程序,它赋予我管理电源的权限。普通应用程序将无法执行此操作。

目前 运行 Android 9.0(可能很重要,不确定)

try{
   PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
   powerManager.reboot(null);
} catch (Exception e){
    Toast.makeText(this, "Error performing this action", Toast.LENGTH_LONG).show();
    e.printStackTrace();
}