2016-07-14 123 views
0

我的目標是啓動一個服務,該服務通過.jar文件作爲Unity3D中的android插件添加。在this線程中,我發現如何啓動它,我可以finnaly獲得本地代碼。但我已經遇到了以下問題日誌中:Unity3D Android插件:無法啓動服務

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 

我用Google搜索,並發現問題是在清單中,但無法弄清楚什麼我做錯了。這裏的服務是如何在清單中聲明:

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

在Java中它的包名其實是一樣的:com.activitychecker.adservice

StartReceiver類:

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

CheckService類:

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:

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

要: 我已經從改變了我的manifset

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

後轉爲日誌錯誤:

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

如果你發佈CheckService和StartReceiver類這將是一件好事。我不想看到裏面的代碼。只是它的藍圖和它的功能。 – Programmer

+0

你有沒有試過[this](http://stackoverflow.com/a/3439838/4366237)? –

+0

我已經更新了問題代碼,@Programmer –

回答

1

我時,相同的異常我試圖用Intent開始服務。它工作時,我用Context。所以從你的最後一個問題的代碼替換爲下面的一個使用的Context代替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"); 
} 

評論,如果有任何問題。

+0

謝謝,這真是太棒了!完美的作品。 –

0

我發現解決方案直接將清單複製到assets/android文件夾。

<?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>