2016-07-14 14 views
0

Mein Ziel ist es, einen Dienst zu starten, der via .jar-Datei als Android-Plugin in Unity3D hinzugefügt wird. In this Thread habe ich herausgefunden, wie man es startet, kann ich Finny native Code bekommen. Aber ich habe folgendes Problem im Protokoll festgestellt:Unity3D Android Plugin: Dienst kann nicht gestartet werden

07-14 15:02:23.965: W/ActivityManager(444): Unable to start service Intent { cmp=net.calipssoone.bnh/com.activitychecker.adservice.CheckService } U=0: not found 

ich gegoogelt und fand heraus, dass das Problem in dem Manifest, aber konnte nicht herausfinden, was mache ich falsch. Hier ist, wie der Dienst im Manifest erklärt:

<application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true"> 
<service android:name="com.activitychecker.adservice.CheckService"/> 
<receiver android:name="com.activitychecker.adservice.StartReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
    <action android:name="CheckService" /> 
    </intent-filter> 
</receiver> 

Sein Paketnamen in Java ist eigentlich das gleiche: com.activitychecker.adservice

StartReceiver Klasse:

public class StartReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) {} 
} 

CheckService Klasse :

public class CheckService extends Service { 
    public void onCreate(){} 
    public long getCurrentTime(){} 
    public void loadInfo(){} 
    public int onStartCommand(Intent intent, int flags, int startId){} 
    public void onDestroy() {} 
    public IBinder onBind(Intent intent) {} 
    public class MyThread extends Thread { 
     public void run() {} 
     public void cancel() {} 
     public boolean check(String bundle){} 
    } 
    private class ScreenBroadcastReceiver extends BroadcastReceiver { 
     public void onReceive(Context context, Intent intent) {} 
    } 
} 

UPD: Ich habe meine manifset aus geändert:

<service android:name="com.activitychecker.adservice.CheckService"/> 

An:

<service android:name="com.activitychecker.adservice.CheckService"></service> 

Und der Protokollfehler geändert:

07-14 17:46:13.455: W/ActivityManager(444): Unable to start service Intent { act=com.activitychecker.adservice.CheckService } U=0: not found 
+0

Es wäre gut, wenn Sie die CheckService und StartReceiver Klasse schreiben. Ich möchte den Code in ihnen nicht sehen. Nur der Bauplan davon und die Funktionen darin. – Programmer

+0

haben Sie versucht [this] (http://stackoverflow.com/a/3439838/4366237)? –

+0

Ich habe den Fragecode @Programmer –

Antwort

1

ich die-gleiche Ausnahme bekam, wenn Ich habe versucht, den Dienst mit Intent zu starten. Es funktionierte, als ich Context verwendete. So ersetzen Sie den Code aus Ihrer letzten Frage mit der man unter dem verwendet Context statt Intent:

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 void StartCheckerService() 
    { 
     myContext.startService(new Intent(myContext, CheckService.class)); 
    } 
} 

C#:

AndroidJavaClass unityClass; 
AndroidJavaObject unityActivity; 
AndroidJavaObject unityContext; 
AndroidJavaClass customClass; 

void Start() 
{ 
    //Replace with your full package name 
    sendActivityReference("com.example.StatusCheckStarter"); 

    //Now, start service 
    startService(); 
} 

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() 
{ 
    customClass.CallStatic("StartCheckerService"); 
} 

Kommentar falls vorhanden Problem.

+0

Danke, das ist wunderbar! Funktioniert perfekt. –

0

Ich habe die Lösung gefunden, die das Manifest direkt in den Ordner "Assets/Android" kopiert.

<?xml version="1.0" encoding="utf-8"?> 
 
<manifest 
 
    xmlns:android="http://schemas.android.com/apk/res/android" 
 
    package="com.unity3d.player" 
 
\t android:installLocation="preferExternal" 
 
    android:versionCode="1" 
 
    android:versionName="1.0"> 
 

 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
 
    <supports-screens 
 
     android:smallScreens="true" 
 
     android:normalScreens="true" 
 
     android:largeScreens="true" 
 
     android:xlargeScreens="true" 
 
     android:anyDensity="true"/> 
 

 
    <application 
 
\t \t android:theme="@style/UnityThemeSelector" 
 
\t \t 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="com.addcomponent.unitynativeplugin.GeoLocation"/> 
 
    </application> 
 
</manifest>