这里,我已经实现了使用Text-To-Speech读取传入的推送通知消息的功能。我为此创建了一个单独的服务类,该类可以正常工作,并且会在一段时间后出现通知,但会停止读取通知。
public class TTSService extends Service implements TextToSpeech.OnInitListener {
private static final String TAG = "TTSService";
private String mSpeechMessage;
private TextToSpeech mTts;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
mTts = new TextToSpeech(this,
this // OnInitListener
);
mTts.setSpeechRate(1f);
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
if (mTts != null) {
mTts.stop();
mTts.shutdown();
}
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
if (intent != null && intent.hasExtra(AppConstant.FEEDBACK_MSG)) {
mSpeechMessage = intent.getStringExtra(AppConstant.FEEDBACK_MSG);
}
speakMessage(mSpeechMessage);
super.onStart(intent, startId);
}
@Override
public void onInit(int status) {
Log.v(TAG, "oninit");
if (status == TextToSpeech.SUCCESS) {
int result = mTts.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.v(TAG, "Language is not available.");
} else {
if (mSpeechMessage != null) {
speakMessage(mSpeechMessage);
}
}
} else {
Log.v(TAG, "Could not initialize TextToSpeech.");
}
}
private void speakMessage(String str) {
if (str != null) {
mTts.speak(str,
TextToSpeech.QUEUE_FLUSH,
null);
}
//Stop Service
// stopSelf();
}
@Override
public void onTaskRemoved(Intent rootIntent) {
Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
restartServiceIntent.setPackage(getPackageName());
PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmService.set(
AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 1000,
restartServicePendingIntent);
super.onTaskRemoved(rootIntent);
}
}
我从FirebaseMessagingService
以以下方式启动此服务:
private void startTTSService(String message) {
Intent intent = new Intent(getApplicationContext(), TTSService.class);
intent.putExtra(AppConstant.FEEDBACK_MSG, message);
startService(intent);
}
如果有人可以帮助,那就太好了。预先感谢。
答案 0 :(得分:1)
从API级别26开始,android限制了后台服务访问。您可以通过将服务作为前台来解决此问题。
我在一个项目中遇到了同样的问题,并通过使用以下代码对其进行了修复。
在 YourService.class
private static final String NOTIFICATION_CHANNEL_ID_DEFAULT = "my_flow_notification_channel_default";
@Override
public void onCreate() {
super.onCreate();
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID_DEFAULT)
.setOngoing(false).setSmallIcon(R.drawable.ic_notification).setPriority(Notification.PRIORITY_MIN);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID_DEFAULT,
NOTIFICATION_CHANNEL_ID_DEFAULT, NotificationManager.IMPORTANCE_LOW);
notificationChannel.setDescription(NOTIFICATION_CHANNEL_ID_DEFAULT);
notificationChannel.setSound(null, null);
notificationManager.createNotificationChannel(notificationChannel);
startForeground(1, builder.build());
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO:
return START_STICKY;
}
开始服务
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
ContextCompat.startForegroundService(context, new Intent(context, YourService.class));
else
context.startService(new Intent(context, YourService.class));
停止服务
stopService(new Intent(getActivity(), YourService.class));
在您的AndroidManifest.xml中
添加此权限
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
将此内容添加到标签中。
<service
android:name=".service.YourService"
android:enabled="true"
android:exported="true" />
希望这项帮助..:)
答案 1 :(得分:0)
如果服务未处于“打开”状态,则最好将 IntentService 用于后台服务。遵循此文件 IntentService,保持编码:)