谷歌眼镜:有没有办法从UI服务开始语音识别?

时间:2014-01-15 21:41:05

标签: android google-glass google-gdk

我有一个使用LiveCards的玻璃应用程序。因此,我没有明确地运行活动,而只是一个与LiveCard交互以获取信息的后台服务。在某些时候,我想提出一个语音输入。问题是代码示例告诉您使用startActivityForResult,这不是我在服务中可以做的事情。那么 - 是否有不同的方法来实现这一点,或者我不能在当前配置中执行此操作?

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,而不是语音输入,但是我需要运行一个活动来获取信息,以便在“低频渲染”现场卡中显示,而无需用户首先调出菜单。我认为您可以使用活动来获取文本输入,然后将其发送回服务。

有关如何绑定服务的大部分信息来自http://developer.android.com/guide/components/bound-services.html

<强> MainService 这是由“ok glass,...”启动的服务。布局只有一个带有id文本的TextView。

public class MainService extends Service {

    private static final String LIVE_CARD_TAG = "my_card";

    private final IBinder mBinder = new LocalBinder();

    LiveCard mLiveCard;
    TimelineManager mTimelineManager;
    RemoteViews mViews;

    @Override
    public void onCreate() {
        super.onCreate();
        mTimelineManager = TimelineManager.from(this);
    } 

    public class LocalBinder extends Binder {
        MainService getService() {
            return MainService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    } 

    public int onStartCommand(Intent intent, int flags, int startId) {
        mLiveCard = mTimelineManager.createLiveCard(LIVE_CARD_TAG);
        mViews = new RemoteViews(this.getPackageName(),R.layout.activity_main);
        mLiveCard.setViews(mViews);
        Intent mIntent = new Intent(this, MenuActivity.class);
        mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mLiveCard.setAction(PendingIntent.getActivity(this, 0, mIntent, 0));
        mLiveCard.publish(LiveCard.PublishMode.REVEAL);
        new android.os.Handler().postDelayed(
                new Runnable() {
                    public void run() {
                        // run the test activity after the initial text has displayed
                        Intent testIntent = new Intent(getBaseContext(), TestActivity.class);
                        testIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        getApplication().startActivity(testIntent);
                    }
                }, 3000);
        return START_STICKY;
    }

    public void updateText(String textString) {
        mViews.setTextViewText(R.id.text,textString);
        mLiveCard.setViews(mViews);
    }

    @Override
    public void onDestroy() {
        if (mLiveCard != null && mLiveCard.isPublished()) {
            Log.d("debug", "Unpublishing LiveCard");
            mLiveCard.unpublish();
            mLiveCard = null;
        }
        super.onDestroy();
    }

}

<强>测试活动 这是在MainService延迟后运行,并在没有用户输入的情况下自动更新实时卡上的文本。

public class TestActivity extends Activity {

    MainService mService;
    boolean mBound = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, MainService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mBound) {
            unbindService(mConnection);
            mBound = false;
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        new android.os.Handler().postDelayed(
                new Runnable() {
                    public void run() {
                        // this crashes if run right away, so give it a little time
                        mService.updateText("Updated from TestActivity");
                        finish();
                    }
                }, 500);
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }
        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };

}

<强> MenuActivity 这是设置为实时卡的待处理意图的活动。当点击触摸板时,它会弹出一个退出或更新文本的菜单。

public class MenuActivity extends Activity {

    MainService mService;
    boolean mBound = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, MainService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mBound) {
            unbindService(mConnection);
            mBound = false;
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        openOptionsMenu();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.stop:
                stopService(new Intent(this, MainService.class));
                return true;
            case R.id.update:
                mService.updateText("Updated from MenuActivity");
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onOptionsMenuClosed(Menu menu) {
        finish();
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }
        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };
}