Android: bindService всегда возвращает false (API расширения APK)

Я пытаюсь использовать расширение APK Expansion от Google для загрузки файлов расширения, которые я разместил с ними. Я также использую для этого код из SampleDownloadActivity, хотя и немного измененный, чтобы соответствовать моему приложению.

Моя проблема в том, что загрузка никогда не инициируется. В моем классе, реализующем IDownloadClient, вызывается onStart(), а onServiceConnected() — нет.

Я проследил это до этой строки в DownloaderClientMarshaller:

if( c.bindService(bindIntent, mConnection, Context.BIND_DEBUG_UNBIND) ) {

Это всегда возвращает false, поэтому служба не привязана.

Я использую вызывающую активность в TabHost, что вызвало проблемы у других людей. Они говорили, что вы не должны передавать контекст TabHost, а не контекст приложения в функцию подключения. Я изменил это, выполнив:

mDownloaderClientStub.connect(getApplicationContext());

вместо:

mDownloaderClientStub.connect(this);

но это не помогает, я все еще получаю ложь. Я провожу все свои тесты на эмуляторе, если это имеет значение.

Я действительно дергаю себя за волосы на этом. Если у кого есть идеи, буду очень признателен!


person user1454610    schedule 24.07.2012    source источник
comment
Проверьте это: может помочь.   -  person MysticMagicϡ    schedule 12.12.2012
comment
ты решил проблему?   -  person Bolein95    schedule 18.07.2017


Ответы (1)


В большинстве случаев метод bindService() возвращает false, если служба не была объявлена ​​в файле манифеста приложения.

В моем случае проблема заключалась в том, что я передал методу DownloaderClientMarshaller.CreateStub() неправильный объект класса. Я случайно использовал DownloaderService.class вместо MyDownloaderService.class.

При использовании API загрузчика обязательно передайте правильный объект класса, который расширяет базу DownloaderService.

Я рекомендую использовать обновленную библиотеку загрузчика, включенную в пакет Better APK Expansion. В нем исправлена ​​эта и другие проблемы, а также предоставлен упрощенный API, который сводит к минимуму шансы выстрелить себе в ногу.

Чтобы получать ход загрузки, вам просто нужно расширить файл BroadcastDownloaderClient.

public class SampleDownloaderActivity extends AppCompatActivity {
    private final DownloaderClient mClient = new DownloaderClient(this);

    // ...

    @Override 
    protected void onStart() {
        super.onStart();
        mClient.register(this);
    }

    @Override 
    protected void onStop() {
        mClient.unregister(this);
        super.onStop();
    }

    // ...

    class DownloaderClient extends BroadcastDownloaderClient {

        @Override 
        public void onDownloadStateChanged(int newState) {
            if (newState == STATE_COMPLETED) {
                // downloaded successfully...
            } else if (newState >= 15) {
                // failed
                int message = Helpers.getDownloaderStringResourceIDFromState(newState);
                Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
            } 
        }

        @Override 
        public void onDownloadProgress(DownloadProgressInfo progress) {
            if (progress.mOverallTotal > 0) {
                // receive the download progress
                // you can then display the progress in your activity
                String progress = Helpers.getDownloadProgressPercent(
                        progress.mOverallProgress, progress.mOverallTotal);
                Log.i("SampleDownloaderActivity", "downloading progress: " + progress);
            }
        }
    }

}

Ознакомьтесь с полной документацией на странице библиотеки.

person Bolein95    schedule 28.07.2017