마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

백그라운드로 갔다 돌아오면 TTS 가 작동하지 않습니다

0 추천

FCM푸시 알림이 오면 푸시알림 내용을 tts로 읽어주고 싶습니다.

그런데 홈키눌러서 앱을 백그라운드로 한번 돌리고 실행중 앱목록으로 다시 화면에띄운 뒤부터는

TTS가 동작하지 않습니다.

tts.speak함수까지 출력할 문자열과 함께 접근하는것은 로그캣으로확있햇지만( TTS진입 with~~~~) 작동하지 않아 문제입니다

방법이 있을까요? 

package com.example.sdna.pushtotts2;

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {
    TextToSpeech tts;
    TextToSpeechService _tts;
    Context context;

    private static final String TAG = "FirebaseMsgService";
    public class dididi implements TextToSpeech.OnInitListener
    {
        @Override
        public void onInit ( int status){
        if (status != TextToSpeech.ERROR) {
            tts.setLanguage(Locale.KOREAN);
        }
    }
    }

    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //sendPushNotification3(remoteMessage);
        Log.d("slog", "메시지 리시브");
        sendPushNotification(remoteMessage.getData().get("message"));
    }
    private void TextTTS(String message){
        Log.d("slog", "TTS진입 with"+message);

        tts=new TextToSpeech(getApplicationContext(), new dididi());
        tts.setLanguage(Locale.KOREAN);
        String text = "알림이 도착했습니다";
        String text2 = message;

        Log.d("slog", "TTS 말하는중?"+tts.isSpeaking());

        //http://stackoverflow.com/a/29777304
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Log.d("slog", "TTS진입2");
            ttsGreater21(text2);
        } else {
            Log.d("slog", "TTS진입3");
            ttsUnder20(text2);
        }
/*
        SystemClock.sleep(5000);
        if(tts !=null){
            tts.stop();
            tts.shutdown();
        }*/
    }



    private void sendPushNotification(String message) {
        System.out.println("received message : " + message);
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher) )
                .setContentTitle("Push Title ")
                .setContentText(message)
                .setAutoCancel(true)
                //.setSound(defaultSoundUri).setLights(000000255,500,2000)
                .setContentIntent(pendingIntent);


        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
        wakelock.acquire(5000);

        notificationManager.notify(1231231/* ID of notification */, notificationBuilder.build());


        TextTTS(message);
    }

 


    @SuppressWarnings("deprecation")
    private void ttsUnder20(String text) {
        HashMap<String, String> map = new HashMap<>();
        map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
        Log.d("slog", "TTS speak");
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private void ttsGreater21(String text) {
        String utteranceId=this.hashCode() + "";
        Log.d("slog", "TTS speak");
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
    }


    @Override
    public void onStart(Intent intent, int startId) {
        Log.d("slog", "onStart()");
        super.onStart(intent, startId);
        Toast toast = Toast.makeText(context, "서비스 onStart", Toast.LENGTH_SHORT);
        toast.show();
    }

    @Override
    public void onDestroy() {
        Log.d("slog", "onDestroy()");
        super.onDestroy();
        //Toast toast = Toast.makeText(context, "서비스 onDestroy", Toast.LENGTH_SHORT);
        //toast.show();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("slog", "onCreate()");
        context = getApplicationContext();
        //Toast toast = Toast.makeText(context, "서비스 onCreate", Toast.LENGTH_SHORT);
       // toast.show();
    }

}


/*
아이콘 + 제목 + 긴 텍스트

알림이 왔을 때는 제목과 아래로 당겨주세요라는 텍스트를 보여 줍니다.
아래로 드래그 하면 긴 텍스트를 보여줍니다.
NotificationCompat.BigTextStyle
을 사용합니다.


참고
https://trandent.com/board/Android/detail/738
 */

 

11-23 17:39:01.873 22791-22791/com.example.sdna.pushtotts2 D/slog: onCreate()
11-23 17:39:01.883 22791-23422/com.example.sdna.pushtotts2 D/slog: 메시지 리시브
11-23 17:39:01.923 22791-23422/com.example.sdna.pushtotts2 D/slog: TTS진입 with오류 발생합니다
11-23 17:39:01.923 22791-23422/com.example.sdna.pushtotts2 D/slog: TTS 말하는중?false
11-23 17:39:01.923 22791-23422/com.example.sdna.pushtotts2 D/slog: TTS진입3
11-23 17:39:01.933 22791-23422/com.example.sdna.pushtotts2 D/slog: TTS speak
11-23 17:39:01.933 22791-22791/com.example.sdna.pushtotts2 D/slog: onDestroy()
 

신입 (570 포인트) 님이 2016년 11월 23일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...