Приведение IBinder из другого процесса обслуживания в расширенный Binder - PullRequest
0 голосов
/ 12 сентября 2018

Я борюсь со связывателем из Android.

Я разработал приложение, которое должно загружать различные модули "драйвера" для некоторых устройств в качестве плагинов.В моем основном приложении я создаю дополнительный модуль (driverinterface), который содержит класс DriverBinder и интерфейс IDriver.Интерфейс IDriver содержит все функции для взаимодействия с модулем.Когда приложение запускается, оно обнаруживает все установленные плагины и пользователь может выбрать, какой из них следует использовать.

Вот мой простой DriverBinder

public class DriverBinder extends Binder {
    public boolean getDriver(){ return true; }
}

, и мой интерфейс является классическим:

   public interface IDriver {

        public enum TriggerButtonMode {
            NONE,
            BARCODE,
            RFID,
            TRACE
        }

        public enum ReadRange {
            AUTO, FAR, NEAR, PROXIMITY
        }

        //properties
        String getManufacturer();
        String getModelType();
        String getDeviceDescription();
        boolean isConnected();
        boolean isReading();
}

Теперь в другом приложении я написал Tiny Device Driver, который реализует мой модуль "driverinterface" и использует мой интерфейс IDriver (реализация закорочена для публикации).

public class TestDriver extends Binder implements IDriver  {
    @Override
    public String getManufacturer() {
        return null;
    }

    @Override
    public String getModelType() {
        return null;
    }

    @Override
    public String getDeviceDescription() {
        return null;
    }

    @Override
    public boolean isConnected() {
        return false;
    }

    @Override
    public boolean isReading() {
        return false;
    }
}

Так что все работает вместе, в моем главном приложении я могу найти все установленные плагины и получить к ним доступ.

Теперь я подключаюсь к своему сервису и пытаюсь привести его к классу DriverBinder,но я получаю ClassCastException, это не pssobile, чтобы привести android.os.BinderProxy к DriverBinder.Вот мой Connect:

private ServiceConnection mDriverConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "Driver connected!");

            try {
                DriverBinder connDriver = (DriverBinder) service;
                boolean isConn = connDriver.getDriver();
                String s = "";
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "Driver disconnected...");
        }
    };

Я понял, что это BinderProxy, потому что это происходит из другого процесса.Но я, как я могу взаимодействовать с этим сервисом и использовать свой функционал?Как я могу написать внешние плагины и использовать их в своем приложении?

Спасибо за помощь!

edit:

Я забыл код для сервиса, который возвращает связыватель.Вот мой TestDriverService:

public class TestDriverService extends Service {

    private final IBinder binder = new DriverBinder();
    private final IDriver mDriver = new TestDriver();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        String status = String.valueOf(((DriverBinder)binder).getDriver());
        Log.i("TestDriverService", "Service started! whoop whoop! Binder Val: " + status);
        return binder;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("TestDriverService", "OnStartCommand called!");
        return super.onStartCommand(intent, flags, startId);
    }
}
...