android - targetSdkVersion 26 在崩溃报告中给出异常

标签 android google-text-to-speech

根据到 2018 年 11 月将目标 SDK 版本更新到 26 的要求,我在几个月前尝试更新我的 gradle 文件并发布了我的应用程序的新版本,在更新目标 sdk 和编译 sdk 版本之后到 26(从 23)。一天之内,我开始在我的 Firebase 控制台上观察我的应用程序崩溃。原因是我在我的应用程序中使用了 TTS 服务,当定位到版本 26 时,由于致命的运行时异常,它看起来需要 TTS 服务的新实现。所以我将目标 SDK 版本还原为 23,并将 sdk 版本编译为 23。

Caused by java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.a.b.c/services.TTSService }: app is in background

此异常在运行 Android OS 8.0 和 8.1 的设备上出现。

所以一个月前,我买了一台运行 Android 8.0 (Motorola G6 Plus) 的新设备,希望能够始终如一地重现这个错误。 但它从未在此设备上发生过,即使我的应用程序针对版本 26,即使我通过我的应用程序强行触发 TTS 服务也是如此。所以,我对如何进行感到困惑。

此异常的解决方案说明here .

我目前实现和调用TTS服务的代码如下:

MainActivity oncreate 方法:

 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;
    }
}

}

我是否必须按照上述解决方案重新实现此功能?或者我可以采用一种更简单的方法来定位版本 26 SDK,但将编译 SDK 版本保留在 23(它是我应用程序中的当前状态)?任何其他解决方案将不胜感激。

最佳答案

Android 8.0+ 不允许启动后台服务。请引用this以便更好地了解问题的原因。您可以迁移到 FirebaseJobDispatcherJobScheduler取决于您的 minSdkVersion 是什么。此外,如果您使用 androidx - WorkManager .

附言请注意,将目标 SDK 设置为 26 后,通知将无法正常工作。

关于android - targetSdkVersion 26 在崩溃报告中给出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51687080/

相关文章:

java - 为什么增加边距顶部尺寸后 ImageView 会变小?

android - SpeechToText synthesizeToFile 不排队

android - 在 android 通话期间将铃声音量静音

android - 在 Android 中获取我调用的号码

android - 保存一张花了很长时间的照片

java - 将蓝牙 Android 客户端连接到蓝牙 Java 服务器

android - 如何从另一个 Activity 启动一个 Activity 的 fragment ?

java - 用于表情符号的 Google 文本转语音

java - TTS 无法从 Android 中的 IU 线程正确循环?