0

휴대 전화에는 Google 앱과 S-voice 앱이라는 두 가지 음성 검색 기능이 설치되어 있습니다. 기본 앱은 아래 그림과 같은 S-voice 앱입니다. 제 질문은 안드로이드 6.0에서 프로그래밍 방식으로 기본 음성 응용 프로그램을 얻는 방법입니다. 이것은 내가 내 입력 com.samsung.voiceserviceplatform 때 항상 곁에 true를 반환한다 코드로 안드로이드에 기본 장치 지원 응용 프로그램을 얻는 방법은 무엇입니까?

private boolean isMyAppLauncherDefault(String myPackageName) { 
    final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN); 
    filter.addCategory(Intent.CATEGORY_HOME); 

    List<IntentFilter> filters = new ArrayList<IntentFilter>(); 
    filters.add(filter); 
    List<ComponentName> activities = new ArrayList<ComponentName>(); 
    final PackageManager packageManager = (PackageManager) getPackageManager(); 

    packageManager.getPreferredActivities(filters, activities, null); 
    for (ComponentName activity : activities) { 

     Log.d(TAG,"======packet default:==="+activity.getPackageName()); 
    } 
    for (ComponentName activity : activities) { 

     if (myPackageName.equals(activity.getPackageName())) { 
      return true; 
     } 
    } 
    return false; 
} 

위의 기능

를 무슨 짓을 미리

enter image description here

에 감사드립니다. 반면에 기본 앱은 항상 com.google.android.googlequicksearchbox을 반환합니다 (Google 음성 나타냄)

+0

Google Apps를 프로 그램으로 시작해야합니까? – AndroidHacker

+0

아니요, 선생님, 기본 설정에서 Google 또는 svoice 앱을 켜기 만하면됩니다. 예를 들어, 내 기본 설정이 svoice 인 경우 svoice가 시작됩니다. 기본 음성 설정이 Google 음성 인 경우 Google 음성 – Jame

답변

3

DefaultAssistPreference 현재는 지원 검색 AssistUtils의 숨겨진 방법을 사용합니다. 당신이 반사를 사용하지 않을 경우 직접 시스템 설정을 확인할 수 있습니다

public ComponentName getCurrentAssistWithReflection(Context context) { 
    try { 
     Method myUserIdMethod = UserHandle.class.getDeclaredMethod("myUserId"); 
     myUserIdMethod.setAccessible(true); 
     Integer userId = (Integer) myUserIdMethod.invoke(null); 

     if (userId != null) { 
      Constructor constructor = Class.forName("com.android.internal.app.AssistUtils").getConstructor(Context.class); 
      Object assistUtils = constructor.newInstance(context); 

      Method getAssistComponentForUserMethod = assistUtils.getClass().getDeclaredMethod("getAssistComponentForUser", int.class); 
      getAssistComponentForUserMethod.setAccessible(true); 
      return (ComponentName) getAssistComponentForUserMethod.invoke(assistUtils, userId); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

: 당신은 같은 방법으로 사용하여 반사를 사용할 수 있습니다

public ComponentName getCurrentAssist(Context context) { 
    final String setting = Settings.Secure.getString(context.getContentResolver(), "assistant"); 

    if (setting != null) { 
     return ComponentName.unflattenFromString(setting); 
    } 

    return null; 
} 

그것은 AssistUtils를 읽고 동일한 설정입니다 만, 설정이 유효하지 않은 경우 AssistUtilsfallback입니다.

+0

감사합니다. 답장에서 보조자의 기본 앱 목록을 인쇄하려고하지만 작동하지 않습니다. 나는 코드를 사용했다 : ComponentName activity = getCurrentAssistWithReflection (getApplicationContext()); Log.d ("TAG", "====== 패킷 기본값 : ==="+ activity.getPackageName()); ' – Jame

+0

코드를 실행하면이 코드가 try 블록 안에 있습니까? 아니면 응용 프로그램이 중단됩니까? 'getCurrentAssistWithReflection'가 작동하지 않으면 null을 반환하고 null 인스턴스의 getPackageName을 사용할 수 없기 때문입니다. –

+0

나는 그것을 실제 장치에서 시험해 보겠습니다. 내 에뮬레이터에서는 작동하지 않을 것 같습니다. 또한 보조자에게는 두 개의 앱이 있습니다. 해당 앱을 어떻게 나열 할 수 있습니까? 위의 스크립트는 하나의 앱만 표시 할 수 있습니다. – Jame

0

시도해보십시오.

startActivity(new Intent(Intent.ACTION_VOICE_COMMAND).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 
+0

으로 전화를 걸지만 이전에 사용한 적이 있지만 기본 음성 설정 대신 – Jame

+0

에서 항상 Google 음성을 호출합니다. 지금 사용해 주셔서 감사합니다. 단지 6.0 대신 5.0에서 작동했습니다. 왜 그런지 알아? – Jame

+0

대체 솔루션으로 업데이트됩니다. – AndroidHacker

0

나는 돌아 구성 요소가 활동하는 경우, 그것은

ComponentInfo{com.sec.android.app.sbrowser/com.sec.android.app.sbrowser.SBrowserMainActivity} 

처럼 작동 않았다 Mattia Maestrini에서 답을하려고하지만, 구성 요소 서비스를하는 경우, 내가 문제를

java.lang.SecurityException: Not allowed to start service Intent { 
act=android.intent.action.ASSIST cmp=com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService launchParam=MultiScreenLaunchParams { mDisplayId=0 mBaseDisplayId=0 mFlags=0 } } without permission android.permission.BIND_VOICE_INTERACTION 

을 다음 충족 내가 할 추가

<uses-permission android:name="android.permission.BIND_VOICE_INTERACTION"/> 

을 Manifest 파일에 추가하십시오. 마침내

나는 Activity.java

그것은 안드로이드 M에서 추가되는
public boolean showAssist(Bundle args) 

의 방법을 사용하고 성공적으로 보조 서비스를 시작할 수 있습니다.

관련 문제