通过谷歌语音设置闹钟闹钟和定时器Google Voice Action

上一篇博文承诺要写一篇谷歌语音发起闹钟设置的博文,最近这个功能实现得差不多了。趁着今天有点时间,把他总结一下。国内由于一些众所周知的原因,谷歌服务一致不能再国内使用,颇有遗憾。加上国内手机厂商对谷歌原生系统做了大规模定制,谷歌语音被剔除,使用自家优化过,更符合国人使用的语音。前阵子老师要求在谷歌语音中加入APP的设置计时器和闹钟的操作,查了好久也没有查到,本以为是自己的查找方向有问题,后来发现,国内很少有类似谷歌语音(Google Voice Action)的博客,后来只能翻看官方文档。下面讲讲我的学习历程。

  1. 首先搜索android的Google Voice Action的官方文档,不难找到关于Google语音发起操作的Action。其实谷歌语音跟APP交互就类似与Activity之间的跳转。谷歌语音会向某些就有该功能过滤器的APP的指定Activity发起Intent(意图),会传过来一个Action,表示是什么操作,比如是设置闹钟的Intent,Action就是android.intent.action.SET_TIMER,不同的语音操作对应不同的Action。
    谷歌语音的官方文档
    这里写图片描述
    下面以设置闹钟为例讲解一下。
  2. 要支持语音设置闹钟,首先要给你的APP一些权限
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

其次是在你接收谷歌语音的Intent的Activity页面中设置过滤器
注意:只能是Activity,服务和广播都不行(测试过)

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SET_ALARM" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

有个问题:如果使用普通的Activity,会出现从谷歌语音界面跳转到指定页面,再跳转回来,这样体验特别差,所以需要把指定Activity改成无界面Activity。无界面Activity如何实现呢?我的上一篇博文有提到:无界面Activity或者APP的实现,参看这个即可。
3. 最后贴出代码

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.provider.AlarmClock;
import android.os.Bundle;
import android.widget.Toast;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;


public class MainActivity extends Activity {
    int hour ;
    int minutes;
    private GoogleApiClient mClient;
    private Uri mUrl;
    private String mTitle;
    private String mDescription;
    String message = "222";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main); //无界面
        Intent intent = getIntent();
        //通过getintent()获取闹钟的小时和分钟
        hour=intent.getIntExtra(AlarmClock.EXTRA_LENGTH ,Integer.MAX_VALUE);
        if(hour == Integer.MAX_VALUE){
            Intent i=new Intent(this,Main2Activity.class);
            startActivity(i);
            this.finish();
        }
        //minutes =intent.getIntExtra(AlarmClock.EXTRA_MINUTES,0);
        message =intent.getStringExtra(AlarmClock.EXTRA_MESSAGE);
        //message =intent.getByteExtra(AlarmClock.EXTRA_MESSAGE , Byte.parseByte("111"));
        mClient = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
        mUrl = Uri.parse("http://com.example.mrc.alarmdemo");
        mTitle = "Set AlarmClock";
        mDescription = "Set "+ hour +" :" + minutes + " AlarmClock";

        Toast.makeText(this,"hour:"+hour+/*"  minutes:"+minutes +*/ "   message:" + message ,Toast.LENGTH_LONG)
                .show();
        //createAlarm(message ,hour ,minutes);

    }
    /*public void createAlarm(String message, int hour, int minutes) {
        Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
                .putExtra(AlarmClock.EXTRA_MESSAGE, message)
                .putExtra(AlarmClock.EXTRA_HOUR, hour)
                .putExtra(AlarmClock.EXTRA_MINUTES, minutes);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        }
    }*/
    public Action getAction() {
        Thing object = new Thing.Builder()
                .setName(mTitle)
                .setDescription(mDescription)
                .setUrl(mUrl)
                .build();

        return new Action.Builder(Action.TYPE_VIEW)
                .setObject(object)
                .setActionStatus(Action.STATUS_TYPE_COMPLETED)
                .build();
    }

    @Override
    public void onStart() {
        super.onStart();
        mClient.connect();
        AppIndex.AppIndexApi.start(mClient, getAction());
    }

    @Override
    protected void onResume() {
        super.onResume();
        this.finish();   //android 5.0及以上添加不会导致奔溃
    }

    @Override
    public void onStop() {
         //AppIndex会给谷歌语音传回一个操作记录,表明操作的结果,记录谷歌语音的操作
         //记录,在手机上可以查到这些记录
        AppIndex.AppIndexApi.end(mClient, getAction());
        mClient.disconnect();
        super.onStop();
    }
}

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
4. 如果需要在设置后,点击跳转到指定的页面,比如跳转到闹钟列表页面,需要在闹钟列表页面添加以下过滤器:

这里写图片描述

<intent-filter>
    //与google voice action的语音交互,跳转到定时器列表
    <action android:name="android.intent.action.SHOW_TIMERS" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

如果有不懂的小伙伴,可以在下面留言或者参考代码:通过谷歌语音Google Voice Action进行设置应用APP内的闹钟Alarm和计时器Timer的操作

猜你喜欢

转载自blog.csdn.net/cqx13763055264/article/details/80193710