使用系统签名的应用程序关闭 Android 设备电源

2024-05-26

我正在开发一个Android应用程序,我们需要在某些情况下关闭设备电源。

我在很多地方都读到过,您需要有 root 权限的手机才能执行此操作。然后,您可以使用 Java 的 API 发出“rebo​​ot”命令:

try {
    Process proc = Runtime.getRuntime()
                .exec(new String[]{ "su", "-c", "reboot -p" });
    proc.waitFor();
} catch (Exception ex) {
    ex.printStackTrace();
}

我实际上已经在 Cyanogenmod 10 设备(三星 Galaxy S3)中尝试过这一点,并且它有效。但是,我们不希望通过获得 root 权限的设备来关闭其电源,因为最终用户将能够执行我们公司不允许的意外操作。

另一方面,我们的应用程序是由制造商的证书签署的,在本例中是 Cyanogen 的。我读过,通过使用制造商的证书签署您的应用程序,您应该能够发出特权命令(就像 root 一样)。但是,即使我将应用程序安装为使用制造商证书签名的系统应用程序,上述代码也不起作用:

  • 如果我保留命令的“su”部分,则会显示“超级用户请求”屏幕,但这是我们试图避免的事情。

  • 如果我删除“su”部分(只留下“rebo​​ot -p”),该命令将被默默忽略。

因此,我们无法使用使用制造商证书签名的系统应用程序关闭您的设备。所以我的问题是,我该怎么做?

EDITED

顺便说一句,以防万一有人不确定:应用程序已正确签名并安装为系统应用程序,因为我们实际上可以访问一些受限制的 API,例如 PowerManager.goToSleep()


如果您希望设备重新启动(关闭电源然后再打开),请尝试PowerManager.reboot()

PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
powerManager.reboot(null);

android.os.PowerManager https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/PowerManager.java:

/**
 * Reboot the device.  Will not return if the reboot is successful.
 * <p>
 * Requires the {@link android.Manifest.permission#REBOOT} permission.
 * </p>
 *
 * @param reason code to pass to the kernel (e.g., "recovery") to
 *               request special boot modes, or null.
 */
public void reboot(String reason) {
    try {
        mService.reboot(false, reason, true);
    } catch (RemoteException e) {
    }
}

UPDATE

如果您希望设备完全关闭,请使用PowerManagerService.shutdown():

IPowerManager powerManager = IPowerManager.Stub.asInterface(
        ServiceManager.getService(Context.POWER_SERVICE));
try {
    powerManager.shutdown(false, false);
} catch (RemoteException e) {
}

com.android.server.power.PowerManagerService https://android.googlesource.com/platform/frameworks/base/+/master/services/java/com/android/server/power/PowerManagerService.java:

/**
 * Shuts down the device.
 *
 * @param confirm If true, shows a shutdown confirmation dialog.
 * @param wait If true, this call waits for the shutdown to complete and does not return.
 */
@Override // Binder call
public void shutdown(boolean confirm, boolean wait) {
    mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);

    final long ident = Binder.clearCallingIdentity();
    try {
        shutdownOrRebootInternal(true, confirm, null, wait);
    } finally {
        Binder.restoreCallingIdentity(ident);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用系统签名的应用程序关闭 Android 设备电源 的相关文章

随机推荐

  • 西班牙语单词的正则表达式是什么?

    正则表达式语言使用 B 来包含 A Z a z 0 9 和 并且 b 被定义为单词边界 如何编写匹配所有有效西班牙语单词 包括诸如 等字符 的正则表达式 我正在使用 NET 使用西班牙语区域设置并使您的正则表达式区域设置敏感
  • Nginx - 特定位置的另一个根

    我在下面有一些静态 html 文件 var www project1 该项目的 Nginx 配置是 server name www project1 com project1 com root var www project1 locati
  • dc js 复合条形图 折线图

    我有一个 dc js 条形图 如下所示这个叉形小提琴 http jsfiddle net 89218vf1 3 此条形图将加载预定义的过滤器 例如本例中的 25 35 现在 我需要显示一个与条形图复合的折线图 突出显示带有高低线的过滤数据
  • 对于 aws s3,预检响应无效(重定向)

    我正在尝试将图像上传到我的 Amazon S3 存储桶 但即使我已经正确设置了 CORS 配置 我仍然收到此 CORS 错误 这是我的 CORS 配置
  • 如何用线条在一个Excel散点图中绘制多个分组数据

    我在 Excel 中的一张图表 带线的散点图 中绘制分组数据 按索引 时遇到一些困难 我将非常感谢您的帮助 我的数据分为三列 第一列是数据或组的索引 即每组数据的唯一编号 第二列是时间 第三列是数据 Group Time Data 1 1
  • Phonegap Cordova Statusbar 插件创建双栏

    我正在开发一个使用phonegap 的应用程序 通过 CLI 构建 而不是 PhoneGap 构建 我的 cordova plugin statusbar 插件有问题 打开时它将增加额外的条高度 这是它的样子 双高菜单栏 我通过两种方式实现
  • 如果外部程序挂起,如何退出进程 (.exec())

    让我解释一下我的软件 我的软件所做的只是创建 10 个线程 并为每个线程分配许多任务 然后 每个线程创建一个运行时进程 该进程将启动一个 cmd 批处理文件 该文件又将启动一个程序 该程序将远程登录到设备 我有大约 200 个设备 以轮询其
  • 我对 C# 接口成员的默认访问修饰符感到困惑[重复]

    这个问题在这里已经有答案了 什么是访问修饰符interface方法 它应该是public or protected因为当你实现它们时你可以访问它们 这是有道理的 也应该是abstract因为他们没有实施 但最近我在读一本书 名叫通过 C 进
  • “你好,TensorFlow!”使用 C API

    出于学习目的 如何使用 TensorFlow C API 编写此 Python 示例 import tensorflow as tf hello tf constant hello TensorFlow sess tf Session pr
  • 模板类型推导参考

    我一直在使用具有以下形式代码的模板来进行类型推导 打印 include
  • 使用 sed 和 grep/egrep 进行搜索和替换

    我在用egrep R后跟包含大约 10 个并集的正则表达式 如下所示 jpg png gif等等 这很好用 现在我想替换所有找到的字符串 bmp 我在想类似的事情 egrep lR jpg png gif sed s some expres
  • VSTO 工具:Office 2010 到 2013 升级

    我正在开发 Excel 的 VSTO 工具项目 我现在正在升级我的机器 我的 旧 笔记本电脑运行的是 Windows 7 x64 Office 2010 和 Visual Studio 2012 我的新机器运行的是 Windows 8 x6
  • 如何为 GlassFish Web 应用程序提供对外部资源(文件)的访问?

    我是一个有点玻璃鱼 http en wikipedia org wiki GlassFish初学者 所以请原谅我对这个问题的无知 基本上 我们正在为一个游戏网站提供服务 为了使我们的网络应用程序可以下载客户端 我们将其复制到domain1中
  • 如何添加百分比列

    我想计算每行中所有行中的值的百分比并将其添加为另一列 输入 分隔符为 t 1 10 2 10 3 20 4 40 添加第三列的所需输出显示基于第二列中的值计算的百分比 1 10 12 50 2 10 12 50 3 20 25 00 4 4
  • 运行Scrapy的Django自定义管理命令:如何包含Scrapy的选项?

    我希望能够运行Scrapy网络爬虫框架 http scrapy org 来自 Django 内部 Scrapy本身只提供了一个命令行工具scrapy执行其命令 即该工具不是故意编写为从外部程序调用的 用户米哈伊尔 科罗博夫 https st
  • 为什么逻辑连接词和布尔值在 Coq 中是分开的?

    我有 JavaScript Ruby 编程背景 并且习惯了 true false 的工作方式 在 JS 中 true false false true 然后你可以使用这些真 假值 like var a true b false a b So
  • 为什么非空槽不能与 int、tuple、bytes 子类一起使用?

    参考手册中明确记录了这一点 非空 slots 不适用于从 可变长度 内置类型 例如 int bytes 和 tuple 派生的类 情况确实如此 写道 class MyInt int slots spam 结果是 TypeError none
  • 如何使用 Twitter Bootstrap 弹出窗口进行 jQuery 验证通知?

    我可以使用弹出窗口出现引导程序 http twitter github com bootstrap很容易 我还可以使用标准进行验证jQuery 验证插件 http docs jquery com Plugins Validation or
  • OOP 中的对象和结构有什么区别?

    对象与结构体有何区别 我们何时以及为何使用对象而不是结构体 数组与两者有何不同 何时以及为何使用数组而不是对象或结构 我想了解每个的用途 显然 您可以根据您的编程风格模糊这些区别 但通常结构是结构化的数据块 对象是可以执行某种任务的主权实体
  • 使用系统签名的应用程序关闭 Android 设备电源

    我正在开发一个Android应用程序 我们需要在某些情况下关闭设备电源 我在很多地方都读到过 您需要有 root 权限的手机才能执行此操作 然后 您可以使用 Java 的 API 发出 rebo ot 命令 try Process proc