2016-12-04 4 views
0

J'ai recherché partout pour résoudre ce problème, et je suis assez certain qu'il a à voir avec mon fichier manifeste. Lorsque vous essayez de vous connecter avec le code ci-dessous avec contextService = IContextInterface.Stub.asInterface(service), les empreintes de code dans le journal indiquant que l'objet de service est toujours nulProblèmes liant une application à un service avec AIDL

contextServiceConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      contextService = IContextInterface.Stub.asInterface(service); 
      Toast.makeText(getApplicationContext(), 
        "Context Service Connected", Toast.LENGTH_SHORT) 
        .show(); 
      Log.d("IApp", "Binding is done - Context Service connected"); 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      // TODO Auto-generated method stub 
      contextService = null; 
      Toast.makeText(getApplicationContext(), "Service Disconnected", 
        Toast.LENGTH_SHORT).show(); 
      Log.d("IRemote", "Binding - Location Service disconnected"); 
     } 
    }; 
    if (contextService == null) { 
     Intent contextIntent = new Intent(); 
     contextIntent.setPackage("com.example.the_f.myapplication"); 
     contextIntent.setAction("service.contextFinder"); 
     bindService(contextIntent, contextServiceConnection, Context.BIND_AUTO_CREATE); 
     mContextIsBound = true; 
     if(contextService==null) 
      Log.d("locService","NULL"); 
    } 

Je vérifie même une deuxième fois, de sorte que si son null il va essayer de lier manuellement à celui-ci. cependant, il frappe toujours la dernière instruction if car le journal imprime le "locService: NULL".

Voici mon manifeste d'application client:

<?xml version="1.0" encoding="utf-8"?> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

et voici mon manifeste de service à distance:

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <service 
     android:name=".MyMiddleware" 
     android:enabled="true" 
     android:exported="true"></service> 
</application> 

ive redémarré ce programme 3 fois parce que je pensais qu'il construisait de manière incorrecte ou il y avait un problème dans un certain dossier enterré quelque part. Je ne suis pas vraiment un pro android donc je ne connais pas beaucoup de choses. toute aide ou orientation serait appréciée. merci d'avance

+0

Vous devez attendre sur ServiceConnected. – natario

+0

ok vous avez raison. J'ai laissé tomber une déclaration d'impression dans onServiceConnected et son ne pas être appelé. Je ne suis pas sûr de ce que je fais différent. J'ai à peu près copié les différents exemples que j'ai vus en ligne. même sur le site de développement Android, ils l'ont mis en place de cette façon. donc apparemment mon application ne se connecte jamais au service –

Répondre

0

De ce que vous avez posté, je peux voir une chose qui manque. Vous définissez une action sur l'intention

contextIntent.setAction("service.contextFinder"); 

Cependant, vous n'avez pas défini un filtre sur l'entrée de service manifeste.

Effectuez les opérations suivantes -

<service 
    android:name=".MyMiddleware" 
    android:enabled="true" 
    android:exported="true"> 
     <intent-filter> 
      <action android:name="service.contextFinder" /> 
     </intent-filter> 
</service> 

Aussi, vous ne devez pas nécessairement, mais si vous voulez limiter l'intention de simplement votre service que l'emballage est celui de l'application de service .

contextIntent.setPackage("com.example.the_f.myapplication"); 

comme natario dit, vous n'obtiendrez l'instance de talon dans le rappel onServiceConnected(), pas avant, appel presque certainement pas juste après bindService().

Espérons que cela aide.