2016-07-14 3 views
0

Моя цель - запустить сервис, который добавляется через .jar-файл в качестве плагина android в Unity3D. В потоке this я узнал, как запустить его, я могу финнали добраться до собственного кода. Но я столкнулся со следующей проблемой в журнале: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 

Я гугл и выяснил, что проблема заключается в манифесте, но не могла понять, что я делаю неправильно. Вот как услуга объявляется в манифесте:

<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: Я изменил свое manifset от:

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

To:

<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

вы пробовали [это] (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>

Смежные вопросы