Exception Android ClassCast lors de la liaison au service

D'accord, je suis nouveau sur le développement d'Android et j'essaie de me lier à un service afin que je puisse appeler des méthodes sur le service une fois qu'il a été lancé. L'activité et le service décrits ci-dessous font partie d'une même application, donc il ne devrait y avoir aucun problème, mais chaque fois que je lance mon application, j'ai l'erreur suivante:

Java.lang.ClassCastException: android.os.BinderProxy

  • Existe-t-il un chemin d'accès semblable au fichier: /// android_asset / qui pointe vers le répertoire des applications?
  • Comment changer la couleur par défaut de la barre de progression?
  • Dot (.) Au lieu de l'onglet Swipe
  • Construire une unité de soins intensifs avec NDK
  • Plusieurs notifications avec une icône de barre d'état dans Android
  • Android Asynctask passant une seule chaîne
  • La ligne sur laquelle se passe ceci est:

    LocalBinder binder = (LocalBinder) service; 

    Mon code d'activité (simplifié est):

     public class Main extends Activity { boolean gpsBound = false; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } /** Called whenever the activity is started. */ @Override protected void onStart() { super.onStart(); // Bind to GPSService Intent i = new Intent(this, GPSService.class); startService(i); bindService(i, connection, Context.BIND_AUTO_CREATE); } /** service binding */ private ServiceConnection connection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { // After binding to GPSService get the instance of it returned by IBinder LocalBinder binder = (LocalBinder) service; gpsBound = true; } public void onServiceDisconnected(ComponentName className) { gpsBound = false; } }; } 

    Un service:

     public class GPSService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public IBinder onBind(Intent i) { // TODO Auto-generated method stub return new LocalBinder<GPSService>(this); } /** * Our implementation of LocationListener that handles updates given to us * by the LocationManager. */ public class CustomLocationListener implements LocationListener { DBHelper db; CustomLocationListener() { super(); } // Overridden methods here... } } 

    Et enfin, mon LocalBinder:

     /** * A generic implementation of Binder to be used for local services * @author Geoff Bruckner 12th December 2009 * * @param <S> The type of the service being bound */ public class LocalBinder<S> extends Binder { private String TAG = "LocalGPSBinder"; private WeakReference<S> mService; public LocalBinder(S service){ mService = new WeakReference<S>(service); } public S getService() { return mService.get(); } } 

    Je comprends le sens de l'exception ClassCast mais je ne peux pas comprendre ce qu'il faut faire! J'ai suivi l'exemple dans la documentation de Google, mais ça ne fonctionne toujours pas. Quelqu'un peut-il éclairer ce qui pourrait causer cela?

    Merci d'avance!

  • Android java.net.UnknownHostException: l'hôte n'est pas résolu
  • Comment créer une interface utilisateur ou un widget qui fait partie de toutes les applications Android?
  • Impossible d'établir une connexion entre 2 périphériques bluetooth
  • Lorsque j'utilise des étoiles personnalisées pour Android RatingBar, affiche toujours la demi-étoile pour les valeurs décimales inférieures à 0,5
  • Utilisation du fichier json local dans Android
  • Android. Modifie la couleur de fond d'un FrameLayout du code
  • 4 Solutions collect form web for “Exception Android ClassCast lors de la liaison au service”

    Le LocalBinder passé dans onServiceConnected a un argument de type générique, alors que votre LocalBinder binder local LocalBinder binder n'a pas un.

    Résolvez-le d'une manière ou d'une autre, soit en supprimant le type générique de la définition de LocalBinder, soit en ajoutant un à votre déclaration de votre classeur variable local dans onServiceConnected

     class MyBoundService extends Service{ private final IBinder mBinder = new MyBinder(); @Override public IBinder onBind(Intent intent) { return mBinder; } public class MyBinder extends Binder{ public void doStuff(){ //Stuff } //More Binder Methods } } class MyActivity extends Activity{ private MyBinder mBinder; @Override protected void onStart(){ Intent intent = new Intent(this, MyBoundService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop(){ unbindService(mConnection); } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { mBinder = (TaskBinder) service; mBound = true; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; private void doStuff(){ if (mBound) mBinder.doStuff(); } } 

    Il n'y a pas vraiment besoin de parler avec des références faibles et autres. Assurez-vous de vous séparer (je n'ai pas dans l'échantillon)

    Si vous souhaitez appeler des méthodes de service dès que possible, mettez simplement des appels dans onServiceConnected, après avoir configuré mBinder. Sinon, il suffit d'invoquer d'autres rappels (sur les événements Cliquer et autres).

    Supprimez le process attribut dans votre AndroidManifest.xml de votre service.

    A eu la même erreur. J'avais ajouté l'attribut android: process = ": process_description" dans le manifeste. Lorsque vous l'ajoutez, votre service est créé en tant que processus distinct et, par conséquent, vous obtenez une instance de binderProxy (d'où l'exception de classe)

    Si vous essayez de vous lier à un service local que oui, vous pouvez simplement le lancer. Toutefois, si vous essayez de vous lier à un service distant (processus séparé), vous devez utiliser la méthode AIDL comme prescrit dans cet article.

    http://developer.android.com/guide/components/aidl.html

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.