2016-08-31 3 views
0

Ich versuche, einen Dienst in einem Unity3d Android-Plugin zu starten, kann aber nicht funktionieren. Arbeitet an der Android Studio-Test-App, aber der Dienstanruf schlägt innerhalb der Einheit fehl.Unity3D Android plugin ,: Service kann nicht gestartet werden, Absicht Fehler

Meine Serviceklasse

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-Klasse, die den Dienst starten verwendet wird:

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"; 
    } 

} 

# -Code Unity C, die die Java-Funktionen verwendet wird, riefen den Dienst zu starten:

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

Die Dummy-Methode funktioniert und gibt einen Zeichenfolgenwert zurück, aber der Dienst funktioniert nicht

Adb logcat Nachricht:

Dienst kann nicht Intent { cmp = info.ireal.proximitytest/info.ireal.proximitylib.ProximityService VirtualScreenParam = Param {mDisplayId = -1, null, Mflags = starten 0x00000000)}} U = 0: nicht gefunden

ich schätze jede Hilfe Mit freundlichen Grüßen

Mariano

Ich verwende die Lösung von diesem thread, aber kann es immer noch nicht funktionieren.

EDIT

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

Antwort

0

Dies könnte das Manifest sein. Stellen Sie sicher, dass Sie die Serviceklasse in das Service-Tag einschließen. Es könnte eines dieser Probleme unten sein. Build, Run und Test jeder einen Versuch.

.Fügen Sie die Klasse zum Manifest hinzu.

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

.Add die Klasse mit dem vollständigen Pfad zu dem Manifest. Wenn dies nicht funktioniert, verwenden Sie die Full-Service-Klasse Paketnamen

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

.Add die Klasse zu dem Manifest von Unity selbst.

Noch einmal, wenn das nicht funktioniert, gehen Sie zu <UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Apk

Kopieren Sie die AndroidManifest.xml von diesem Ort Datei auf Ihre Assets \ Plugins \ Android-Verzeichnis enthält dann den Service-Tag-Code oben in dem Manifest. Speichern und ausführen.

.Final, verwenden Sie Activity anstelle von Context.

Änderungen auf der Java-Seite:

A .Rename static Context myContext; zu static Activity myActivity;

B .Mit

public static void ReceiveContextInstance(Context tempContext) { 
    myContext = tempContext; 
} 

zu

public static void ReceiveContextInstance(Activity tempActivity) { 
    myActivity = tempActivity; 
} 

Änderungen auf C# Seite:

C .replace customClass.CallStatic("ReceiveContextInstance", unityContext); mit customClass.CallStatic("ReceiveContextInstance", unityActivity);

+0

Hallo Programmierer, vielen Dank für Ihre Antwort, ich folge uns Ihre Tipps und immer noch gleichen Fehler, werde ich meine Post AndroidManifest.xml, Im noch noob in Android-Programmierung, die mit Plugin-Abhängigkeit verwandt werden könnte? – on4ir4m

+0

Die Bibliothek proximitylib zeigt abhängig von com.android.support:appcompat-v7:24.0.0, sollte ich dies in Plugin-Verzeichnis aufnehmen? – on4ir4m

+0

Nein, solltest du nicht. Ich glaube nicht, dass das das Problem ist. Ich habe dir eine Frage unter deiner Frage gestellt. Überprüfen Sie diese Frage und beantworten Sie sie hier. – Programmer

Verwandte Themen