java.lang.Classcastexception-Fehler: android.os.BinderProxy kann nicht umgewandelt werden, LocalBinder
Ich habe eine Service
Versuch, mich zu binden, mein main Activity
, aber ich erhalte eine
java.lang.Classcastexception-Fehler: android.os.BinderProxy kann nicht umgewandelt werden, com.walintukai.rubix.ConnectionService$LocalBinder.
Ich erklärt haben, den Dienst in meiner manifest. Warum ist das passiert?
Manifest-Erklärung
<service android:name=".ConnectionService" />
Service (simplified code)
public class ConnectionService extends Service {
static final String TAG = ConnectionService.class.getName();
private BluetoothAdapter mBtAdapter = null;
public BluetoothGatt mBluetoothGatt = null;
private ConnectionServiceEventListener mIRedBearServiceEventListener;
HashMap<String, BluetoothDevice> mDevices = null;
private BluetoothGattCharacteristic txCharc = null;
private final IBinder mBinder = new LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class LocalBinder extends Binder {
public ConnectionService getService() {
return ConnectionService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBtAdapter = bluetoothManager.getAdapter();
if (mBtAdapter == null)
return;
if (mDevices == null)
mDevices = new HashMap<String, BluetoothDevice>();
}
@Override
public void onDestroy() {
if (mBluetoothGatt == null)
return;
mBluetoothGatt.close();
mBluetoothGatt = null;
super.onDestroy();
}
}
Haupttätigkeit
public class MainActivity extends ActionBarActivity {
private ConnectionService service;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("ConnectionService", "Disconnected");
service = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LocalBinder binder = (LocalBinder) service;
service = (IBinder) binder.getService();
if (service != null) {
Log.i("RedBearService", "Connected");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.container, ViewPagerFragment.newInstance()).commit();
}
}
@Override
public void onStart() {
super.onStart();
startService();
}
@Override
public void onStop() {
super.onStop();
stopService();
}
private void startService() {
Intent service = new Intent(this, ConnectionService.class);
bindService(service, connection, Context.BIND_AUTO_CREATE);
}
private void stopService() {
unbindService(connection);
}
}
Stacktrace
07-30 17:19:39.065: E/AndroidRuntime(20891): java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.walintukai.rubix.ConnectionService$LocalBinder
07-30 17:19:39.065: E/AndroidRuntime(20891): at com.walintukai.rubix.MainActivity$1.onServiceConnected(MainActivity.java:58)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1110)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1127)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.os.Handler.handleCallback(Handler.java:733)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.os.Handler.dispatchMessage(Handler.java:95)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.os.Looper.loop(Looper.java:136)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.app.ActivityThread.main(ActivityThread.java:5050)
07-30 17:19:39.065: E/AndroidRuntime(20891): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 17:19:39.065: E/AndroidRuntime(20891): at java.lang.reflect.Method.invoke(Method.java:515)
07-30 17:19:39.065: E/AndroidRuntime(20891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
07-30 17:19:39.065: E/AndroidRuntime(20891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
07-30 17:19:39.065: E/AndroidRuntime(20891): at dalvik.system.NativeStart.main(Native Method)
- Starten Sie den Dienst auf dem gleichen Prozess wie die app?
- Sein sollte. Wie kann ich das überprüfen? Ich bin ab und auch die Bindung des Dienstes in der
onStart
Anruf von meiner Haupttätigkeit. - Bitte zeigen Sie, wie Sie erklären, den Dienst in der manifest-Datei.
- Können Sie Ihre Haupttätigkeit-code als auch?
- Bearbeitet sind Haupt-Tätigkeit-und manifest-Erklärung.
- Ich bin tatsächlich erhalten eine andere Fehlermeldung jetzt: java.lang.Classcastexception-Fehler: com.walintukai.rubix.ConnectionService kann nicht gewirkt werden, um android.os.IBinder, die auf dieser Linie:
service = (IBinder) binder.getService();
- Sind Sie sicher, dass Ihre vereinfachte code korrekt ist? Die Aktivität der onServiceConnected ist falsch casting-die Rückkehr von der getService-Methode zurück, um ein IBinder.
- WOW... ok, ich fühle mich wirklich dumm. Ich nannte den
ConnectionService
variableservice
und diese wurde sich mit der Methode, denn Sie hatte die variableservice
als auf die der Parameter... Danke für die Hilfe Jungs! /foreheadslap
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast es umgedreht:
werden sollte:
Diese Frage ist ein paar Jahre alt und die akzeptierte Antwort hat bei mir nicht funktioniert. Vielleicht hat sich etwas geändert in der Android-Umgebung, da wurde die Frage gestellt und beantwortet werden.
Aber ich bin auf eine einfache Lösung, die funktionierte. Ich sah eine andere Frage, DAMIT wurde versucht zu starten, 2 Dienstleistungen, und Sie hatte eine ähnliche Fehlermeldung (Java.lang.Classcastexception-Fehler: android.os.BinderProxy jedes mal, wenn ich erklären und die Ausführung der beiden Dienste). Eine der Antworten (@Coeffect) erwähnt, dass die 2 Leistungen nicht notwendigerweise in demselben Prozess ausgeführt werden.
Ich habe mir überlegt, dass es möglich ist (wahrscheinlich?) dass in meinem Fall die Aktivität und der service waren in verschiedenen Prozessen ausgeführt werden. Also ich habe die
android:process
element, um sowohl meine Tätigkeit und mein server, und dass es behoben.Hier ist ein Beispiel AndroidManifest.xml. Beachten Sie, dass sowohl die
<activity>
und<service>
- tags gehörenandroid:process=":location"
:Ich auch diesem problem begegnet. Meine situation ist wie folgt.
Meine Tätigkeit und Leistung nicht in einem gleichen Prozess.
Ich binden wollen, die den Dienst mit der Aktivität. Dann lief ich in das gleiche problem. Ich löste es mit dieser Methode.
Bitte achten Sie auf dieses. Beim Aufruf der bindService() Methode mehrere Male, onBind() wird nur aufgerufen, wieder einmal standardmäßig.Wenn Sie möchten onBind() ausführen, mehrere Male, Sie sollte dies tun.
Ich hoffe es kann dir helfen.