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

我正在尝试执行以下命令:


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 denied

W/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();

}


@Override

public void onEnabled(Context context, Intent intent) {

    showToast(context, "Enabled");

}



检查设置和设备没有帐户(这是一个没有任何谷歌播放服务的安卓设备,也没有root。)。该应用程序的 minSdkVersion 为 21/targetSdkVersion 为 27。


最终,我希望将设备设置为所有者(没有 NFC),其唯一目的是在不征得用户许可的情况下固定屏幕。(这是一个 POS 应用程序)。如何执行命令以便我可以毫无例外地将设备设置为所有者?


慕盖茨4494581
浏览 340回答 2
2回答

潇湘沐

我正在尝试以编程方式将我的设备设置为所有者将应用程序设置为设备所有者的合法方式只有两种。a) 设备供应将设备拆箱后,您可以使用专门准备的 NFC 标签轻触它。由存储在 NFC 标签上的指令指定的应用程序现在被设置为设备所有者。b) 亚行只要满足这些条件,就可以使用问题中提到的命令:没有设置设备所有者设备上没有注册帐户该dpm set-device-owner命令只能从用户打开的 shell(即来自开发机器的 ADB)运行。它不适用于由Runtime.exec(). 而且,很明显,即使您可以从设备到自身进行 ADB,它也会受到相同的限制。来源:https://github.com/aosp-mirror/platform_frameworks_base/blob/2d82493ded10d88cb44e84b90a1b485d3a895d75/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java#L7172https://github.com/aosp-mirror/platform_frameworks_base/blob/2d82493ded10d88cb44e84b90a1b485d3a895d75/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java#L12184最终,我希望将设备设置为所有者(没有 NFC),其唯一目的是在不征得用户许可的情况下固定屏幕您可以使用隐藏的系统 API ( android.app.StatusBarManager) 自己隐藏状态栏和导航按钮,并让您的应用程序使用设备制造商的平台签名进行签名。您需要签名才能获得android.permission.STATUS_BAR许可。

千万里不及你

简短的回答是:您的应用程序无法运行 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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java