0

我正在尝试通过使用 COSU(企业拥有的一次性使用)功能使 Unity 应用程序进入信息亭模式。

我的计划是首先使用 Android 来让事情正常运行,所以我按照Google Code Labs提供的教程进行操作

完成这项工作后,我的计划是弄清楚如何将其集成到我的 Unity 项目中。我关注 了这个 youtube 视频,该视频展示了如何制作一个可以从 Unity 调用的插件。

当我构建我的项目时,我尝试执行以下命令

adb shell dpm set-device-owner com.modalvr.unityplugin/.DeviceAdminReceiver

但是,我不断收到以下错误

Error: Unknown admin: ComponentInfo{com.modalvr.unityplugin/com.modalvr.unityplugin.DeviceAdminReceiver}

我想知道 Unity 是否没有正确地将 AndroidManifest.xml 文件合并在一起。这是我的插件中的 AndroidManifest.xml 文件。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.modalvr.unityplugin">
    <application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true">
        <receiver
            android:name="com.modalvr.unityplugin.DeviceAdminReceiver"
            android:description="@string/app_name"
            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_receiver" />
            <intent-filter>
                <action android:name="android.intent.action.DEVICE_ADMIN_ENABLED"/>
                <action android:name="android.intent.action.PROFILE_PROVISIONING_COMPLETE"/>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>

我将它和 classes.jar 文件复制到 Unity 的 Assets/Plugins/Android/libs 文件夹中

我能够成功调用插件中的函数,因此插件似乎设置正确。

作为参考,这是我调用插件的 C# 代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LockManager : MonoBehaviour {
#if UNITY_ANDROID
    private AndroidJavaObject playerActivityContext = null;
#endif

    public void SaveContext() {
#if UNITY_ANDROID
        // First, obtain the current activity context
        using (var actClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
        playerActivityContext = actClass.GetStatic<AndroidJavaObject>("currentActivity");
        }

        var plugin = new AndroidJavaClass("com.modalvr.unityplugin.PluginClass");
        plugin.CallStatic<bool>("setContext", playerActivityContext);
#endif
    }

    public void LockButtonClicked() {
#if UNITY_ANDROID
        SaveContext();

        var plugin = new AndroidJavaClass("com.modalvr.unityplugin.PluginClass");
        bool retVal = plugin.CallStatic<bool>("lock", 7);
#endif
    }

public void UnlockButtonClicked() {
#if UNITY_ANDROID
        SaveContext();

        var plugin = new AndroidJavaClass("com.modalvr.unityplugin.PluginClass");
        bool retVal = plugin.CallStatic<bool>("unlock", 7);
#endif
    }
}

这是定义这些函数的 java 类。

package com.modalvr.unityplugin;

import android.app.Activity;
import android.content.Context;
import android.util.Log;

public class PluginClass {
    private static Context context;

    public static boolean setContext(Context ctx) {
        context = ctx;
        return true;
    }

    public static boolean lock(int number) {
        Log.d("SOME TAG", "onReceive Lock");

        Activity activity = (Activity) context;
        activity.startLockTask();

        return true;
    }

    public static boolean unlock(int number) {
        Log.d("SOME TAG", "onReceive Unlock");

        Activity activity = (Activity) context;
        activity.stopLockTask();

        return true;
    }
}

看起来 Unity 生成了 2 个 XML 文件,并将其放入 Temp/StagingArea

AndroidManfist.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ModalVR.KioskPluginTest" xmlns:tools="http://schemas.android.com/tools" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:isGame="true" android:banner="@drawable/app_banner">
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>
  </application>
  <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="25" />
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

和 AndroidManifest-main.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ModalVR.KioskPluginTest" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal" android:versionName="1.0" android:versionCode="1">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>
  </application>
  <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="25" />
</manifest>

在这两个文件中,我都看不到我的 Android 插件 AndroidManifest.xml 的内容,我想这就是问题所在。我需要做些什么来合并清单文件吗?

为了完整起见,这里是

DeviceAdminReceiver.java

package com.modalvr.unityplugin;

import android.content.ComponentName;
import android.content.Context;

/**
 * Handles events related to the managed profile.
 */
public class DeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
    private static final String TAG = "DeviceAdminReceiver";

    /**
     * @param context The context of the application.
     * @return The component name of this component in the given context.
     */
    public static ComponentName getComponentName(Context context) {
        return new ComponentName(context.getApplicationContext(), DeviceAdminReceiver.class);
    }
}

提前感谢您的帮助。约翰·劳里

4

1 回答 1

2

我需要做些什么来合并清单文件吗?

是的。

当您将 Java 插件编译为.aar包时,Unity 中的清单才会自动合并。如果将其构建为.jar文件,则必须手动将 Manifest 放入 Unity 中的正确文件夹中,以便 Unity 可以在构建期间将其合并到您的程序中。

您当前正在构建为.jar库,因此下面是放置 Manifest 的位置:

AndroidManifest.xml文件放入您的<ProjectName>Assets\Plugins\Android文件夹中。确保拼写AndroidManifest和正确放置它的文件夹名称。就是这样。

于 2017-06-01T01:46:36.540 回答