为了账号安全,请及时绑定邮箱和手机立即绑定

在应用程序中以编程方式执行 adb shell dpm 命令产生无法运行程序“adb”:

在应用程序中以编程方式执行 adb shell dpm 命令产生无法运行程序“adb”:

慕盖茨4494581 2021-11-03 10:58:30
我正在尝试执行以下命令:Process process = Runtime.getRuntime().exec("adb shell dpm set-device-owner com.example.package/.DeviceAdmin", null,null);并得到以下异常W/System.err:java.io.IOException: Cannot run program "adb": error=13, Permission deniedW/System.err: at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)W/System.err: at java.lang.Runtime.exec(Runtime.java:692)W/System.err: at java.lang.Runtime.exec(Runtime.java:525)我试图通过以编程方式执行“adb shell dpm set-device-owner com.example.package/.DeviceAdmin”来将我的设备设置为所有者。注意:我试过在没有 adb shell 前缀的情况下运行命令,但是它返回 null 并且没有应用任何更改。以下代码执行我的命令。     try {            StringBuffer output = new StringBuffer();            Process process = Runtime.getRuntime().exec("dpm set-device-owner com.example.package/.DeviceAdmin", null,null);            process.waitFor();            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));            String line = "";            while ((line = reader.readLine()) != null) {               output.append(line + "n");               Log.d("OUTPUT = ", output.toString());            }        } catch (Exception e) {            Log.e("LOGINACTIVITY ", "device owner not set");            Log.e("LOGINACTIVITY ", e.toString());            e.printStackTrace();        }下面是我的 DeviceAdminReceiver 子类public class DeviceAdmin extends DeviceAdminReceiver {public ComponentName getComponentName(Context context){    return new ComponentName(context.getApplicationContext(), DeviceAdmin.class);}void showToast(Context context, String msg) {    String status = msg;    Toast.makeText(context, status, Toast.LENGTH_SHORT).show();}@Overridepublic void onEnabled(Context context, Intent intent) {    showToast(context, "Enabled");}检查设置和设备没有帐户(这是一个没有任何谷歌播放服务的安卓设备,也没有root。)。该应用程序的 minSdkVersion 为 21/targetSdkVersion 为 27。最终,我希望将设备设置为所有者(没有 NFC),其唯一目的是在不征得用户许可的情况下固定屏幕。(这是一个 POS 应用程序)。如何执行命令以便我可以毫无例外地将设备设置为所有者?
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

我正在尝试以编程方式将我的设备设置为所有者

将应用程序设置为设备所有者的合法方式只有两种。

a) 设备供应

将设备拆箱后,您可以使用专门准备的 NFC 标签轻触它。由存储在 NFC 标签上的指令指定的应用程序现在被设置为设备所有者。

b) 亚行

只要满足这些条件,就可以使用问题中提到的命令:

  • 没有设置设备所有者

  • 设备上没有注册帐户

dpm set-device-owner命令只能从用户打开的 shell(即来自开发机器的 ADB)运行。它不适用于由Runtime.exec(). 而且,很明显,即使您可以从设备到自身进行 ADB,它也会受到相同的限制。

来源:

最终,我希望将设备设置为所有者(没有 NFC),其唯一目的是在不征得用户许可的情况下固定屏幕

您可以使用隐藏的系统 API ( android.app.StatusBarManager) 自己隐藏状态栏和导航按钮,并让您的应用程序使用设备制造商的平台签名进行签名。您需要签名才能获得android.permission.STATUS_BAR许可。


查看完整回答
反对 回复 2021-11-03
?
千万里不及你

TA贡献1784条经验 获得超9个赞

简短的回答是:您的应用程序无法运行 ADB 命令。允许这样做对Android来说将是一个巨大的安全漏洞。


如果要以编程方式将设备设置为设备管理员,请查看文档中的示例


Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);

intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, getString(R.string.add_admin_extra_app_text));

startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 338 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信