0

Как в this вопрос (принятый ответ), я пытаюсь запустить распознавание голоса из одного из виджетов моего приложения. Я успешно удалось открыть диалоговое окно, которое запрашивает голосовой ввод этого кода внутри onUpdate() метода виджета:Android ожидающий намерения не вызывается внутри виджета

// this intent points to activity that should handle results, doesn't work 
    Intent activityIntent = new Intent(SoulissApp.getAppContext(), WrapperActivity.class); 
    //doesn't work as well 
    //activityIntent.setComponent(new ComponentName("it.angelic.soulissclient", "it.angelic.soulissclient.WrapperActivity")); 
    // this intent wraps results activity intent 
    PendingIntent resultsPendingIntent = PendingIntent.getActivity(SoulissApp.getAppContext(), 0, activityIntent, 0); 

    // this intent calls the speech recognition 
    Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    voiceIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo"); 
    voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT, resultsPendingIntent); 

    Bundle fakeBun = new Bundle(); 
    fakeBun.putChar("fake", 'f'); 
    voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT_BUNDLE, fakeBun); 

    // this intent wraps voice recognition intent, works 
    PendingIntent pendingInt = PendingIntent.getActivity(context, 0, voiceIntent, 0); 
    updateViews.setOnClickPendingIntent(R.id.button1, pendingInt); 

Распознавание речи работает, но в конце процесса распознавания, мой resultsPendingIntent не называется. Зачем?

Из журнала SYS, я прочитал это:

...I/ActivityManager﹕ START u0 {cmp=it.angelic.soulissclient/.SoulissWidgetVoice (has extras)} from uid 10152 on display 0...... 

в то время как я ожидал что-то вроде:

...I/ActivityManager﹕ START u0 {cmp=it.angelic.soulissclient/.WrapperActivity(has extras)}... 

потому что .WrapperActivity находится на рассмотрении в то время как Intent SoulissWidgetVoice класс виджета. Обратите внимание, что WrapperActivity само по себе может быть правильно запущен от других видов деятельности, и это Theme.NoDisplay основная деятельность:

<activity 
     android:name=".WrapperActivity" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.NoDisplay"/> 
+0

Я думаю, что вам нужно, чтобы обеспечить полное имя класса с его префиксом пакета в качестве второго аргумента для конструктора ComponentName. Первый аргумент - это имя пакета приложения (которое может отличаться от внутреннего пакета Java, но обычно это не так). – BladeCoder

+0

спасибо @BladeCoder i обновил код, но все еще не работает – Shine

+0

Является ли ваш виджет коллекционным виджетами (ListView, StackView)? –

ответ

0

Это полностью функциональный, и он базируется от ListView в Android SDK. Это не особенно для виджета, но я уверен, что вы можете изменить его, чтобы он работал для виджета.

Создайте деятельность под названием SearchActivity:

// CustomSearch (View) & ISearch (Interface) are objects that I created and are irrelevant 
public class SearchActivity extends AppCompatActivity implements ISearch 
{ 
    // Variables 
    private CustomSearch mSearchView; 


    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_search); 

     mSearchView = (CustomSearch)findViewById(R.id.search); 
     mSearchView.setPendingComponentName(getComponentName()); 
     mSearchView.setSearchListener(this); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) 
    { 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) 
     { 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      Log.i("SEARCH >", "You said: " + query); 
     } 
    } 
} 

Добавить активность в AndroidManifest.xml

<activity 
    android:name=".activities.SearchActivity" 
    android:label="@string/app_name" 
    android:theme="@style/CustomTheme.NoActionBar"> 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH"/> 
    </intent-filter> 
</activity> 

В пользовательском Widget/Вид:

buttonVoice.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     // Get activity from either SearchableInfo or ComponentName 
     ComponentName searchActivity = mComponentName; 

     // Wrap component in intent 
     Intent queryIntent = new Intent(Intent.ACTION_SEARCH); 
     queryIntent.setComponent(searchActivity); 

     // Wrap query intent in pending intent 
     PendingIntent pending = PendingIntent.getActivity(getContext(), 0, queryIntent, PendingIntent.FLAG_ONE_SHOT); 

     // Create bundle now because if we wrap it in pending intent, it becomes immutable 
     Bundle queryExtras = new Bundle(); 

     // Create voice intent 
     Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZER_SPEECH); 
     voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     voiceIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak"); 
     voiceIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, searchActivity 
     voiceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     // Wrap the pending intent & bundle inside the voice intent 
     voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT, pending); 
     voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT_BUNDLE, queryExtras); 

     // Start the voice search 
     getContext().startActivity(voiceIntent); 
    } 
} 
Смежные вопросы