targetSdkVersion 26 dando excepciones en informes de fallas
Según el requisito de actualizar la versión de SDK dirigida a 26 para noviembre de 2018, intenté actualizar mi archivo gradle hace unos meses y lancé una nueva versión de mi aplicación, después de actualizar las versiones de sdk objetivo y compilar sdk a 26 (de 23). En un día, comencé a observar fallas en mi aplicación en mi consola Firebase. La razón era que estaba usando el servicio TTS en mi aplicación, y cuando apuntaba a la versión 26, parece que requería una nueva implementación para el servicio TTS, debido a la excepción fatal en tiempo de ejecución. Así que revertí la versión de destino del SDK a 23 y compilé la versión de SDK a 23.
Caused by java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.a.b.c/services.TTSService }: app is in background
Esta excepción se viosolament para los dispositivos con sistema operativo Android 8.0 y 8.1.
ace un mes, compré un nuevo dispositivo con Android 8.0 (Motorola G6 Plus), con la esperanza de reproducir este error de manera consistente. @Pero nunca sucedió en este dispositivo, a pesar de que mi aplicación estaba dirigida a la versión 26, incluso cuando activé forzosamente el servicio TTS a través de mi aplicación. Por lo tanto, estoy confundido sobre cómo proceder.
La solución para esta excepción se explicaaqu.
Mi código actual para implementar y llamar al servicio TTS es el siguiente:
Método de creación de actividad principal:
if(!isMyServiceRunning(TTSService.class))//Start a service instance only if service is currently not running
startService(new Intent(MainActivity.this, TTSService.class));
TTSService.java:
package services;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Environment;
import android.os.IBinder;
import android.speech.tts.TextToSpeech;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;
import com.google.firebase.crash.FirebaseCrash;
import constants.ConstantParams;
public class TTSService extends Service {
private static TextToSpeech voice =null;
public static TextToSpeech getVoice() {
return voice;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
// not supporting binding
return null;
}
public TTSService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
try{
voice = new TextToSpeech(TTSService.this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(final int status) {
}
});
}
catch(Exception e){
e.printStackTrace();
FirebaseCrash.report(new Exception("Error in initializing TTS object"));
FirebaseCrash.log("Error in initializing TTS object");
}
return Service.START_STICKY;
}
@Override
public void onDestroy() {
clearTtsEngine();
super.onDestroy();
}
public static void clearTtsEngine()
{
if(voice!=null)
{
voice.stop();
voice.shutdown();
voice = null;
}
}
}
¿Tengo que volver a implementar esta característica según la solución mencionada anteriormente? ¿O puedo recurrir a un enfoque más simple de apuntar a la versión 26 SDK, pero retener la versión de compilación SDK en 23 (es el estado actual en mi aplicación)? Cualquier otra solución sería apreciada.