未知的管理员:ComponentInfo - 尝试为生产Android设备启用自助服务终端模式?

时间:2017-03-14 16:34:52

标签: android

我正在尝试为我的设备启用自助服务终端模式,但我收到了一个未知的管理员错误。我很确定我设法将我的应用程序设置为设备所有者,我认为这是最后一步,但是这个错误给了我很多麻烦。

清单 - 我在这里有一个接收器应该将我的应用程序绑定为设备管理员。它还指的是我不完全确定需要的device_admin.xml;我通过生根设备并将一个device_owner.xml放在/ data / system中,使我的设备成为设备所有者。这与设备管理员不同,是否需要device_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>

AdminReceiver - 永远不会在当前状态下调用它。我认为它应该是,但它似乎没有被创造出来。

    public class AdminReceiver extends DeviceAdminReceiver {

        @Override
        public void onEnabled(Context context, Intent intent) {
            Log.v(TAG, "Device Admin Enabled");
            Toast.makeText(context, context.getString(R.string.device_admin_enabled), Toast.LENGTH_SHORT).show();
        }

        @Override
        public CharSequence onDisableRequested(Context context, Intent intent) {
            return context.getString(R.string.device_admin_warning);
        }

        @Override
        public void onDisabled(Context context, Intent intent) {
            Log.v(TAG, "device admin disabled");
            Toast.makeText(context, context.getString(R.string.device_admin_disabled), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onLockTaskModeEntering(Context context, Intent intent, String pkg) {
            Log.v(TAG, "kiosk mode enabled");

            Toast.makeText(context, context.getString(R.string.kiosk_mode_enabled), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onLockTaskModeExiting(Context context, Intent intent) {
            Log.v(TAG, "kiosk mode disabled");

            Toast.makeText(context, context.getString(R.string.kiosk_mode_disabled), Toast.LENGTH_SHORT).show();
        }

    }

device_admin.xml - 这只是一个空白的xml文件。再一次,我不确定我是否需要它,或者它的目的是什么。

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

    </device-admin>

MainActivity.java - OnCreate - 这是我尝试将它们连接在一起的地方。根据我收到的日志消息判断(裁剪):

  
    

com.example.setupmanager / .AdminReceiver

         

不是设备管理员

         

差不多......

         

D / AndroidRuntime:关闭VM

         

E / AndroidRuntime:致命异常:主要     java.lang.RuntimeException:无法启动活动

         

java.lang.SecurityException:没有活动的管理员ComponentInfo {com.example.setupmanager / com.example.setupmanager.AdminReceiver}

  

我似乎是设备所有者,但未从AdminReceiver类成功创建ComponentName设备管理员。

    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。

编辑:

当我输入连接到我的设备的终端时: dpm set-device-owner com.example.setupmanager / MyAdmin

我收到错误: 错误:未知管理员:ComponentInfo {com.example.setupmanager / MyAdmin}

...这就是我选择root的原因 - &gt;将device_owner.xml移动到/ data / system方法以使我的应用程序设备所有者。我不确定是否无法通过终端让我的设备管理员连接到这个问题。

2 个答案:

答案 0 :(得分:0)

我认为您分配设备管理器的命令是错误的 尝试

adb shell dpm set-device-owner com.example.setupmanager/.AdminReceiver

根据google codelabs tutorial

答案 1 :(得分:0)

我有点晚了,但是我通过将清单文件中的接收方名称从com.packageName.util.reciever.AdminReceiver更改为.AdminReceiver来解决了该错误-然后直接将Device Admin Receiver放在了包装

此后,安装该应用并从ADB运行命令,例如ADB shell dpm set-device-owner com.package.package/.AdminReceiver