Java 以编程方式重新启动Android

Java 以编程方式重新启动Android,java,runtime.exec,android-things,Java,Runtime.exec,Android Things,我想使用此代码重新启动运行Android Things的RPI3: 我得到以下错误: java.io.IOException:无法运行程序“su”:错误=13,权限被拒绝 我将所有权限添加到清单中 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <u

我想使用此代码重新启动运行Android Things的RPI3:

我得到以下错误:

java.io.IOException:无法运行程序“su”:错误=13,权限被拒绝

我将所有权限添加到清单中

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SHUTDOWN"/>


我遗漏了什么吗?

您需要根访问权限

public static void runCmd(String cmd) {
    DataOutputStream os;
    try {
        Process process = Runtime.getRuntime().exec("su");
        os = new DataOutputStream(process.getOutputStream());
        os.writeBytes(cmd + "\n");
        os.writeBytes("exit\n");
        os.flush();
        os.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

然后,您可以运行任何需要root访问权限的命令,如下所示:
runCmd(“reboot”)

在未来的开发者预览版本中,运行在Android Things上的应用程序将可以访问受系统保护的功能(例如由
PowerManager.reboot()
API提供的功能)。您不能(也不应该)尝试通过
su
以root用户身份运行应用程序进程


作为旁注,Android Things的开发者映像构建为
userdebug
,这意味着您可以在尝试访问shell之前,通过使用
ADB root
命令重新启动ADB守护程序,从shell访问root。这为您提供了在开发过程中可能需要的任何根访问权限,而不会影响设备安全性,也不会允许应用程序进程以根用户身份运行。

/code>/system/bin/reboot
DP 4中的二进制文件,与以前的所有开发人员预览一样,具有世界可执行权限,即:

adb shell ls -l /system/bin | grep reboot
-rwxr-xr-x 1 root shell   ... reboot
也就是说,还可以为任何用户执行二进制文件(在Android中称为应用程序进程),而无需抓取
su
。只需在Java中执行

重新启动

Runtime.getRuntime().exec("reboot");
或用于关闭电源

Runtime.getRuntime().exec("reboot -p");
AndroidManifest.xml
中不需要权限来成功运行二进制文件


警告:如果在较新的操作系统版本中更改了安全模型,此方法可能不起作用。

您现在可以使用以下方法重新启动:

范例

 public class SomeActivity extends Activity {

     void doReboot() {
         DeviceManager.getInstance().reboot();
     }

     void doFactoryReset() {
         boolean wipeExternalCard = true;
         DeviceManager.getInstance().factoryReset(wipeExternalCard);
     }
  }

您需要的是
com.google.android.things.permission.REBOOT
权限

不是android权限,而是linux
su
命令权限。确保您的进程(用户)具有执行su的权限我如何检查我是否可以执行“su”?这是一个基本的linux问题,这里不能说太多。请学习如何在LinuxBash中执行命令,并检查二进制可执行文件。。。如何在Android中获得root访问权限?谢谢你的回答!所以我会等待未来的发布!“su”命令在任何情况下都不可访问?e、 g.如果我需要运行AVRDude(上传arduino固件…),没有“su”怎么办?建议的方法是直接使用外围I/O API实现协议,而不是调用需要提升权限的外部可执行文件。这对我们来说很难保证。谢谢你的解释!最后,@Onik建议的方法能够重新启动RPI3。现在我需要找到一种方法来执行AVRdude:D
Runtime.getRuntime().exec(“重新启动”)在第一时间起作用。非常感谢。如@Devunwired上的评论所述,我只需要使用su执行AVRdude“'su'命令在任何情况下都不可访问?”您可以尝试
adb root
,然后
adb重新安装
(防止
/system/not in/proc/mounts
),然后
adb shell chmod 777/system/xbin/su
(777只是一个例子,您可能会选择一个更受限制的模式),但您知道使
su
world可执行是一个巨大的安全漏洞,对吗?:)
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SHUTDOWN"/>