上一篇博文承诺要写一篇谷歌语音发起闹钟设置的博文,最近这个功能实现得差不多了。趁着今天有点时间,把他总结一下。国内由于一些众所周知的原因,谷歌服务一致不能再国内使用,颇有遗憾。加上国内手机厂商对谷歌原生系统做了大规模定制,谷歌语音被剔除,使用自家优化过,更符合国人使用的语音。前阵子老师要求在谷歌语音中加入APP的设置计时器和闹钟的操作,查了好久也没有查到,本以为是自己的查找方向有问题,后来发现,国内很少有类似谷歌语音(Google Voice Action)的博客,后来只能翻看官方文档。下面讲讲我的学习历程。
- 首先搜索android的Google Voice Action的官方文档,不难找到关于Google语音发起操作的Action。其实谷歌语音跟APP交互就类似与Activity之间的跳转。谷歌语音会向某些就有该功能过滤器的APP的指定Activity发起Intent(意图),会传过来一个Action,表示是什么操作,比如是设置闹钟的Intent,Action就是android.intent.action.SET_TIMER,不同的语音操作对应不同的Action。
谷歌语音的官方文档
下面以设置闹钟为例讲解一下。 - 要支持语音设置闹钟,首先要给你的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的操作