未知管理员:ComponentInfo-尝试为生产Android设备启用kiosk模式?

未知管理员:ComponentInfo-尝试为生产Android设备启用kiosk模式?,android,Android,我正在尝试为我的设备启用kiosk模式,但遇到未知的管理员错误。我很确定我成功地将我的应用程序设置为设备所有者,我认为这是最后一步,但这个错误给了我很多麻烦 ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class); DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_S

我正在尝试为我的设备启用kiosk模式,但遇到未知的管理员错误。我很确定我成功地将我的应用程序设置为设备所有者,我认为这是最后一步,但这个错误给了我很多麻烦

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 
清单-我这里有一个接收者,它应该将我的应用程序绑定为设备管理员。它还引用了device_admin.xml,我不完全确定我需要它;我将我的设备设为设备所有者,方法是将其根目录下的device_owner.xml放入/data/system。这与设备管理不同吗?是否需要设备_admin.xml

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <receiver
            android:name="com.example.setupmanager.AdminReceiver"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">

            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />

            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>

        </receiver>

        ...

    </application>
    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 
device_admin.xml-这只是一个空白的xml文件。再一次,我不确定我是否需要它,或者它有什么用途

    <device-admin xmlns:android="http://schemas.android.com/apk/res/android">

    </device-admin>
    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 
我做错了什么?我是否应该提供更多信息/采取更多步骤?我的设备版本是5.0.2

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 
编辑:

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 
当我在连接到设备的终端中键入: dpm设置设备所有者com.example.setupmanager/MyAdmin

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 
我得到一个错误: 错误:未知管理员:ComponentInfo{com.example.setupmanager/MyAdmin}

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 

…这就是为什么我选择root->move device_owner.xml to/data/system方法使我的应用程序成为设备所有者。我不确定无法通过终端进行设备管理是否与此问题有关。

我认为您分配设备管理器的命令是错误的
    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 
试一试

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 

这是根据

我知道有点晚了,但我通过将清单文件中的接收方名称从
com.packageName.util.receiver.AdminReceiver
更改为
.AdminReceiver
,然后将设备管理接收方直接放在包的根目录中,解决了这个错误

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    } 

在安装应用程序并从ADB运行命令(如ADB shell
dpm set device owner com.package.package/.AdminReceiver

之后,需要多长时间才能获得此命令的响应?我已经执行了,从最后5分钟开始我一直在等待,但并没有在终端收到任何成功消息。
    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (deviceAdmin == null)
        Log.v(TAG, "No device admin exists");
    else
        Log.v(TAG, deviceAdmin.flattenToShortString());

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Log.v(TAG, "Not device admin");
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }

    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Log.v(TAG, "Almost there...");
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    } else {
        Log.v(TAG, "Not device owner");
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    }