Я создаю приложение для блокировки вызовов, которое использует 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?
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 программного обеспечения, работающего в настоящее время на этом аппаратном устройстве. Это значение никогда не меняется во время загрузки устройства, но может увеличиваться, когда производитель оборудования предоставляет обновление OTA.
Вот ссылка на все коды SDK:
Я использовал это раньше, чтобы избежать выполнения кода, но, насколько я знаю, это не относится к классам, поскольку я не могу поместить это вокруг класса.
Я не уверен, что точно понимаю, что вы пытаетесь сделать. Это не обойдет класс, класс будет создан, а его члены будут вызываться из блоков if/else.
По сути, есть причина блокировать вызовы на более ранних уровнях API, которые не работают на более поздних. Решением для блокировки вызовов в более поздних API является использование CallScreeningService, представленного в API 24. Однако, чтобы расширить аудиторию, которая может использовать мое приложение, я хочу по-прежнему поддерживать старый способ блокировки вызовов. Для этого нового способа блокировки вызовов мне нужно создать класс, который расширяет CallScreeningService, что можно сделать только в API 24 >=, поэтому я получаю некоторые ошибки, поскольку минимальный уровень API равен 16. Я не могу поставить операторы if вокруг класса.
Нажмите Alt + Enter
(на Mac) на ошибке, чтобы получить быстрое решение вашей проблемы, например:
Здесь вы видите, что можете исправить проблему, используя одну из двух аннотаций.
@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");
}
}
Это вызовет ошибку сборки, если вы попытаетесь использовать его вне проверки версии.
Затем вы можете выполнить условную проверку версии, чтобы использовать свой новый класс или старый.
Надеюсь, это поможет!
См.: Как избежать неправильного использования тегов?