Unity3D Android插件:无法启动服务,意图错误

本文关键字:服务 意图 错误 启动 Android 插件 Unity3D | 更新日期: 2023-09-27 18:04:45

我试图在Unity3d Android插件内启动服务,但无法使其工作。正在开发Android Studio测试应用,但是在unity内部调用失败

My service class

    public class ProximityService extends Service {
    private String TAG = "iProximity: ";
    NotificationManager _NotificationManager;
    private Context _Context;
    private static Timer _Timer = new Timer();
    public ProximityService() {
    }
    private void sendNotification() {
        Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder builder;
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, iRealUnityPlayerActivity.class), 0);
        builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ireal)
                .setContentTitle("Notification")
                .setContentText("message")
                .setTicker("msg: mensaje")
                .setSound(sound)
                .setAutoCancel(true);
        builder.setContentIntent(contentIntent);
        _NotificationManager.notify(0, builder.build());
    }
    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate()");
        super.onCreate();
        _Context = getApplicationContext();
        _NotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    }
    // methods
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommanf()");
        //startProximity();
        sendNotification();
        return START_STICKY;
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "onBind()");
        // TODO: Return the communication channel to the service.
        return null;
    }
}

用来启动服务的Java类:

public final class StatusCheckStarter {
    static Context myContext;
    // Called From C# to get the Context Instance
    public static void ReceiveContextInstance(Context tempContext) {
        myContext = tempContext;
    }
    public static String StartProximityService()
    {
        String result = "OK";
        try
        {
        myContext.startService(new Intent(myContext, ProximityService.class));
        }
        catch (Exception e) {
            e.printStackTrace();
            result = e.getMessage();
        }
        return result;
    }
    public static String Dummy() {
        return "DONEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE";
    }
}

Unity c#代码,用于调用java函数来启动服务:

    AndroidJavaClass unityClass;
    AndroidJavaObject unityActivity;
    AndroidJavaObject unityContext;
    AndroidJavaClass customClass;
    string a1 = "";
    string a2 = "";
    string a3 = "";
    string a4 = "";
    void Start () {
        //Replace with your full package name
        sendActivityReference("info.ireal.proximitylib.StatusCheckStarter");
        //Now, start service
        startService();
        Debug.Log ("START");
    }
    void sendActivityReference(string packageName)
    {
        unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
        unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");
        customClass = new AndroidJavaClass(packageName);
        customClass.CallStatic("ReceiveContextInstance", unityContext);
    }
    void startService()
    {
        a4 = customClass.CallStatic<string> ("Dummy"); 
        a3 = customClass.CallStatic<string>("StartProximityService");
    }

Dummy方法正在工作并返回一个字符串值,但是服务不工作

Adb logcat message:

无法启动服务cmp = info.ireal.proximitytest/info.ireal.proximitylib.ProximityServiceVirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)}}U=0: not found

非常感谢您的帮助。

马里亚诺•

我正在使用这个线程的解决方案,但仍然不能使它工作。

编辑我AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    android:installLocation="preferExternal"
    android:versionCode="1"
    android:versionName="1.0">
    <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>
        <service android:name="info.ireal.proximitylib.ProximityService" />
        <!---<service android:name="ProximityService" />-->
    </application>
</manifest>

Unity3D Android插件:无法启动服务,意图错误

这可能是Manifest。确保在service标记中包含服务类。它可以是下面的任何一个问题。构建,运行和测试每个你尝试。

1

。将类添加到Manifest中。

<application
    <service android:name=".ProximityService" />
</application>
2

。将具有清单完整路径的类添加到清单。如果这不起作用,请使用完整的服务类包名

<application
    <service android:name="info.ireal.proximitylib.ProximityService" />
</application>

3 。从Unity将类添加到Manifest中。

同样,如果失败,转到<UnityInstallationDirecory>'Editor'Data'PlaybackEngines'AndroidPlayer'Apk

AndroidManifest.xml从该地方文件复制到您的Assets'Plugins'Android目录,然后在Manifest中包含上面的服务标签代码。保存并运行

4

。最后,用Activity代替Context

Java端变化:

。重命名static Context myContext;static Activity myActivity;

public static void ReceiveContextInstance(Context tempContext) {
    myContext = tempContext;
} 

public static void ReceiveContextInstance(Activity tempActivity) {
    myActivity = tempActivity;
}

c#的变化:

C 。将customClass.CallStatic("ReceiveContextInstance", unityContext);替换为customClass.CallStatic("ReceiveContextInstance", unityActivity);