java.lang.NoSuchMethodError: Нет виртуального метода startForeground - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь запустить службу переднего плана, но получаю NoSuchMethodError. Он говорит, что startForeground не найден, но похоже, что он присутствует. У меня действительно есть служба и разрешение android.permission.FOREGROUND_SERVICE, установленное в файле манифеста.

public void startForegroundService(Intent intent) {
    Log.d(TAG, "startForegroundService: " + intent);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        getContext().startForegroundService(intent);
    } else {
        getContext().startService(intent);
    }
}

И получаю эту ошибку:

java.lang.NoSuchMethodError: No virtual method startForeground(ILandroid/app/Notification;I)V in class Lcom/volnoor/backup/core/sync/BaseForegroundService; or its super classes (declaration of 'com.volnoor.backup.core.sync.BaseForegroundService' appears in /data/app/com.volnoor.backup-aFOxNxXCGe_PmUbYxrrdHw==/base.apk!classes2.dex)
    at com.volnoor.backup.core.sync.BaseForegroundService.onStartCommand(BaseForegroundService.java:27)
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3567)
    at android.app.ActivityThread.-wrap20(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1718)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6687)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)

DriveService:

public class DriveService extends BaseForegroundService {

    @Override
    protected int getId() {
        return 1;
    }

    @Override
    protected Notification getNotification() {
        return new NotificationCompat.Builder(this, BackupApplication.CHANNEL_FOREGROUND_SYNC)
                .setContentTitle("TODO Title")
                .setContentText("TODO Text")
                .setSmallIcon(R.drawable.ic_google_drive)
                // TODO .setContentIntent(pendingIntent)
                .build();
    }

    @Override
    protected int getServiceType() {
        return FOREGROUND_SERVICE_TYPE_DATA_SYNC;
    }
}

BaseForegroundService:

public abstract class BaseForegroundService extends Service {

    private static final String TAG = "BaseForegroundService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");

        startForeground(getId(), getNotification(), getServiceType());

        return START_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    protected void stopForegroundService() {
        Log.d(TAG, "stopForegroundService");

        stopForeground(true);
        stopSelf();
    }

    protected abstract int getId();

    protected abstract Notification getNotification();

    protected int getServiceType() {
        return FOREGROUND_SERVICE_TYPE_MANIFEST;
    }
}

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Выбранная вами перегрузка startForeground() была добавлена ​​только в API 29. Возможно, ваше устройство относится к более раннему уровню API.

Решение: используйте startForeground(int, Notification), если Build.VERSION.SDK_INTменьше чем Build.VERSION_CODES.Q.

Я не знаю, как это прошло после твоего пуха.

0 голосов
/ 29 октября 2019

Проблема была с startForeground(getId(), getNotification(), getServiceType()); методом (3 аргумента). Все работало нормально после изменения на startForeground(getId(), getNotification()) (2 аргумента);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...