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

时间:2016-08-31 04:32:11

标签: java c# android unity3d plugins

我正在尝试在Unity3d Android插件中启动服务,但无法使其正常工作。正在使用Android Studio测试应用程序,但服务调用在统一内部失败。

我的服务类

    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消息:

  

无法启动服务Intent {   CMP = info.ireal.proximitytest / info.ireal.proximitylib.ProximityService   VirtualScreenParam = Params {mDisplayId = -1,null,mFlags = 0x00000000)}}   U = 0:未找到

我非常感谢任何帮助,祝你好运

马里亚诺

我正在使用此thread的解决方案,但仍无法使其正常工作。

修改

我的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>

1 个答案:

答案 0 :(得分:0)

这可能是清单。确保在服务标记中包含服务类。 可能是以下任何一个问题。构建,运行并测试您尝试的每个

1 。将类添加到Manifest。

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

2 。添加具有Manifest完整路径的类。 如果这不起作用,请使用完整的服务类包名称

<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端的更改

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

B 。更改

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);