http://blog.csdn.net/u014051380/article/details/21114389

1、判断是否已安装语音搜索功能

[java] view plaincopyprint?
  1. package com.voice.search;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.util.List;
  7. import android.app.Activity;
  8. import android.app.AlertDialog;
  9. import android.content.Context;
  10. import android.content.DialogInterface;
  11. import android.content.Intent;
  12. import android.content.pm.PackageManager;
  13. import android.content.pm.ResolveInfo;
  14. import android.net.Uri;
  15. import android.os.Environment;
  16. import android.speech.RecognizerIntent;
  17. import android.widget.Toast;
  18. public class VoiceSearchUtil {
  19. private static Context context;
  20. private static final int VOICE_RECOGNITION_REQUEST_CODE = 1;
  21. public static void getVoiceSearch(Context c) {
  22. context = c;
  23. PackageManager pm = context.getPackageManager();
  24. List<ResolveInfo> activities = pm
  25. .queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
  26. if (activities.size() != 0) {
  27. /* 设备存在 */
  28. voiceSearch();
  29. } else {
  30. /* 没有设备请点击安装按钮进行安装呢 */
  31. if (copyApkFromAssets(context, "google_voice_search.apk", Environment.getExternalStorageDirectory()
  32. .getAbsolutePath() + "/google_voice_search.apk")) {
  33. new AlertDialog.Builder(context).setMessage("检测到未安装语音搜索设备,是否安装?")
  34. .setPositiveButton("安装", new android.content.DialogInterface.OnClickListener() {
  35. @Override
  36. public void onClick(DialogInterface dialog, int which) {
  37. Intent intent = new Intent(Intent.ACTION_VIEW);
  38. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  39. intent.setDataAndType(
  40. Uri.parse("file://"
  41. + Environment.getExternalStorageDirectory().getAbsolutePath()
  42. + "/google_voice_search.apk"),
  43. "application/vnd.android.package-archive");
  44. context.startActivity(intent);
  45. }
  46. }).setNegativeButton("取消", null).show();
  47. }
  48. }
  49. }
  50. /**
  51. * 安装语音搜索功能,写入数据
  52. *
  53. * @param context
  54. *            上下文
  55. * @param fileName
  56. *            文件名称
  57. * @param path
  58. *            文件路径
  59. * @return 所需文件
  60. */
  61. public static boolean copyApkFromAssets(Context context, String fileName, String path) {
  62. boolean copyIsFinish = false;
  63. try {
  64. InputStream is = context.getAssets().open(fileName);
  65. File file = new File(path);
  66. file.createNewFile();
  67. FileOutputStream fos = new FileOutputStream(file);
  68. byte[] temp = new byte[1024];
  69. int i = 0;
  70. while ((i = is.read(temp)) > 0) {
  71. fos.write(temp, 0, i);
  72. }
  73. fos.close();
  74. is.close();
  75. copyIsFinish = true;
  76. } catch (IOException e) {
  77. e.printStackTrace();
  78. }
  79. return copyIsFinish;
  80. }
  81. // 语音搜索
  82. private static void voiceSearch() {
  83. try {
  84. // 通过Intent传递语音识别的模式,开启语音
  85. Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
  86. // 语言模式和自由模式的语音识别
  87. intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
  88. // 提示语音开始
  89. intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");
  90. // 开始语音识别
  91. ((Activity) context).startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
  92. } catch (Exception e) {
  93. e.printStackTrace();
  94. Toast.makeText(context, "找不到语音设备", Toast.LENGTH_LONG).show();
  95. }
  96. }
  97. }
package com.voice.search;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Environment;
import android.speech.RecognizerIntent;
import android.widget.Toast;
public class VoiceSearchUtil {
private static Context context;
private static final int VOICE_RECOGNITION_REQUEST_CODE = 1;
public static void getVoiceSearch(Context c) {
context = c;
PackageManager pm = context.getPackageManager();
List<ResolveInfo> activities = pm
.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
if (activities.size() != 0) {
/* 设备存在 */
voiceSearch();
} else {
/* 没有设备请点击安装按钮进行安装呢 */
if (copyApkFromAssets(context, "google_voice_search.apk", Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/google_voice_search.apk")) {
new AlertDialog.Builder(context).setMessage("检测到未安装语音搜索设备,是否安装?")
.setPositiveButton("安装", new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(
Uri.parse("file://"
+ Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/google_voice_search.apk"),
"application/vnd.android.package-archive");
context.startActivity(intent);
}
}).setNegativeButton("取消", null).show();
}
}
}
/**
* 安装语音搜索功能,写入数据
*
* @param context
*            上下文
* @param fileName
*            文件名称
* @param path
*            文件路径
* @return 所需文件
*/
public static boolean copyApkFromAssets(Context context, String fileName, String path) {
boolean copyIsFinish = false;
try {
InputStream is = context.getAssets().open(fileName);
File file = new File(path);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = is.read(temp)) > 0) {
fos.write(temp, 0, i);
}
fos.close();
is.close();
copyIsFinish = true;
} catch (IOException e) {
e.printStackTrace();
}
return copyIsFinish;
}
// 语音搜索
private static void voiceSearch() {
try {
// 通过Intent传递语音识别的模式,开启语音
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
// 语言模式和自由模式的语音识别
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
// 提示语音开始
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");
// 开始语音识别
((Activity) context).startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "找不到语音设备", Toast.LENGTH_LONG).show();
}
}
}

2、assets提供语音搜索apk安装

[java] view plaincopyprint?
  1. package com.voice.search;
  2. import java.util.ArrayList;
  3. import android.os.Bundle;
  4. import android.speech.RecognizerIntent;
  5. import android.view.View;
  6. import android.widget.Toast;
  7. import android.app.Activity;
  8. import android.app.AlertDialog;
  9. import android.app.Dialog;
  10. import android.content.Context;
  11. import android.content.DialogInterface;
  12. import android.content.Intent;
  13. public class MainActivity extends Activity {
  14. private static final int VOICE_RECOGNITION_REQUEST_CODE = 1;
  15. private String[] str;
  16. private Context context;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. context = this;
  22. }
  23. public void onClick(View v) {
  24. switch (v.getId()) {
  25. case R.id.search_iv:
  26. VoiceSearchUtil.getVoiceSearch(context);
  27. break;
  28. }
  29. }
  30. @Override
  31. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  32. // 回调获取从谷歌得到的数据
  33. if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
  34. // 取得语音的字符
  35. ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
  36. // 循环所有结果存入数组
  37. str = new String[results.size()];
  38. for (int i = 0; i < results.size(); i++) { // 循环所有结果
  39. str[i] = results.get(i);
  40. }
  41. // Dialog显示
  42. getSearchDialog();
  43. // 这里只获取第一条数据
  44. Toast.makeText(this, results.get(0), Toast.LENGTH_LONG).show();
  45. }
  46. super.onActivityResult(requestCode, resultCode, data);
  47. }
  48. /***
  49. * 搜索后dialog显示结果
  50. */
  51. private void getSearchDialog() {
  52. Dialog dialog = new AlertDialog.Builder(this).setTitle("你是不是想找:").setIcon(R.drawable.ic_launcher)
  53. .setItems(str, new DialogInterface.OnClickListener() {
  54. public void onClick(DialogInterface dialog, int which) {
  55. Toast.makeText(MainActivity.this, str[which], Toast.LENGTH_SHORT).show();
  56. }
  57. }).setNegativeButton("取消", null).create();
  58. dialog.show();
  59. }
  60. }
package com.voice.search;
import java.util.ArrayList;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.widget.Toast;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
public class MainActivity extends Activity {
private static final int VOICE_RECOGNITION_REQUEST_CODE = 1;
private String[] str;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.search_iv:
VoiceSearchUtil.getVoiceSearch(context);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 回调获取从谷歌得到的数据
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
// 取得语音的字符
ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
// 循环所有结果存入数组
str = new String[results.size()];
for (int i = 0; i < results.size(); i++) { // 循环所有结果
str[i] = results.get(i);
}
// Dialog显示
getSearchDialog();
// 这里只获取第一条数据
Toast.makeText(this, results.get(0), Toast.LENGTH_LONG).show();
}
super.onActivityResult(requestCode, resultCode, data);
}
/***
* 搜索后dialog显示结果
*/
private void getSearchDialog() {
Dialog dialog = new AlertDialog.Builder(this).setTitle("你是不是想找:").setIcon(R.drawable.ic_launcher)
.setItems(str, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, str[which], Toast.LENGTH_SHORT).show();
}
}).setNegativeButton("取消", null).create();
dialog.show();
}
}

3、加入Android读写文件权限

[java] view plaincopyprint?
  1. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Android 语音识别+语音搜索源码 Voice Search相关推荐

  1. Android上百实例源码分析以及开源分析集合打包

    感谢网友banketree的收集,压缩包的内容如下: 1.360新版特性界面源代码 实现了360新版特性界面的效果,主要涉及到Qt的一些事件处理与自定义控件.但源码好像是c++. 2.aidl跨进程调 ...

  2. 【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码

    http://www.linuxidc.com/Linux/2016-01/127292.htm 终于成功把Android 6.0 r1源码的源码编译.先上图,这是在Ubuntu中运行的Android ...

  3. cocos creator麻将教程系列(八)—— 达达麻将语音聊天源码分析

    达达麻将语音聊天源码分析 达达麻将版图 语音聊天 1:语音聊天只支持Native平台,iOS与android; 2: 语音聊天的音频格式为amr; 3: native平台实现了语音的录制和播放,可以移 ...

  4. Android 11.0 Settings源码分析 - 主界面加载

    Android 11.0 Settings源码分析 - 主界面加载 本篇主要记录AndroidR Settings源码主界面加载流程,方便后续工作调试其流程. Settings代码路径: packag ...

  5. 影视全搜索-源码分享-站点采集

    影视全搜索源码分享,影视全搜索是一个搜索全网影视资源的站点 基于框架eyz优化而成的影视全搜索是一个集合众多资源站的影视检索程序, 实现全网m3u8影视资源检索.直播源整理等 演示   演示站点:️影 ...

  6. Android AOSP基础(四)Source Insight和Android Studio导入系统源码

    本文首发于微信公众号「刘望舒」 关联系列 Android AOSP基础系列 Android系统启动系列 前言 在上一篇文章Android AOSP基础(三)Android系统源码的整编和单编中,我们对 ...

  7. android 修改编译内核源码 对抗反调试

    0×00  写在前面 攻防对立.程序调试与反调试之间的对抗是一个永恒的主题.在安卓逆向工程实践中,通过修改和编译安卓内核源码来对抗反调试是一种常见的方法.但网上关于此类的资料比较少,且都是基于AOSP ...

  8. Android contacts 联系人 通讯录 源码 完全解析

    Android contacts 联系人 通讯录 源码 完全解析 1简介 2软件架构 3各功能模块分析 1联系人数据的显示 1联系人列表显示 2联系人详细信息数据的显示 2联系人数据的编辑和存储 1编 ...

  9. Android实用应用程序源码

    andriod闹钟源代码 http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序 http://www.apkbus.com/an ...

最新文章

  1. c语言精品课程网站论文免费下载,【毕业论文_c语言程序设计精品课程网站的研究与实现6喜欢就下吧材料】...
  2. 接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63
  3. 社区儿童计算机活动总结,社区亲子活动总结
  4. UVALive 6508 Permutation Graphs
  5. google 插件_google这4款插件我每天都用,省时无数
  6. 一组关于女生的秘密数据!
  7. PHP自动压缩CSS文件方法,php 压缩多个CSS文件的实现代码
  8. Mac环境下安装配置Redis
  9. 斗地主Java课程设计_Java课程设计---web版斗地主
  10. Android App 免杀教程
  11. 《数据挖掘:R语言实战》P234中,UCI数据库中白酒品质研究数据集4898个样本下载问题
  12. PostgreSQL 10.1 手册_部分 I. 教程
  13. docker查看mysql日志_如何查看docker运行日志
  14. 深入理解audio 系统
  15. 高校wifi认证登录
  16. 【视频】极值理论EVT与R语言应用:GPD模型火灾损失分布分析
  17. caffe accuracy 学习
  18. Android Studio代码迁移问题小汇总
  19. Hbuilder 笔记
  20. 软件技术专业就业方向分析

热门文章

  1. 017~022 函数 课后练习题
  2. mac系统和windows系统都有哪些不同
  3. Microsoft Office Project 2016使用心得(一)
  4. 微软宣布IE进入死亡倒计时 回顾IE传奇的一生
  5. 对正在准备2022年哈尔滨工程大学计算机类考研复试的考生的一些建议
  6. 轻量级工具emoji-java处理emoji表情字符
  7. 网页服务器 根,服务器根域名301重定向到www完整教程
  8. element-ui 表格吸底固定最后一行
  9. python提取excel前十行生成图_Python读取Excel数据生成图表 v2.0
  10. 实验记录 | BWA的安装