Как я могу запустить класс только на определенных уровнях API?

Я создаю приложение для блокировки вызовов, которое использует Itelephony для блокировки вызовов. Я хочу, чтобы мое приложение работало на уровнях API, начиная с API 16. Чтобы мое приложение работало на текущих уровнях API, мне нужно использовать CallScreeningService для проверки телефонных звонков. Проблема в том, что CallScreeningService работает только на уровне API 24 и выше. Как я могу сделать так, чтобы Itelephony блокировала вызовы для уровня API ниже 24, а этот класс блокировал вызовы для уровней API 24 и выше?

import android.telecom.Call;
import android.telecom.CallScreeningService;
import android.util.Log;

public class CallScreenService extends CallScreeningService {
    private static final int REQUEST_ID = 1;

    @Override
    public void onScreenCall(Call.Details callDetails) {
        CallResponse.Builder response = new CallResponse.Builder();
        Log.e("CallBouncer", "Call screening service triggered");
    }
}

Как вы используете CallScreeningService из MainActivity?

Perseus 12.07.2019 05:18
1
2
281
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

if (android.os.Build.VERSION.SDK_INT >= 24){
  //do the thing that requires SDK 24 and greater
else{
  //do the thing that requires less than SDK 24
}

Документация SDK_INT

SDK_INT — это версия SDK программного обеспечения, работающего в настоящее время на этом аппаратном устройстве. Это значение никогда не меняется во время загрузки устройства, но может увеличиваться, когда производитель оборудования предоставляет обновление OTA.

Вот ссылка на все коды SDK:

Коды версий SDK

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

Jaitnium 24.06.2019 03:20

Я не уверен, что точно понимаю, что вы пытаетесь сделать. Это не обойдет класс, класс будет создан, а его члены будут вызываться из блоков if/else.

smitty1 24.06.2019 03:41

По сути, есть причина блокировать вызовы на более ранних уровнях API, которые не работают на более поздних. Решением для блокировки вызовов в более поздних API является использование CallScreeningService, представленного в API 24. Однако, чтобы расширить аудиторию, которая может использовать мое приложение, я хочу по-прежнему поддерживать старый способ блокировки вызовов. Для этого нового способа блокировки вызовов мне нужно создать класс, который расширяет CallScreeningService, что можно сделать только в API 24 >=, поэтому я получаю некоторые ошибки, поскольку минимальный уровень API равен 16. Я не могу поставить операторы if вокруг класса.

Jaitnium 24.06.2019 04:55
Ответ принят как подходящий

Нажмите Alt + Enter (на Mac) на ошибке, чтобы получить быстрое решение вашей проблемы, например:

Quick Fix

Здесь вы видите, что можете исправить проблему, используя одну из двух аннотаций.

@RequiresApi помечает класс как необходимый для запуска на определенном уровне API или выше, несмотря на ваш минимальный уровень SDK.

@RequiresApi(Build.VERSION_CODES.N)
public class CallScreenService extends CallScreeningService {
    private static final int REQUEST_ID = 1;

    @Override
    public void onScreenCall(Call.Details callDetails) {
        CallResponse.Builder response = new CallResponse.Builder();
        Log.e("CallBouncer", "Call screening service triggered");
    }
}

Это вызовет ошибку сборки, если вы попытаетесь использовать его вне проверки версии.

Version Check Warning

Затем вы можете выполнить условную проверку версии, чтобы использовать свой новый класс или старый.

Version Check Passes

Надеюсь, это поможет!

Другие вопросы по теме