gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:46:26 26 4
gpt4 key购买 nike

根据到 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com