首页 文章

未在窗口小部件中调用Android挂起的意图

提问于
浏览
0

就像this问题(接受的答案)一样,我是'm trying to launch voice recognition from one of my app'的小部件 . 我成功地设置了打开对话框,在Widget的 onUpdate() 方法中使用此代码请求语音输入:

// 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);

语音识别有效,但 at the end of the recognition process, my resultsPendingIntent is not called. Why?

从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"/>

1 回答

  • 0

    这是完全正常的,它基于Android SDK中的ListView . 它不是特别适用于小部件,但我确信您可以修改它以使其适用于小部件 .

    创建一个名为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>
    

    在您的自定义窗口小部件/视图中:

    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);
        }
    }
    

相关问题