2016-07-14 98 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>