휴대폰의 자동음성 서비스(TTS)를 비활성화 하는 방법(수정됨)

몇몇 휴대폰에서 TTS(자동음성)기능이 자동으로 켜진다고 하는군요.
예를 들면, 파일을 열때마다 “파일이 열렸습니다.”라고 나오거나 스크롤 제스쳐가 제대로 동작하지 않거나.

아마 휴대폰 내의 TTS 기능이 자동으로 활성화된것 같습니다.

방안 1.
시스템 셋팅 – 애플리케이션 – 모두 – TTS(삼성 TTS 혹은 구글 TTS 엔진) – 비활성화
혹은 시스템 셋팅 – 접근성 – 토크백 – 끄기
혹은 시스템 셋팅 – 언어 및 입력 – TTS(자동음성) – 드라이빙 모드(운전모드) – 비활성화
를 해보세요.

방안 2. (기본 키보드 앱을 사용하는 경우)
기본 키보드 앱(삼성 키보드 등)을 사용하는 경우 자동으로 TTS모드가 활성화되는 것 같습니다.
그러므로 기본 키보드 앱이 이 문제를 발생시킵니다. 구글 키보드와 같은 다른 키보드 앱을 설치하고, 설치한 키보드 앱을 기본으로 바꿔주세요.

구글 한글 키보드 설치 및 셋팅하는 방법
플레이 스토어에서 “구글 한글 키보드”를 검색하세요.
시스템 셋팅 – 언어 및 입력 에서 구글 한글 키보드를 활성화하여 주세요.
그리고 구글 한글 키보드를 기본 키보드로 설정해 주세요.
구글 키보드 설정에서 쿼티 혹은 천지인 등 편한 입력방법을 선택하여 주세요.

경우에 따라 기본 키보드앱은
언어 및 입력 – 제조사 키보드(삼성 키보드) – 사용안함,
혹은 시스템 셋팅 – 애플리케이션 – 모두 – 제조사 키보드(삼성 키보드 등) – 사용안함 으로 설정해야 될 수도 있어요.


방안 3. (웹 브라우저에서만  TTS 작동할 경우)
시스템 셋팅- 접근성 – 웹스크립트 설치 – 허용안함  으로 해보세요.


추가로… 접근성 옵션을 사용해야 하는 이유
이메일, 문자 수신 등은 안드로이드 기본기능입니다. 하지만, 인스턴트 메시지 앱(카톡, 라인 등)은 써드파티 업체에 의해 추가된 기능이며, 저는 인스턴트 메신저 업체의 개발자가 아닙니다. 인스턴트 메시지를 수신하였을 때, 제가 받을 수 있는 방법이 없습니다. 그래서, 인스턴트 메시지가 왔을 때, 휴대폰의 알림을 긁어서 시계로 뿌려줍니다. 사용자가 저의 애플리케이션에 접근성 권한을 주어야 휴대폰의 알림에 접근할 수 있습니다.

챗온 개발 중..

오늘까지 바빠서 신경 못쓰다 이번 주엔 좀 업데이트를 할 수 있겠네요.
요청받았던 챗온이랑(이거 테스트 어떡하지..) 메뉴키 기능 추가 정도 할까 합니다.

로직도 간단하고 카톡에서 더 좋게 워치용 앱을 만들 수도 있고.. 저작권도 있고해서
스마트 워치용 알림 애플리케이션을 유료로 전환할 생각은 없습니다.
많이 써주시면 감사하겠습니다.

현재 버전(1.4.2)에서 리스트에서 롱클릭하거나 메시지 자세히 보기 화면에서 메뉴키 누르면 나오는 버튼은 상단의 버튼이 메시지 전체 삭제, 아래 버튼이 해당 메시지 삭제 입니다.
제가 감각이 없어서 아이콘이 그러네요;;

다른 App의 ImageView 에서 추출한 Drawable 을 파일로 저장 후 Uri보내기

다른 AppImageView 에서 추출한 Drawable 을 파일로 저장 후 Uri보내기



                                 contactDrawable = MyUtil.extractImage(context, root);

                             Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
                             Canvas canvas = newCanvas(bitmap);
                             drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
                             drawable.draw(canvas);
                                   if(drawable instanceof BitmapDrawable) {
                                 bitmap = ((BitmapDrawable)drawable).getBitmap();
                             }
                                
                                 try{
                                         String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
                                        
                                         File mDir = new File(extStorageDirectory + “/SW2Line/”);
                                         if(!mDir.exists())
                                                mDir.mkdir();
                                        
                                        
                                     FileOutputStream out = new FileOutputStream(extStorageDirectory + “/SW2Line/tempProfile.png”);
                                     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
                                     
                                     out.flush();
                                     out.close();
                                     
                                     contactIcon = Uri.fromFile(new File(extStorageDirectory + “/SW2Line/tempProfile.png”)).toString();
                                     
                                     LogControl.i(TAG,“out toString = “ + contactIcon );
                                 } catch(Exception e) {
                                     e.printStackTrace();
                                 }
                         }catch(Exception e) {e.printStackTrace(); contactIcon = “”;}

어떻게 구성되어 있는지 알 수 없는 RemoteViews 에서 특정 클래스의 인스턴스 추출하기

어떻게 구성되어 있는지 알 수 없는 RemoteViews 에서 특정 클래스의 인스턴스 추출하기.

찾기 원하는 클래스의 인스턴스가 나오면 반환한다.
type == 0 이면 첫번째, 1 이면 두번째… 찾은 인스턴스.

문제는 트리서치를 하기 때문에 단말이나 상황에 따라 찾는 순서가 달라질 수도 있지 않을까.


예) RemoteViews에서TextView 의 인스턴트 추출하기.

count 는 정적 변수.

      static public TextView extractTextView(Context context, RemoteViews views, int type) {
           
        Context remotePackageContext ;
        remotePackageContext  = context.getApplicationContext();
        try{
              remotePackageContext = context.createPackageContext(TARGET_PACKAGE, 0);
        }catch(Exception e){;}
       
        LinearLayout ll = new LinearLayout(remotePackageContext );
        View view = views.apply(remotePackageContext, ll);
        count = 0;
       
        LogControl.i(TAG, “msg = ” + searchForTextView(view,2).getText().toString());
        count = 0;
       
        return searchForTextView(view,type);
    }
     
     
    static public TextView searchForTextView(View view, int duration) {
        if (view instanceof TextView) {
              TextView textView = (TextView)view;
              String text = textView.getText().toString();
              count ++;
              LogControl.i(TAG, “tview string = ” + text);
             
              if(textView.getTag() == null && count > duration){
                  
                   return (TextView)view;
              }
        }

        if (view instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup) view;
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                TextView result = searchForTextView(viewGroup.getChildAt(i), duration);
                if (result != null) {
                     if(count > duration)
                           return result;
                }
            }
        }
        return null;
    }