├── .gitignore
├── .idea
├── compiler.xml
├── copyright
│ └── profiles_settings.xml
├── encodings.xml
├── gradle.xml
├── misc.xml
├── modules.xml
├── runConfigurations.xml
└── vcs.xml
├── README.md
├── apk
└── app-debug.apk
├── app
├── .gitignore
├── app-release.apk
├── build.gradle
├── libs
│ ├── Msc.jar
│ └── Sunflower.jar
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── jju
│ │ └── howe
│ │ └── howeassistant
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── jju
│ │ │ └── howe
│ │ │ └── howeassistant
│ │ │ ├── action
│ │ │ ├── CallAction.java
│ │ │ ├── CallView.java
│ │ │ ├── MessageView.java
│ │ │ ├── OpenAppAction.java
│ │ │ ├── OpenQA.java
│ │ │ ├── ScheduleCreate.java
│ │ │ ├── ScheduleView.java
│ │ │ ├── SearchAction.java
│ │ │ ├── SearchApp.java
│ │ │ ├── SearchWeather.java
│ │ │ └── SendMessage.java
│ │ │ ├── activity
│ │ │ ├── FiveLine.java
│ │ │ ├── HeartProgressBar.java
│ │ │ ├── HelpActivity.java
│ │ │ └── MainActivity.java
│ │ │ ├── bean
│ │ │ ├── AnswerBean.java
│ │ │ ├── DataBean.java
│ │ │ ├── DatetimeBean.java
│ │ │ ├── MainBean.java
│ │ │ ├── MoreResultsBean.java
│ │ │ ├── ResultBean.java
│ │ │ ├── SemanticBean.java
│ │ │ ├── SlotsBean.java
│ │ │ └── WebPageBean.java
│ │ │ └── util
│ │ │ └── JsonParser.java
│ ├── jniLibs
│ │ ├── arm64-v8a
│ │ │ └── libmsc.so
│ │ ├── armeabi-v7a
│ │ │ └── libmsc.so
│ │ └── armeabi
│ │ │ └── libmsc.so
│ └── res
│ │ ├── drawable
│ │ ├── bg.jpg
│ │ ├── btn_selector.xml
│ │ ├── help.png
│ │ ├── yy.png
│ │ └── yyls.png
│ │ ├── layout
│ │ ├── activity_help.xml
│ │ └── activity_main.xml
│ │ ├── menu
│ │ └── main.xml
│ │ ├── mipmap-hdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ └── ic_launcher.png
│ │ ├── values-w820dp
│ │ └── dimens.xml
│ │ └── values
│ │ ├── attrs.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── jju
│ └── howe
│ └── howeassistant
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
18 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | 1.8
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # HoweAssistant
2 | 好帮手是一个基于Android系统开发的智能语音助手,它能够实现陪你聊天、打电话、发短信、打开应用、查询天气以及智能问答等操作。本应用的语音引擎来自于科大讯飞开放平台,具备较高的普通话识别能力。
3 | **应用界面**
4 |
5 | ----------
6 | 1. 打开应用时
7 | 
8 | 2. 等待用户说话
9 | 
10 | 3. 语音回答
11 | 
12 |
13 | ----------
14 | **主要描述**
15 | - 借助语音听写服务,将连续语音快速识别为文字并显示出来
16 | - 借助语义理解服务,理解用户说的内容并识别其分类再回答(涉及JSON类型数据的解析)
17 | - 借助语音合成服务,将回答的内容从文字转换成语音读出来
18 |
19 | ----------
20 | **目前能实现的操作**
21 |
22 | 1.电话相关服务
23 | - 打电话
24 | - 查看电话拨打记录
25 |
26 | 2.短信相关服务
27 | - 发送短信
28 | - 查看发送短信页面
29 |
30 | 3.应用相关服务
31 | - 打开应用
32 | - 应用中心搜索应用
33 |
34 | 4.搜索相关服务
35 | - 搜索
36 |
37 | 5.社区问答相关服务
38 | - 社区问答
39 |
40 | 6.聊天相关服务
41 | - 聊天模式
42 |
43 | 7.智能问答相关服务
44 | - 智能问答
45 |
46 | 8.百科知识相关服务
47 |
48 | - 百科
49 |
50 | 9.日程相关服务
51 |
52 | - 创建日程/闹钟(直接跳转相应设置界面)
53 |
54 | 10.天气相关服务
55 | - 查询天气
56 |
--------------------------------------------------------------------------------
/apk/app-debug.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/apk/app-debug.apk
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/app-release.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/app-release.apk
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 25
5 | buildToolsVersion "24.0.3"
6 | defaultConfig {
7 | applicationId "com.jju.howe.howeassistant"
8 | minSdkVersion 14
9 | targetSdkVersion 25
10 | versionCode 1
11 | versionName "1.0"
12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(include: ['*.jar'], dir: 'libs')
24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
25 | exclude group: 'com.android.support', module: 'support-annotations'
26 | })
27 | compile 'com.android.support:appcompat-v7:25.0.0'
28 | testCompile 'junit:junit:4.12'
29 | compile files('libs/Msc.jar')
30 | compile files('libs/Sunflower.jar')
31 | compile 'com.google.code.gson:gson:2.7'
32 | }
33 |
--------------------------------------------------------------------------------
/app/libs/Msc.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/libs/Msc.jar
--------------------------------------------------------------------------------
/app/libs/Sunflower.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/libs/Sunflower.jar
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in D:\Android\Sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/jju/howe/howeassistant/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumentation test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.jju.howe.howeassistant", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
51 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/CallAction.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.Manifest;
4 | import android.content.ContentResolver;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.content.pm.PackageManager;
8 | import android.database.Cursor;
9 | import android.net.Uri;
10 | import android.os.Handler;
11 | import android.os.Message;
12 | import android.provider.ContactsContract;
13 | import android.support.v4.app.ActivityCompat;
14 |
15 | import com.jju.howe.howeassistant.activity.MainActivity;
16 |
17 |
18 | public class CallAction {
19 | private String mPerson = null;
20 | private String number = null;
21 | private MainActivity mActivity;
22 |
23 | Handler handler = new Handler() {
24 | public void handleMessage(Message msg) {
25 | switch (msg.what) {
26 | case 100:
27 | mPerson = (String) msg.obj;
28 | start();
29 | break;
30 | }
31 | super.handleMessage(msg);
32 | }
33 | };
34 |
35 | public CallAction(String person, String code, MainActivity activity) {
36 | mPerson = person;
37 | number = code;
38 | mActivity = activity;
39 | }
40 |
41 | public void start()//打电话
42 | {
43 | if ((number == null) || (number.equals(""))) {
44 | if ((mPerson == null) || (mPerson.equals(""))) {
45 |
46 | mActivity.speakAnswer("至少告诉我名字或者号码吧?");
47 | Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + ""));
48 | intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
49 | mActivity.startActivity(intent);
50 | } else {
51 | mPerson = mPerson.trim();
52 | number = getNumberByName(mPerson, mActivity);
53 | if (number == null) {
54 | mActivity.speakAnswer("没有在通讯录中找到" + mPerson + "的号码。");
55 | } else {
56 | //打电话
57 | mActivity.speakAnswer("即将拨给" + mPerson + "...");
58 | Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
59 | if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
60 | return;
61 | }
62 | mActivity.startActivity(intent);
63 | }
64 | }
65 | } else {
66 | mActivity.speakAnswer("即将拨给" + number + "...");
67 | Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
68 | if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
69 | return;
70 | }
71 | mActivity.startActivity(intent);
72 |
73 | }
74 |
75 | }
76 |
77 |
78 | private String getNumberByName(String name, Context context)//通过名字查找号码
79 | {
80 | Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI, name);
81 | ContentResolver resolver = context.getContentResolver();
82 | Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Contacts._ID}, null, null, null);
83 | if ((cursor != null) && (cursor.moveToFirst())) {
84 | int idCoulmn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
85 | long id = cursor.getLong(idCoulmn);
86 | cursor.close();
87 | cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{"data1"}, "contact_id = ?", new String[]{Long.toString(id)}, null);
88 | if ((cursor != null) && (cursor.moveToFirst())) {
89 | int m = cursor.getColumnIndex("data1");
90 | String num = cursor.getString(m);
91 | cursor.close();
92 | return num;
93 | }
94 | }
95 | return null;
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/CallView.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.content.Intent;
4 |
5 | import com.jju.howe.howeassistant.activity.MainActivity;
6 |
7 | public class CallView {
8 |
9 | private MainActivity mActivity;
10 |
11 | public CallView(MainActivity activity) {
12 | mActivity = activity;
13 | }
14 |
15 | public void start() {
16 | Intent intent = new Intent();
17 | intent.setAction(Intent.ACTION_CALL_BUTTON);
18 | mActivity.startActivity(intent);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/MessageView.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.content.Intent;
4 |
5 | import com.jju.howe.howeassistant.activity.MainActivity;
6 |
7 |
8 | public class MessageView {
9 | private MainActivity mActivity;
10 |
11 | public MessageView(MainActivity activity){
12 | mActivity=activity;
13 | }
14 |
15 | public void start(){
16 | Intent intent=new Intent();
17 | intent.setClassName("com.android.mms","com.android.mms.ui.ConversationList");
18 | mActivity.startActivity(intent);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/OpenAppAction.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.content.Intent;
4 | import android.content.pm.PackageManager;
5 | import android.content.pm.ResolveInfo;
6 | import android.net.Uri;
7 |
8 |
9 | import com.jju.howe.howeassistant.activity.MainActivity;
10 |
11 | import java.util.List;
12 |
13 |
14 | public class OpenAppAction {
15 |
16 | MainActivity mActivity;
17 | String mAppName;
18 | public OpenAppAction(String appname, MainActivity activity)
19 | {
20 | // Log.d("dd","here");
21 | mAppName = appname;
22 | mActivity=activity;
23 | }
24 |
25 | public void start()
26 | {
27 | if((mAppName!=null)&&(mAppName.length()!=0)){
28 | getAppByName();
29 | }
30 | }
31 | private void getAppByName(){
32 | Intent intent = new Intent();
33 | intent.setAction("android.intent.action.MAIN");
34 | intent.addCategory("android.intent.category.LAUNCHER");
35 | PackageManager pm = mActivity.getPackageManager();
36 | List installAppList = pm.queryIntentActivities(intent, 0);
37 | for(ResolveInfo info :installAppList){
38 | String name = info.loadLabel(pm).toString();
39 | if(name.equalsIgnoreCase(mAppName)){
40 | String pkgname=info.activityInfo.packageName;
41 | if("com.android.contacts".equalsIgnoreCase(pkgname)){
42 | Uri uri = Uri.parse("content://contacts/people");
43 | Intent i= new Intent("android.intent.action.VIEW", uri);
44 | mActivity.startActivity(i);
45 | }else{
46 | intent = pm.getLaunchIntentForPackage(pkgname);
47 | intent.addCategory("android.intent.category.LAUNCHER");
48 | mActivity.startActivity(intent);
49 | }
50 | mActivity.speakAnswer("正在打开"+mAppName+"...");
51 | return ;
52 | }
53 | }
54 | mActivity.speakAnswer("没有找到你所说的应用哦^_^");
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/OpenQA.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 |
4 | import com.jju.howe.howeassistant.activity.MainActivity;
5 |
6 | public class OpenQA {
7 |
8 | private String mText;
9 | MainActivity mActivity;
10 |
11 | public OpenQA(String text, MainActivity activity){
12 | mText=text;
13 | mActivity=activity;
14 | }
15 |
16 | public void start(){
17 | mActivity.speakAnswer(mText);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/ScheduleCreate.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.Intent;
5 | import android.provider.AlarmClock;
6 | import android.provider.CalendarContract;
7 |
8 | import com.jju.howe.howeassistant.activity.MainActivity;
9 |
10 |
11 | public class ScheduleCreate {
12 | private String mName,mTime,mDate,mContent;
13 | private MainActivity mActivity;
14 | public ScheduleCreate(String name, String time, String date, String content, MainActivity activity){
15 | mName=name;
16 | mTime=time;
17 | mDate=date;
18 | mContent=content;
19 | mActivity=activity;
20 | }
21 |
22 | public void start(){
23 | switch(mName){
24 | case "clock":{//设置闹钟提醒
25 | setClock();
26 | break;
27 | }
28 | case "reminder":{//设置日历提醒
29 | setCalendar();
30 | break;
31 | }
32 | default:break;
33 | }
34 | }
35 |
36 | private void setClock(){
37 | Intent alarmas = new Intent(AlarmClock.ACTION_SET_ALARM);
38 |
39 |
40 | mActivity.startActivity(alarmas);
41 | /* AlarmManager aManager;
42 | Calendar currentTime=Calendar.getInstance();
43 | 获取闹钟管理的实例
44 | aManager = (AlarmManager)mActivity.getSystemService(mActivity.ALARM_SERVICE);
45 | 设置闹钟 */
46 | //aManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
47 | }
48 | @SuppressLint("NewApi")
49 | private void setCalendar(){
50 | Intent intent = new Intent(Intent.ACTION_INSERT);
51 | intent.setData(CalendarContract.Events.CONTENT_URI);
52 | mActivity.startActivity(intent);
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/ScheduleView.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.Intent;
5 | import android.provider.AlarmClock;
6 | import android.provider.CalendarContract;
7 |
8 | import com.jju.howe.howeassistant.activity.MainActivity;
9 |
10 |
11 | public class ScheduleView {
12 |
13 | private String mName;
14 | private MainActivity mActivity;
15 |
16 | public ScheduleView(String name, String time, String date, String content, MainActivity activity){
17 | mName=name;
18 | mActivity=activity;
19 | }
20 |
21 | public void start(){
22 | switch(mName){
23 | case "clock":{
24 | clockView();
25 | break;
26 | }
27 | case "reminder":{
28 | reminderView();
29 | break;
30 | }
31 | default:break;
32 | }
33 | }
34 |
35 | private void clockView(){
36 | Intent alarmas = new Intent(AlarmClock.ACTION_SET_ALARM);
37 | mActivity.startActivity(alarmas);
38 | }
39 |
40 | @SuppressLint("NewApi") private void reminderView(){
41 | Intent intent = new Intent(Intent.ACTION_INSERT);
42 | intent.setData(CalendarContract.Events.CONTENT_URI);
43 | mActivity.startActivity(intent);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/SearchAction.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.content.Intent;
4 | import android.net.Uri;
5 |
6 | import com.jju.howe.howeassistant.activity.MainActivity;
7 |
8 |
9 | public class SearchAction {
10 | MainActivity mActivity;
11 | String mKeyword;
12 | //String searchEngine;
13 |
14 | public SearchAction(String name, MainActivity activity)
15 | {
16 | mKeyword = name;
17 | mActivity=activity;
18 | }
19 |
20 | public void Search(){
21 | startWebSearch();
22 | }
23 |
24 | private void startWebSearch()
25 | {
26 | mActivity.speakAnswer("正在搜索:"+mKeyword+"...");
27 | Intent intent = new Intent();
28 | intent.setAction(Intent.ACTION_VIEW);
29 | intent.setData(Uri.parse("http://m.baidu.com/s?word="+mKeyword));
30 | intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");//设置为系统自带浏览器启动
31 | mActivity.startActivity(intent);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/SearchApp.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.content.Intent;
4 | import android.net.Uri;
5 |
6 | import com.jju.howe.howeassistant.activity.MainActivity;
7 |
8 |
9 | public class SearchApp {
10 | private String mName;
11 | MainActivity mActivity;
12 |
13 | public SearchApp(String name, MainActivity activity){
14 | mName=name;
15 | mActivity=activity;
16 | }
17 |
18 | public void start(){
19 | mActivity.speakAnswer("正在搜索...");
20 | Intent intent = new Intent(Intent.ACTION_VIEW);
21 | intent.setData(Uri.parse("market://search?q="+mName));
22 | mActivity.startActivity(intent);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/SearchWeather.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 |
4 | import com.jju.howe.howeassistant.activity.MainActivity;
5 |
6 | public class SearchWeather {
7 |
8 | private String date, mCity = null, mSourceName = null, mWeatherDate = null, mWeather = null, mTempRange = null, mAirQuality = null, mWind = null, mHumidity = null, mWindLevel = null;
9 | private MainActivity mActivity = null;
10 |
11 | public SearchWeather(String date, String city, String sourceName, String weatherDate, String weather, String tempRange, String
12 | airQuality, String wind, String humidity, String windLevel, MainActivity activity) {
13 | this.date = date;
14 | mCity = city;
15 | mSourceName = sourceName;
16 | mWeatherDate = weatherDate;
17 | mWeather = weather;
18 | mTempRange = tempRange;
19 | mAirQuality = airQuality;
20 | mWind = wind;
21 | mHumidity = humidity;
22 | mWindLevel = windLevel;
23 | mActivity = activity;
24 | }
25 |
26 | public void start() {
27 | mActivity.speakAnswer( mCity +date + "的天气情况为"+ mWeather + ",气温范围" + mTempRange+",风向以及风力情况为"+mWind+"。");
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/action/SendMessage.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.action;
2 |
3 | import android.content.ContentResolver;
4 | import android.content.ContentValues;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.database.Cursor;
8 | import android.net.Uri;
9 | import android.provider.ContactsContract;
10 | import android.telephony.SmsManager;
11 | import android.util.Log;
12 |
13 |
14 | import com.jju.howe.howeassistant.activity.MainActivity;
15 |
16 | import java.util.List;
17 |
18 | public class SendMessage {
19 | private String mPerson=null;
20 | private String number=null;
21 | private String mcontent=null;
22 | private MainActivity mActivity;
23 |
24 |
25 | public SendMessage(String person, String code, String content, MainActivity activity){
26 | mPerson = person;
27 | number=code;
28 | mcontent=content;
29 | mActivity=activity;
30 | mActivity.service_flag=true;
31 | }
32 |
33 | public void start(){
34 | if((number==null)||(number.equals(""))){
35 | if ((mPerson == null) || (mPerson.equals("")))
36 | {
37 | mActivity.service_flag=false;
38 | mActivity.speakAnswer("至少告诉我名字或者号码吧?");
39 | Intent intent = new Intent("android.intent.action.SENDTO",
40 | Uri.parse("smsto:" + ""));
41 | intent.putExtra("sms_body",""); //默认短信文字
42 | mActivity.startActivity(intent);
43 |
44 | }else{
45 | mPerson=mPerson.trim();
46 | number=getNumberByName(mPerson,mActivity);
47 | if(number == null)
48 | {
49 | mActivity.speakAnswer("通讯录没有找到"+mPerson);
50 | mActivity.service_flag=false;
51 | }else{
52 | if((mcontent==null)||(mcontent.equals(""))){
53 |
54 | mActivity.speakAnswer("你要发送什么内容呢?");
55 | //mActivity.startSpeenchRecognition();
56 | //
57 | Thread mThread= new Thread(){
58 | public void run(){
59 | while((mActivity.SRResult==null)||(mActivity.SRResult.equals(""))){
60 | //空转
61 | }
62 | //mActivity.speakAnswer("线程中");
63 | mcontent=mActivity.SRResult;
64 | SmsManager smsManager = SmsManager.getDefault();
65 | if(mcontent.length() > 70) {
66 | List contents = smsManager.divideMessage(mcontent);
67 | for(String sms : contents) {
68 | smsManager.sendTextMessage(number, null, sms, null, null);
69 | insertDB(number,sms);
70 | }
71 | } else {
72 | smsManager.sendTextMessage(number, null, mcontent, null, null);
73 | insertDB(number,mcontent);
74 | }
75 | mActivity.service_flag=false;
76 | }
77 | };
78 | mThread.start();
79 | //mThread.destroy();
80 | }
81 | else{
82 | //发短信
83 | SmsManager smsManager = SmsManager.getDefault();
84 | if(mcontent.length() > 70) {
85 | List contents = smsManager.divideMessage(mcontent);
86 | for(String sms : contents) {
87 | smsManager.sendTextMessage(number, null, sms, null, null);
88 | insertDB(number,sms);
89 | }
90 | } else {
91 | smsManager.sendTextMessage(number, null, mcontent, null, null);
92 | insertDB(number,mcontent);
93 | }
94 | mActivity.service_flag=false;
95 | }
96 |
97 |
98 | }
99 | }
100 |
101 | }
102 | else{
103 | if((mcontent==null)||(mcontent.equals(""))){
104 | mActivity.speakAnswer("你要发送什么内容呢?");
105 | //mActivity.startSpeenchRecognition();
106 | //
107 | Thread mThread= new Thread(){
108 | public void run(){
109 | while((mActivity.SRResult==null)||(mActivity.SRResult.equals(""))){
110 | //空转
111 | }
112 | //mActivity.speakAnswer("线程中");
113 | mcontent=mActivity.SRResult;
114 | SmsManager smsManager = SmsManager.getDefault();
115 | if(mcontent.length() > 70) {
116 | List contents = smsManager.divideMessage(mcontent);
117 | for(String sms : contents) {
118 | smsManager.sendTextMessage(number, null, sms, null, null);
119 | insertDB(number,sms);
120 | }
121 | } else {
122 | smsManager.sendTextMessage(number, null, mcontent, null, null);
123 | insertDB(number,mcontent);
124 | }
125 | mActivity.service_flag=false;
126 | }
127 | };
128 | mThread.start();
129 | //mThread.destroy();
130 | }
131 | else{
132 | //发短信
133 | SmsManager smsManager = SmsManager.getDefault();
134 | if(mcontent.length() > 70) {
135 | List contents = smsManager.divideMessage(mcontent);
136 | for(String sms : contents) {
137 | smsManager.sendTextMessage(number, null, sms, null, null);
138 | insertDB(number,sms);
139 | }
140 | } else {
141 | smsManager.sendTextMessage(number, null, mcontent, null, null);
142 | insertDB(number,mcontent);
143 | }
144 | mActivity.service_flag=false;
145 | }
146 | }
147 |
148 |
149 |
150 | }
151 |
152 | private void insertDB(String number, String content){//将发送的短信插入系统数据库中,使其在短信界面显示
153 | //////////////////////会抛出null的异常---已解决--- mActivity.getContentResolver()才可以
154 | try{
155 | ContentValues values = new ContentValues();
156 | values.put("date", System.currentTimeMillis());
157 | //阅读状态
158 | values.put("read", 0);
159 | //1为收 2为发
160 | values.put("type", 2);
161 | //送达号码
162 | // values.put("status", -1);
163 | values.put("address",number);
164 | //送达内容
165 | values.put("body", content);
166 | //插入短信库
167 | // getContentResolver
168 | mActivity.getContentResolver().insert(Uri.parse("content://sms/sent"), values);
169 | mActivity.speakAnswer("短信发送成功");
170 | }catch (Exception e) {
171 | Log.d("dd", "插入数据库问题:"+e.getMessage());
172 | }
173 | }
174 |
175 | private String getNumberByName(String name, Context context)
176 | {
177 | Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI, name);
178 | ContentResolver resolver = context.getContentResolver();
179 | Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Contacts._ID}, null, null, null);
180 | if((cursor!=null)&&(cursor.moveToFirst())){
181 | int idCoulmn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
182 | long id = cursor.getLong(idCoulmn);
183 | cursor.close();
184 | cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{"data1"}, "contact_id = ?", new String[]{Long.toString(id)}, null);
185 | if ((cursor != null) && (cursor.moveToFirst()))
186 | {
187 | int m = cursor.getColumnIndex("data1");
188 | String num = cursor.getString(m);
189 | cursor.close();
190 | return num;
191 | }
192 | }
193 | return null;
194 | }
195 | }
196 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/activity/FiveLine.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2015 guohuanwen
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.jju.howe.howeassistant.activity;
18 |
19 | import android.animation.ValueAnimator;
20 | import android.content.Context;
21 | import android.graphics.Canvas;
22 | import android.graphics.Color;
23 | import android.graphics.Paint;
24 | import android.util.AttributeSet;
25 | import android.view.View;
26 | import android.view.animation.LinearInterpolator;
27 |
28 | /**
29 | * Created by Administrator on 2015/11/9.
30 | */
31 | public class FiveLine extends View {
32 | private Paint paint;
33 | private boolean init = false;
34 | private float width = 0;
35 | private float height = 0;
36 | private ValueAnimator valueAnimator;
37 | private float numb = 0;
38 | private boolean stop = false;
39 | private float[] initLine = new float[]{0.6f, 0.3f, 0, 0.3f, 0.6f};
40 |
41 | public FiveLine(Context context, AttributeSet attrs) {
42 | super(context, attrs);
43 | paint = new Paint(Paint.ANTI_ALIAS_FLAG);
44 | paint.setStrokeWidth(10);
45 | paint.setColor(Color.parseColor("#ff0099cc"));
46 | }
47 |
48 | public void initLine(float[] floats) {
49 | if (floats.length >= 5) {
50 | this.initLine = floats;
51 | }
52 | }
53 |
54 | @Override
55 | protected void onDraw(Canvas canvas) {
56 | super.onDraw(canvas);
57 | if (!init) {
58 | width = getWidth();
59 | height = getHeight();
60 | init = true;
61 | start();
62 | }
63 | numb = (float) valueAnimator.getAnimatedValue();
64 | //三
65 | canvas.drawLine(width / 2, 0f + fx(numb + initLine[2]) * width, width / 2, height - fx(numb) * width, paint);
66 | //二
67 | canvas.drawLine(width / 3, 0f + fx(numb + initLine[1]) * width, width / 3, height - fx(numb + 0.3f) * width, paint);
68 | //一
69 | canvas.drawLine(width / 6, 0f + fx(numb + initLine[0]) * width, width / 6, height - fx(numb + 0.6f) * width, paint);
70 | //四
71 | canvas.drawLine(width / 3 * 2, 0f + fx(numb + initLine[3]) * width, width / 3 * 2, height - fx(numb + 0.3f) * width, paint);
72 | //第五根
73 | canvas.drawLine(width / 6 * 5, 0f + fx(numb + initLine[4]) * width, width / 6 * 5, height - fx(numb + 0.6f) * width, paint);
74 | if (valueAnimator.isRunning()) {
75 | invalidate();
76 | }
77 | }
78 |
79 |
80 | //分段周期函数,做为偏移量
81 | private float fx(float numb) {
82 | if (numb <= 0 && numb > -1) {
83 | numb = Math.abs(numb);
84 | }
85 | if (numb <= -1) {
86 | numb = numb + 2;
87 | }
88 | if (numb > 1) {
89 | numb = -numb + 2;
90 | }
91 | return numb;
92 | }
93 |
94 | public void start() {
95 | if (valueAnimator == null) {
96 | valueAnimator = getValueAnimator();
97 | } else {
98 | valueAnimator.start();
99 | }
100 | if (stop == false) {
101 | postDelayed(new Runnable() {
102 | @Override
103 | public void run() {
104 | start();
105 | invalidate();
106 | }
107 | }, valueAnimator.getDuration());
108 | }
109 | }
110 |
111 | public void stop() {
112 | this.stop = true;
113 | }
114 |
115 | private ValueAnimator getValueAnimator() {
116 | ValueAnimator valueAnimator = ValueAnimator.ofFloat(-1f, 1f);
117 | valueAnimator.setDuration(1500);
118 | valueAnimator.setInterpolator(new LinearInterpolator());
119 | valueAnimator.start();
120 | return valueAnimator;
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/activity/HeartProgressBar.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.activity;
2 |
3 | import android.animation.PropertyValuesHolder;
4 | import android.animation.ValueAnimator;
5 | import android.content.Context;
6 | import android.content.res.TypedArray;
7 | import android.graphics.Canvas;
8 | import android.graphics.Color;
9 | import android.graphics.DiscretePathEffect;
10 | import android.graphics.Paint;
11 | import android.graphics.Path;
12 | import android.graphics.Point;
13 | import android.graphics.RectF;
14 | import android.util.AttributeSet;
15 | import android.view.Display;
16 | import android.view.View;
17 | import android.view.WindowManager;
18 | import android.view.animation.AccelerateDecelerateInterpolator;
19 | import android.view.animation.AccelerateInterpolator;
20 | import android.view.animation.Animation;
21 | import android.view.animation.AnticipateInterpolator;
22 | import android.view.animation.AnticipateOvershootInterpolator;
23 | import android.view.animation.BounceInterpolator;
24 | import android.view.animation.CycleInterpolator;
25 | import android.view.animation.DecelerateInterpolator;
26 | import android.view.animation.LinearInterpolator;
27 | import android.view.animation.OvershootInterpolator;
28 | import android.widget.ProgressBar;
29 |
30 | import com.jju.howe.howeassistant.R;
31 |
32 | /**
33 | * Created by Ahmed on 7/19/14.
34 | */
35 | public class HeartProgressBar extends View {
36 |
37 | // #MARK - Constants
38 |
39 | // view property
40 | private int width;
41 | private int height;
42 | private Context context;
43 | private int heartColor;
44 |
45 | private boolean isStopped;
46 | private ValueAnimator animatorLeftHeart;
47 | private ValueAnimator animatorRightHeart;
48 | private final static String POSITION_X = "positionX";
49 | private final static String POSITION_Y = "positionY";
50 |
51 | private float leftHeartX;
52 | private float leftHeartY;
53 | private float rightHeartX;
54 | private float rightHeartY;
55 |
56 | // #MARK - Constructors
57 |
58 | public HeartProgressBar(Context context) {
59 | super(context);
60 | init(context, Color.parseColor("#FF4351"));
61 | }
62 |
63 | public HeartProgressBar(Context context, AttributeSet attrs) {
64 | super(context, attrs);
65 | TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.HeartProgressBar, 0, 0);
66 | try {
67 | int heartColor = typedArray.getColor(R.styleable.HeartProgressBar_heartColor, Color.parseColor("#FF4351"));
68 | init(context, heartColor);
69 | } finally {
70 | typedArray.recycle();
71 | }
72 | }
73 |
74 | private void init(Context context, int heartColor) {
75 | this.context = context;
76 | this.heartColor = heartColor;
77 | this.isStopped = true;
78 | }
79 |
80 | // #MARK - User's Methods
81 |
82 | public void start() {
83 | this.isStopped = false;
84 |
85 | leftHeartX = width / 4 + width / 8;
86 | leftHeartY = height / 4 + height / 8;
87 |
88 | PropertyValuesHolder widthPropertyHolder = PropertyValuesHolder.ofFloat(POSITION_X, width / 4 + width / 8, width / 2 + width / 8);
89 | PropertyValuesHolder heightPropertyHolder = PropertyValuesHolder.ofFloat(POSITION_Y, height / 4 + height / 8, height / 2 + height / 8);
90 | animatorLeftHeart = ValueAnimator.ofPropertyValuesHolder(widthPropertyHolder, heightPropertyHolder);
91 | animatorLeftHeart.setDuration(2000);
92 | animatorLeftHeart.setStartDelay(1000);
93 | animatorLeftHeart.setInterpolator(new AnticipateOvershootInterpolator());
94 | animatorLeftHeart.addUpdateListener(leftHeartAnimationUpdateListener);
95 | animatorLeftHeart.setRepeatMode(ValueAnimator.REVERSE);
96 | animatorLeftHeart.setRepeatCount(ValueAnimator.INFINITE);
97 |
98 | widthPropertyHolder = PropertyValuesHolder.ofFloat(POSITION_X, width / 2 + width / 8, width / 4 + width / 8);
99 | heightPropertyHolder = PropertyValuesHolder.ofFloat(POSITION_Y, height / 4 + height / 8, height / 2 + height / 8);
100 | animatorRightHeart = ValueAnimator.ofPropertyValuesHolder(widthPropertyHolder, heightPropertyHolder);
101 | animatorRightHeart.setDuration(2000);
102 | animatorRightHeart.setInterpolator(new AnticipateOvershootInterpolator());
103 | animatorRightHeart.addUpdateListener(rightHeartAnimationUpdateListener);
104 | animatorRightHeart.setRepeatCount(ValueAnimator.INFINITE);
105 | animatorRightHeart.setRepeatMode(ValueAnimator.REVERSE);
106 |
107 | animatorRightHeart.start();
108 | animatorLeftHeart.start();
109 |
110 | invalidate();
111 | }
112 |
113 | public void dismiss() {
114 | this.isStopped = true;
115 | animatorLeftHeart.cancel();
116 | animatorRightHeart.cancel();
117 | invalidate();
118 | }
119 |
120 | public boolean isStopped() {
121 | return this.isStopped;
122 | }
123 |
124 | public void setHeartColor(int color) {
125 | this.heartColor = color;
126 | invalidate();
127 | }
128 |
129 | // #MARK - Utility Methods
130 |
131 | private int measureWidth(int widthMeasureSpec) {
132 | int result = 0;
133 |
134 | int specMode = MeasureSpec.getMode(widthMeasureSpec);
135 | int specSize = MeasureSpec.getSize(widthMeasureSpec);
136 |
137 | WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
138 | Display display = windowManager.getDefaultDisplay();
139 | Point size = new Point();
140 |
141 | display.getSize(size);
142 | int screenWidth = size.x;
143 | if (specMode == MeasureSpec.EXACTLY) {
144 | result = specSize;
145 | } else {
146 | // result = screenWidth;
147 | result = 200;
148 | if (specMode == MeasureSpec.AT_MOST) {
149 | result = Math.min(result, specSize);
150 | }
151 | }
152 | this.width = result;
153 | return result;
154 | }
155 |
156 | private int measureHeight(int heightMeasureSpec) {
157 | int result = 0;
158 |
159 | int specMode = MeasureSpec.getMode(heightMeasureSpec);
160 | int specSize = MeasureSpec.getSize(heightMeasureSpec);
161 |
162 | WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
163 | Display display = windowManager.getDefaultDisplay();
164 | Point size = new Point();
165 | display.getSize(size);
166 | int screenHeight = size.y;
167 | if (specMode == MeasureSpec.EXACTLY) {
168 | result = specSize;
169 | } else {
170 | // result = screenHeight;
171 | result = 200;
172 | if (specMode == MeasureSpec.AT_MOST) {
173 | result = Math.min(result, specSize);
174 | }
175 | }
176 | this.height = result;
177 | return result;
178 | }
179 |
180 | private float measureCircleRadius(int width, int height) {
181 | float radius = (float) Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2)) / 4;
182 | return radius + 2;
183 | }
184 |
185 | // #MARK - Listeners Methods
186 |
187 | ValueAnimator.AnimatorUpdateListener leftHeartAnimationUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
188 | @Override
189 | public void onAnimationUpdate(ValueAnimator animation) {
190 | if (!isStopped) {
191 | leftHeartX = (Float) animation.getAnimatedValue(POSITION_X);
192 | leftHeartY = (Float) animation.getAnimatedValue(POSITION_Y);
193 | invalidate();
194 | }
195 | }
196 | };
197 |
198 | ValueAnimator.AnimatorUpdateListener rightHeartAnimationUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
199 | @Override
200 | public void onAnimationUpdate(ValueAnimator animation) {
201 | if (!isStopped) {
202 | rightHeartX = (Float) animation.getAnimatedValue(POSITION_X);
203 | rightHeartY = (Float) animation.getAnimatedValue(POSITION_Y);
204 | invalidate();
205 | }
206 | }
207 | };
208 |
209 | // #MARK - Override Methods
210 |
211 | @Override
212 | protected void onDraw(Canvas canvas) {
213 | super.onDraw(canvas);
214 | canvas.save();
215 | if (this.width != this.height) {
216 | return;
217 | }
218 | if (!this.isStopped) {
219 | drawRhombus(canvas);
220 | drawCircle(canvas, rightHeartX, rightHeartY);
221 | drawCircle(canvas, leftHeartX, leftHeartY);
222 | }
223 | canvas.restore();
224 | }
225 |
226 | @Override
227 | protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
228 | super.onSizeChanged(width, height, oldWidth, oldHeight);
229 | this.width = width;
230 | this.height = height;
231 | }
232 |
233 | @Override
234 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
235 | setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
236 | }
237 |
238 | // #MARK - Drawing Methods
239 |
240 | private void drawRhombus(Canvas canvas) {
241 | Paint rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
242 | rectPaint.setColor(this.heartColor);
243 | RectF rect = new RectF();
244 | float sizeOffset = (float) (width * 0.145);
245 | float xOffset = (float) (width * 0.075);
246 | float yOffset = (float) (height * 0.075);
247 | rect.set(width / 4 + xOffset, height / 4 + sizeOffset - yOffset, width - width / 4 - sizeOffset + xOffset, height - height / 4 - yOffset);
248 | canvas.rotate(-45f, rect.centerX(), rect.centerY());
249 | canvas.drawRect(rect, rectPaint);
250 | canvas.rotate(45f, rect.centerX(), rect.centerY());
251 |
252 | Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
253 | paint.setColor(this.heartColor);
254 | paint.setStyle(Paint.Style.FILL_AND_STROKE);
255 | paint.setDither(true);
256 | paint.setStrokeJoin(Paint.Join.ROUND);
257 | paint.setStrokeCap(Paint.Cap.ROUND);
258 | paint.setStrokeWidth(3);
259 |
260 | Path path = new Path();
261 | path.setFillType(Path.FillType.EVEN_ODD);
262 | path.moveTo(width / 2, height / 4);
263 | path.lineTo(width / 4, height / 2);
264 | path.moveTo(width / 4, height / 2);
265 | path.lineTo(width / 2, height - height / 4);
266 | path.moveTo(width / 2, height - height / 4);
267 | path.lineTo(width - width / 4, height / 2);
268 | path.moveTo(width - width / 4, height / 2);
269 | path.lineTo(width / 2, height / 4);
270 | path.close();
271 | canvas.drawPath(path, paint);
272 | }
273 |
274 | private void drawCircle(Canvas canvas, float x, float y) {
275 | Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
276 | paint.setStyle(Paint.Style.FILL);
277 | paint.setColor(this.heartColor);
278 | float circleRadius = measureCircleRadius(this.width, this.height);
279 | canvas.drawCircle(x, y, circleRadius, paint);
280 | }
281 |
282 | }
283 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/activity/HelpActivity.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.activity;
2 |
3 | import android.app.Activity;
4 | import android.app.AlertDialog;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.os.Bundle;
7 | import android.util.Log;
8 | import android.view.View;
9 | import android.view.Window;
10 | import android.widget.LinearLayout;
11 | import android.widget.Toast;
12 |
13 | import com.iflytek.cloud.ErrorCode;
14 | import com.iflytek.cloud.InitListener;
15 | import com.iflytek.cloud.LexiconListener;
16 | import com.iflytek.cloud.SpeechConstant;
17 | import com.iflytek.cloud.SpeechError;
18 | import com.iflytek.cloud.SpeechRecognizer;
19 | import com.iflytek.cloud.util.ContactManager;
20 | import com.jju.howe.howeassistant.R;
21 |
22 | public class HelpActivity extends Activity {
23 | private LinearLayout ll1, ll2;
24 | private SpeechRecognizer mIat;
25 |
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 | requestWindowFeature(Window.FEATURE_NO_TITLE);
30 | setContentView(R.layout.activity_help);
31 | ll1 = (LinearLayout) findViewById(R.id.ll1);
32 | ll2 = (LinearLayout) findViewById(R.id.ll2);
33 |
34 | mIat = SpeechRecognizer.createRecognizer(HelpActivity.this, mInitListener);
35 | ll1.setOnClickListener(new View.OnClickListener() {
36 | @Override
37 | public void onClick(View view) {
38 | ContactManager mgr = ContactManager.createManager(HelpActivity.this,
39 | mContactListener);
40 | mgr.asyncQueryAllContactsName();
41 | }
42 | });
43 |
44 | ll2.setOnClickListener(new View.OnClickListener() {
45 | @Override
46 | public void onClick(View view) {
47 | AlertDialog.Builder dialog = new AlertDialog.Builder(HelpActivity.this);
48 | dialog.setTitle("提示");
49 | dialog.setMessage(R.string.cando);
50 | dialog.setPositiveButton("确定",null);
51 | dialog.show();
52 | }
53 | });
54 |
55 | }
56 |
57 | /**
58 | * 初始化监听器。
59 | */
60 | private InitListener mInitListener = new InitListener() {
61 |
62 | @Override
63 | public void onInit(int code) {
64 | if (code != ErrorCode.SUCCESS) {
65 | Toast.makeText(HelpActivity.this, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();
66 |
67 | }
68 | }
69 | };
70 | /**
71 | * 上传联系人/词表监听器。
72 | */
73 | private LexiconListener mLexiconListener = new LexiconListener() {
74 |
75 | @Override
76 | public void onLexiconUpdated(String lexiconId, SpeechError error) {
77 | if (error != null) {
78 | Toast.makeText(HelpActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
79 | } else {
80 | Toast.makeText(HelpActivity.this, getString(R.string.text_upload_success), Toast.LENGTH_SHORT).show();
81 |
82 | }
83 | }
84 | };
85 |
86 | int ret = 0; // 函数调用返回值
87 |
88 | /**
89 | * 获取联系人监听器。
90 | */
91 | private ContactManager.ContactListener mContactListener = new ContactManager.ContactListener() {
92 |
93 | @Override
94 | public void onContactQueryFinish(final String contactInfos, boolean changeFlag) {
95 | // 注:实际应用中除第一次上传之外,之后应该通过changeFlag判断是否需要上传,否则会造成不必要的流量.
96 | // 每当联系人发生变化,该接口都将会被回调,可通过ContactManager.destroy()销毁对象,解除回调。
97 | // if(changeFlag) {
98 | // 指定引擎类型
99 | runOnUiThread(new Runnable() {
100 | public void run() {
101 |
102 | }
103 | });
104 |
105 | mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
106 | mIat.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");
107 | ret = mIat.updateLexicon("contact", contactInfos, mLexiconListener);
108 | if (ret != ErrorCode.SUCCESS) {
109 | Toast.makeText(HelpActivity.this, "上传联系人失败:" + ret, Toast.LENGTH_SHORT).show();
110 | }
111 | }
112 | };
113 | }
114 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/activity/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.activity;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.app.Activity;
5 | import android.content.Intent;
6 | import android.os.Bundle;
7 | import android.text.TextUtils;
8 | import android.util.Log;
9 | import android.view.KeyEvent;
10 | import android.view.View;
11 | import android.view.Window;
12 | import android.widget.TextView;
13 | import android.widget.Toast;
14 |
15 | import com.iflytek.cloud.ErrorCode;
16 | import com.iflytek.cloud.InitListener;
17 | import com.iflytek.cloud.SpeechConstant;
18 | import com.iflytek.cloud.SpeechError;
19 | import com.iflytek.cloud.SpeechSynthesizer;
20 | import com.iflytek.cloud.SpeechUnderstander;
21 | import com.iflytek.cloud.SpeechUnderstanderListener;
22 | import com.iflytek.cloud.SpeechUtility;
23 | import com.iflytek.cloud.SynthesizerListener;
24 | import com.iflytek.cloud.UnderstanderResult;
25 | import com.iflytek.sunflower.FlowerCollector;
26 | import com.jju.howe.howeassistant.R;
27 | import com.jju.howe.howeassistant.action.CallAction;
28 | import com.jju.howe.howeassistant.action.CallView;
29 | import com.jju.howe.howeassistant.action.MessageView;
30 | import com.jju.howe.howeassistant.action.OpenAppAction;
31 | import com.jju.howe.howeassistant.action.OpenQA;
32 | import com.jju.howe.howeassistant.action.ScheduleCreate;
33 | import com.jju.howe.howeassistant.action.ScheduleView;
34 | import com.jju.howe.howeassistant.action.SearchAction;
35 | import com.jju.howe.howeassistant.action.SearchApp;
36 | import com.jju.howe.howeassistant.action.SearchWeather;
37 | import com.jju.howe.howeassistant.action.SendMessage;
38 | import com.jju.howe.howeassistant.bean.AnswerBean;
39 | import com.jju.howe.howeassistant.bean.DataBean;
40 | import com.jju.howe.howeassistant.bean.DatetimeBean;
41 | import com.jju.howe.howeassistant.bean.MainBean;
42 | import com.jju.howe.howeassistant.bean.ResultBean;
43 | import com.jju.howe.howeassistant.bean.SlotsBean;
44 | import com.jju.howe.howeassistant.util.JsonParser;
45 |
46 | import java.util.Calendar;
47 |
48 | public class MainActivity extends Activity implements View.OnClickListener {
49 |
50 | private static String TAG = MainActivity.class.getSimpleName();
51 | private MainBean mMainBean;
52 | private SpeechUnderstander mSpeechUnderstander;
53 | private Toast mToast;
54 | private TextView mAskText, mUnderstanderText;
55 | private HeartProgressBar heartProgressBar;
56 | private FiveLine mFiveLine;
57 |
58 | public static boolean service_flag = false;//表示是否在一项服务中
59 | public static String SRResult = ""; //识别结果
60 |
61 | // 语音合成对象
62 | private SpeechSynthesizer mTts;
63 |
64 |
65 | @SuppressLint("ShowToast")
66 | public void onCreate(Bundle savedInstanceState) {
67 | super.onCreate(savedInstanceState);
68 | requestWindowFeature(Window.FEATURE_NO_TITLE);
69 | setContentView(R.layout.activity_main);
70 | SpeechUtility.createUtility(this, SpeechConstant.APPID + "=58057ac8");
71 |
72 | // 初始化对象
73 | mSpeechUnderstander = SpeechUnderstander.createUnderstander(MainActivity.this, mSpeechUdrInitListener);
74 |
75 | mToast = Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT);
76 |
77 | mTts = SpeechSynthesizer.createSynthesizer(MainActivity.this, mTtsInitListener);
78 | initLayout();
79 | }
80 |
81 | /**
82 | * 初始化Layout。
83 | */
84 | private void initLayout() {
85 | mAskText = (TextView) findViewById(R.id.tv_ask);
86 | mUnderstanderText = (TextView) findViewById(R.id.tv_answer);
87 | heartProgressBar = (HeartProgressBar) findViewById(R.id.progressBar);
88 | mFiveLine = (FiveLine) findViewById(R.id.fiveLine);
89 |
90 | mUnderstanderText.setText("我能帮您做什么吗?");
91 | speakAnswer("我能帮您做什么吗?");
92 |
93 | findViewById(R.id.start_understander).setOnClickListener(MainActivity.this);
94 | }
95 |
96 | int ret = 0;// 函数调用返回值
97 |
98 | @Override
99 | public void onClick(View view) {
100 | switch (view.getId()) {
101 | // 开始语音理解
102 | case R.id.start_understander:
103 | mFiveLine.setVisibility(View.INVISIBLE);
104 | heartProgressBar.start();
105 | mTts.stopSpeaking();
106 |
107 | if (mSpeechUnderstander.isUnderstanding()) {// 开始前检查状态
108 | mSpeechUnderstander.stopUnderstanding();
109 | //showTip("停止录音");
110 | }
111 | ret = mSpeechUnderstander.startUnderstanding(mSpeechUnderstanderListener);
112 | if (ret != 0) {
113 | showTip("语义理解失败,错误码:" + ret);
114 | } else {
115 | showTip("请开始说话…");
116 | }
117 |
118 | break;
119 |
120 | }
121 | }
122 |
123 | /**
124 | * 帮助
125 | */
126 | public void help(View view) {
127 | startActivity(new Intent(MainActivity.this, HelpActivity.class));
128 | }
129 |
130 | /**
131 | * 初始化监听器(语音到语义)。
132 | */
133 | private InitListener mSpeechUdrInitListener = new InitListener() {
134 |
135 | @Override
136 | public void onInit(int code) {
137 | Log.d(TAG, "speechUnderstanderListener init() code = " + code);
138 | if (code != ErrorCode.SUCCESS) {
139 | showTip("初始化失败,错误码:" + code);
140 | }
141 | }
142 | };
143 | /**
144 | * 初始化监听。
145 | */
146 | private InitListener mTtsInitListener = new InitListener() {
147 | @Override
148 | public void onInit(int code) {
149 | Log.d(TAG, "InitListener init() code = " + code);
150 | if (code != ErrorCode.SUCCESS) {
151 | showTip("初始化失败,错误码:" + code);
152 | }
153 | }
154 | };
155 |
156 |
157 | /**
158 | * 语义理解回调。
159 | */
160 | private SpeechUnderstanderListener mSpeechUnderstanderListener = new SpeechUnderstanderListener() {
161 |
162 | @Override
163 | public void onResult(final UnderstanderResult result) {
164 | if (null != result) {
165 | Log.d(TAG, result.getResultString());
166 |
167 | // 显示
168 | String text = result.getResultString();
169 | Log.e(TAG, text);
170 | mMainBean = JsonParser.parseIatResult(text);
171 |
172 |
173 | if (!TextUtils.isEmpty(text)) {
174 | mAskText.setText(mMainBean.getText());
175 | if (mMainBean.getRc() == 0) {
176 | SRResult = mMainBean.getText();
177 | judgeService();
178 | } else {
179 | mUnderstanderText.setText("我听不懂您说什么,亲爱的,下次可能我就明白了");
180 | speakAnswer("我听不懂您说什么,亲爱的,下次可能我就明白了");
181 | }
182 | }
183 | } else {
184 | showTip("识别结果不正确。");
185 | }
186 | }
187 |
188 | @Override
189 | public void onVolumeChanged(int volume, byte[] data) {
190 | //showTip("当前正在说话,音量大小:" + volume);
191 | Log.d(TAG, data.length + "");
192 | }
193 |
194 | @Override
195 | public void onEndOfSpeech() {
196 | // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
197 | //showTip("结束说话");
198 | heartProgressBar.dismiss();
199 | }
200 |
201 | @Override
202 | public void onBeginOfSpeech() {
203 | // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
204 | //showTip("开始说话");
205 | }
206 |
207 | @Override
208 | public void onError(SpeechError error) {
209 | showTip(error.getPlainDescription(true));
210 | }
211 |
212 | @Override
213 | public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
214 | }
215 | };
216 |
217 | /**
218 | * 合成回调监听。
219 | */
220 | private SynthesizerListener mTtsListener = new SynthesizerListener() {
221 |
222 | @Override
223 | public void onSpeakBegin() {
224 | //showTip("开始播放");
225 | }
226 |
227 | @Override
228 | public void onSpeakPaused() {
229 | //showTip("暂停播放");
230 | }
231 |
232 | @Override
233 | public void onSpeakResumed() {
234 | //showTip("继续播放");
235 | }
236 |
237 | @Override
238 | public void onBufferProgress(int percent, int beginPos, int endPos,
239 | String info) {
240 | // 合成进度
241 | //mPercentForBuffering = percent;
242 | //showTip(String.format(getString(R.string.tts_toast_format),
243 | // mPercentForBuffering, mPercentForPlaying));
244 | }
245 |
246 | @Override
247 | public void onSpeakProgress(int percent, int beginPos, int endPos) {
248 | // 播放进度
249 | //mPercentForPlaying = percent;
250 | //showTip(String.format(getString(R.string.tts_toast_format),
251 | // mPercentForBuffering, mPercentForPlaying));
252 | }
253 |
254 | @Override
255 | public void onCompleted(SpeechError error) {
256 | if (error == null) {
257 | //showTip("播放完成");
258 | mFiveLine.setVisibility(View.INVISIBLE);
259 | }
260 | }
261 |
262 | @Override
263 | public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
264 | }
265 | };
266 |
267 | public void speakAnswer(String text) {
268 | // 移动数据分析,收集开始合成事件
269 | FlowerCollector.onEvent(MainActivity.this, "tts_play");
270 |
271 | int code = mTts.startSpeaking(text, mTtsListener);
272 | mFiveLine.setVisibility(View.VISIBLE);
273 | mUnderstanderText.setText(text);
274 | if (code != ErrorCode.SUCCESS) {
275 | if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {
276 | //未安装则跳转到提示安装页面
277 | showTip("请安装语记!");
278 | } else {
279 | showTip("语音合成失败,错误码: " + code);
280 | }
281 | }
282 | }
283 |
284 | private void showTip(final String str) {
285 | mToast.setText(str);
286 | mToast.show();
287 | }
288 |
289 |
290 | //语义场景判断
291 | private void judgeService() {
292 |
293 | SRResult = null;
294 | String service = mMainBean.getService();
295 | String operation = mMainBean.getOperation();
296 |
297 | AnswerBean answerBean = new AnswerBean();
298 | SlotsBean slotsBean = new SlotsBean();
299 | DatetimeBean datetimeBean = new DatetimeBean();
300 | ResultBean resultBean = new ResultBean();
301 | DataBean dataBean = new DataBean();
302 |
303 | String date = "该天";
304 |
305 | if (mMainBean.getAnswer() != null) {
306 | answerBean = mMainBean.getAnswer();
307 | }
308 |
309 |
310 | if (mMainBean.getSemantic() != null) {
311 | if (mMainBean.getSemantic().getSlots() != null) {
312 | slotsBean = mMainBean.getSemantic().getSlots();
313 | if (mMainBean.getSemantic().getSlots().getDatetime() != null) {
314 | datetimeBean = mMainBean.getSemantic().getSlots().getDatetime();
315 | }
316 | }
317 | }
318 |
319 |
320 | if (mMainBean.getData() != null) {
321 | if (mMainBean.getData().getResult() != null) {
322 | if (mMainBean.getSemantic().getSlots().getDatetime() != null) {
323 | Calendar calendar = Calendar.getInstance();
324 | int today = calendar.get(Calendar.DAY_OF_MONTH);
325 | dataBean = mMainBean.getData();
326 | String day = datetimeBean.getDate().substring(datetimeBean.getDate().length() - 2, datetimeBean.getDate().length());
327 | if (day.equals("AY")) {
328 | day = today + "";
329 | }
330 | int getday = Integer.parseInt(day);
331 | int sub = getday - today;
332 | resultBean = dataBean.getResult().get(sub);
333 |
334 | if (sub == 0) {
335 | date = "今天";
336 | } else if (sub == 1) {
337 | date = "明天";
338 | } else if (sub == 2) {
339 | date = "后天";
340 | } else if (sub == 3) {
341 | date = "大后天";
342 | } else if (sub == 4) {
343 | date = "四天后";
344 | } else if (sub == 5) {
345 | date = "五天后";
346 | } else if (sub == 6) {
347 | date = "六天后";
348 | }
349 | }
350 | }
351 |
352 | }
353 |
354 | if (service_flag == false) {//如果不在一项服务中才进行服务的判断
355 |
356 |
357 | switch (service) {
358 |
359 | case "telephone":
360 | switch (operation) {
361 | case "CALL": { //1打电话
362 | //必要条件【电话号码code】
363 | //可选条件【人名name】【类型category】【号码归属地location】【运营商operator】【号段head_num】【尾号tail_num】
364 | //可由多个可选条件确定必要条件
365 | CallAction callAction = new CallAction(slotsBean.getName(), slotsBean.getCode(), MainActivity.this);//目前可根据名字或电话号码拨打电话
366 | callAction.start();
367 | break;
368 | }
369 | case "VIEW": { //2查看电话拨打记录
370 | //必要条件无
371 | //可选条件【未接电话】【已拨电话】【已接电话】
372 | CallView callview = new CallView(this);
373 | callview.start();
374 | break;
375 | }
376 | default:
377 | break;
378 | }
379 |
380 | break;
381 | case "message": {//2 短信相关服务
382 |
383 | switch (operation) {
384 |
385 | case "SEND": {//1发送短信
386 | SendMessage sendMessage = new SendMessage(slotsBean.getName(), slotsBean.getCode(), slotsBean.getContent(), MainActivity.this);
387 | sendMessage.start();
388 | break;
389 | }
390 |
391 | case "VIEW": {//2查看发送短信页面
392 |
393 | MessageView messageView = new MessageView(this);
394 | messageView.start();
395 | break;
396 | }
397 |
398 | default:
399 | break;
400 | }
401 |
402 | break;
403 | }
404 | case "app": {//3 应用相关服务
405 |
406 | switch (operation) {
407 |
408 | case "LAUNCH": {//1打开应用
409 | OpenAppAction openApp = new OpenAppAction(slotsBean.getName(), MainActivity.this);
410 | openApp.start();
411 | break;
412 | }
413 |
414 | case "QUERY": {//2应用中心搜索应用
415 | SearchApp searchApp = new SearchApp(slotsBean.getName(), this);
416 | searchApp.start();
417 | break;
418 | }
419 |
420 | default:
421 | break;
422 |
423 | }
424 | break;
425 | }
426 |
427 | case "websearch": {//5 搜索相关服务
428 |
429 | switch (operation) {
430 |
431 | case "QUERY": {//1搜索
432 |
433 | SearchAction searchAction = new SearchAction(slotsBean.getKeywords(), MainActivity.this);
434 | searchAction.Search();
435 | break;
436 | }
437 |
438 | default:
439 | break;
440 |
441 | }
442 |
443 | break;
444 | }
445 |
446 | case "faq": {//6 社区问答相关服务
447 |
448 | switch (operation) {
449 | case "ANSWER": {//1社区问答
450 | OpenQA openQA = new OpenQA(answerBean.getText(), this);
451 | openQA.start();
452 | break;
453 | }
454 | default:
455 | break;
456 | }
457 |
458 | break;
459 |
460 | }
461 |
462 | case "chat": {//7 聊天相关服务
463 |
464 | switch (operation) {
465 |
466 | case "ANSWER": {//1聊天模式
467 |
468 | OpenQA openQA = new OpenQA(answerBean.getText(), this);
469 | openQA.start();
470 |
471 | break;
472 | }
473 |
474 | default:
475 | break;
476 | }
477 |
478 | break;
479 | }
480 |
481 | case "openQA": {//8 智能问答相关服务
482 |
483 | switch (operation) {
484 |
485 | case "ANSWER": {//1智能问答
486 |
487 | OpenQA openQA = new OpenQA(answerBean.getText(), this);
488 | openQA.start();
489 |
490 | break;
491 | }
492 |
493 | default:
494 | break;
495 | }
496 |
497 | break;
498 | }
499 |
500 | case "baike": {//9 百科知识相关服务
501 |
502 | switch (operation) {
503 |
504 | case "ANSWER": {//1百科
505 |
506 | OpenQA openQA = new OpenQA(answerBean.getText(), this);
507 | openQA.start();
508 |
509 | break;
510 | }
511 |
512 | default:
513 | break;
514 | }
515 |
516 | break;
517 | }
518 |
519 | case "schedule": {//10 日程相关服务
520 |
521 | switch (operation) {
522 |
523 | case "CREATE": {//1创建日程/闹钟(直接跳转相应设置界面)
524 |
525 | ScheduleCreate scheduleCreate = new ScheduleCreate(slotsBean.getName(), datetimeBean.getTime(), datetimeBean.getDate(), slotsBean.getContent(), this);
526 | scheduleCreate.start();
527 |
528 | break;
529 | }
530 |
531 | case "VIEW": {//1查看闹钟/日历(未实现)
532 |
533 | ScheduleView scheduleView = new ScheduleView(slotsBean.getName(), datetimeBean.getTime(), datetimeBean.getDate(), slotsBean.getContent(), this);
534 | scheduleView.start();
535 | break;
536 | }
537 |
538 |
539 | default:
540 | break;
541 | }
542 |
543 | break;
544 | }
545 |
546 | case "weather": {//11 天气相关服务
547 |
548 | switch (operation) {
549 |
550 | case "QUERY": {//1查询天气
551 |
552 | SearchWeather searchWeather = new SearchWeather(date, resultBean.getCity(), resultBean.getSourceName(), resultBean.getDate(), resultBean.getWeather(), resultBean.getTempRange(), resultBean.getAirQuality(), resultBean.getWind(), resultBean.getHumidity(), resultBean.getWindLevel() + "", this);
553 | searchWeather.start();
554 |
555 | break;
556 | }
557 |
558 | default:
559 | break;
560 |
561 | }
562 |
563 | break;
564 | }
565 |
566 | default:
567 | mUnderstanderText.setText("我听不懂您说什么,亲爱的,下次可能我就明白了");
568 | speakAnswer("我听不懂您说什么,亲爱的,下次可能我就明白了");
569 | break;
570 | }
571 | }
572 |
573 | }
574 |
575 | /**
576 | * 双击退出
577 | *
578 | * @param keyCode
579 | * @param event
580 | * @return
581 | */
582 | @Override
583 | public boolean onKeyDown(int keyCode, KeyEvent event) {
584 | if (keyCode == KeyEvent.KEYCODE_BACK) {
585 | exit();
586 | }
587 |
588 | return false;
589 | }
590 |
591 | private long time = 0;
592 |
593 | public void exit() {
594 | if (System.currentTimeMillis() - time > 2000) {
595 | time = System.currentTimeMillis();
596 | showTip("再点击一次退出应用程序");
597 | } else {
598 | finish();
599 | }
600 | }
601 |
602 | @Override
603 | protected void onDestroy() {
604 | super.onDestroy();
605 | // 退出时释放连接
606 | mSpeechUnderstander.cancel();
607 | mSpeechUnderstander.destroy();
608 | mTts.stopSpeaking();
609 | // 退出时释放连接
610 | mTts.destroy();
611 |
612 | }
613 |
614 |
615 | @Override
616 | protected void onResume() {
617 | //移动数据统计分析
618 | FlowerCollector.onResume(MainActivity.this);
619 | FlowerCollector.onPageStart(TAG);
620 | super.onResume();
621 | }
622 |
623 | @Override
624 | protected void onPause() {
625 | //移动数据统计分析
626 | FlowerCollector.onPageEnd(TAG);
627 | FlowerCollector.onPause(MainActivity.this);
628 | super.onPause();
629 | }
630 |
631 |
632 | }
633 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/AnswerBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | /**
4 | * Created by Howe on 2016/10/23.
5 | */
6 |
7 | public class AnswerBean {
8 | private String text;
9 | private String type;
10 |
11 | public String getText() {
12 | return text;
13 | }
14 |
15 | public void setText(String text) {
16 | this.text = text;
17 | }
18 |
19 | public String getType() {
20 | return type;
21 | }
22 |
23 | public void setType(String type) {
24 | this.type = type;
25 | }
26 |
27 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/DataBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Created by Howe on 2016/10/23.
7 | */
8 |
9 | public class DataBean {
10 |
11 |
12 | private List result;
13 | private ResultBean mResultBean;
14 |
15 | public List getResult() {
16 | return result;
17 | }
18 |
19 | public void setResult(List result) {
20 | this.result = result;
21 | }
22 |
23 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/DatetimeBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | /**
4 | * Created by Howe on 2016/10/23.
5 | */
6 |
7 | public class DatetimeBean {
8 | private String date;
9 | private String type;
10 | private String time;
11 | private String timeOrig;
12 |
13 | public String getDate() {
14 | return date;
15 | }
16 |
17 | public void setDate(String date) {
18 | this.date = date;
19 | }
20 |
21 | public String getType() {
22 | return type;
23 | }
24 |
25 | public void setType(String type) {
26 | this.type = type;
27 | }
28 |
29 | public String getTime() {
30 | return time;
31 | }
32 |
33 | public void setTime(String time) {
34 | this.time = time;
35 | }
36 |
37 | public String getTimeOrig() {
38 | return timeOrig;
39 | }
40 |
41 | public void setTimeOrig(String timeOrig) {
42 | this.timeOrig = timeOrig;
43 | }
44 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/MainBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Created by Howe on 2016/10/23.
7 | */
8 |
9 | public class MainBean {
10 |
11 | /**
12 | * moreResults : [{"rc":0,"answer":{"type":"T","text":"\u201c晚上好\u201d是注重环保和舒适的织花布家纺品牌,此外,\u201c晚上好\u201d也是日常用语之一!"},"service":"baike","text":"晚上好。","operation":"ANSWER"}]
13 | * rc : 0
14 | * operation : ANSWER
15 | * service : chat
16 | * answer : {"text":"确实很晚了\u2026\u2026还不睡呢!再睡会儿就天亮啦!","type":"T"}
17 | * text : 晚上好。
18 | */
19 |
20 | private int rc ;
21 | private String operation;
22 | private String service;
23 | /**
24 | * text : 确实很晚了……还不睡呢!再睡会儿就天亮啦!
25 | * type : T
26 | */
27 |
28 | private AnswerBean answer;
29 | private String text;
30 | /**
31 | * rc : 0
32 | * answer : {"type":"T","text":"\u201c晚上好\u201d是注重环保和舒适的织花布家纺品牌,此外,\u201c晚上好\u201d也是日常用语之一!"}
33 | * service : baike
34 | * text : 晚上好。
35 | * operation : ANSWER
36 | */
37 |
38 | private List moreResults;
39 | /**
40 | * slots : {"name":"张三"}
41 | */
42 |
43 | private SemanticBean semantic;
44 | /**
45 | * header :
46 | * url : http://kcbj.openspeech.cn/service/iss?wuuid=3b7c98f06fae3918d9ae139ad5abb44f&ver=2.0&method=webPage&uuid=9c998fecffe2744d816b7578bb18432bquery
47 | */
48 |
49 | private WebPageBean webPage;
50 | private DataBean data;
51 |
52 |
53 | public int getRc() {
54 | return rc;
55 | }
56 |
57 | public void setRc(int rc) {
58 | this.rc = rc;
59 | }
60 |
61 | public String getOperation() {
62 | return operation;
63 | }
64 |
65 | public void setOperation(String operation) {
66 | this.operation = operation;
67 | }
68 |
69 | public String getService() {
70 | return service;
71 | }
72 |
73 | public void setService(String service) {
74 | this.service = service;
75 | }
76 |
77 | public AnswerBean getAnswer() {
78 | return answer;
79 | }
80 |
81 | public void setAnswer(AnswerBean answer) {
82 | this.answer = answer;
83 | }
84 |
85 | public String getText() {
86 | return text;
87 | }
88 |
89 | public void setText(String text) {
90 | this.text = text;
91 | }
92 |
93 | public List getMoreResults() {
94 | return moreResults;
95 | }
96 |
97 | public void setMoreResults(List moreResults) {
98 | this.moreResults = moreResults;
99 | }
100 |
101 |
102 | public SemanticBean getSemantic() {
103 | return semantic;
104 | }
105 |
106 | public void setSemantic(SemanticBean semantic) {
107 | this.semantic = semantic;
108 | }
109 |
110 | public WebPageBean getWebPage() {
111 | return webPage;
112 | }
113 |
114 | public void setWebPage(WebPageBean webPage) {
115 | this.webPage = webPage;
116 | }
117 |
118 | public DataBean getData() {
119 | return data;
120 | }
121 |
122 | public void setData(DataBean data) {
123 | this.data = data;
124 | }
125 |
126 |
127 |
128 | }
129 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/MoreResultsBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | /**
4 | * Created by Howe on 2016/10/23.
5 | */
6 |
7 | public class MoreResultsBean {
8 | private int rc;
9 |
10 |
11 | private AnswerBean answer;
12 | private String service;
13 | private String text;
14 | private String operation;
15 |
16 | public int getRc() {
17 | return rc;
18 | }
19 |
20 | public void setRc(int rc) {
21 | this.rc = rc;
22 | }
23 |
24 | public AnswerBean getAnswer() {
25 | return answer;
26 | }
27 |
28 | public void setAnswer(AnswerBean answer) {
29 | this.answer = answer;
30 | }
31 |
32 | public String getService() {
33 | return service;
34 | }
35 |
36 | public void setService(String service) {
37 | this.service = service;
38 | }
39 |
40 | public String getText() {
41 | return text;
42 | }
43 |
44 | public void setText(String text) {
45 | this.text = text;
46 | }
47 |
48 | public String getOperation() {
49 | return operation;
50 | }
51 |
52 | public void setOperation(String operation) {
53 | this.operation = operation;
54 | }
55 |
56 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/ResultBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | /**
4 | * Created by Howe on 2016/10/23.
5 | */
6 |
7 | public class ResultBean {
8 | private String airQuality;
9 | private String sourceName;
10 | private String date;
11 | private String lastUpdateTime;
12 | private int dateLong;
13 | private String pm25;
14 | private String city;
15 | private String humidity;
16 | private int windLevel;
17 | private String weather;
18 | private String tempRange;
19 | private String wind;
20 |
21 | public String getAirQuality() {
22 | return airQuality;
23 | }
24 |
25 | public void setAirQuality(String airQuality) {
26 | this.airQuality = airQuality;
27 | }
28 |
29 | public String getSourceName() {
30 | return sourceName;
31 | }
32 |
33 | public void setSourceName(String sourceName) {
34 | this.sourceName = sourceName;
35 | }
36 |
37 | public String getDate() {
38 | return date;
39 | }
40 |
41 | public void setDate(String date) {
42 | this.date = date;
43 | }
44 |
45 | public String getLastUpdateTime() {
46 | return lastUpdateTime;
47 | }
48 |
49 | public void setLastUpdateTime(String lastUpdateTime) {
50 | this.lastUpdateTime = lastUpdateTime;
51 | }
52 |
53 | public int getDateLong() {
54 | return dateLong;
55 | }
56 |
57 | public void setDateLong(int dateLong) {
58 | this.dateLong = dateLong;
59 | }
60 |
61 | public String getPm25() {
62 | return pm25;
63 | }
64 |
65 | public void setPm25(String pm25) {
66 | this.pm25 = pm25;
67 | }
68 |
69 | public String getCity() {
70 | return city;
71 | }
72 |
73 | public void setCity(String city) {
74 | this.city = city;
75 | }
76 |
77 | public String getHumidity() {
78 | return humidity;
79 | }
80 |
81 | public void setHumidity(String humidity) {
82 | this.humidity = humidity;
83 | }
84 |
85 | public int getWindLevel() {
86 | return windLevel;
87 | }
88 |
89 | public void setWindLevel(int windLevel) {
90 | this.windLevel = windLevel;
91 | }
92 |
93 | public String getWeather() {
94 | return weather;
95 | }
96 |
97 | public void setWeather(String weather) {
98 | this.weather = weather;
99 | }
100 |
101 | public String getTempRange() {
102 | return tempRange;
103 | }
104 |
105 | public void setTempRange(String tempRange) {
106 | this.tempRange = tempRange;
107 | }
108 |
109 | public String getWind() {
110 | return wind;
111 | }
112 |
113 | public void setWind(String wind) {
114 | this.wind = wind;
115 | }
116 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/SemanticBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | /**
4 | * Created by Howe on 2016/10/23.
5 | */
6 |
7 | public class SemanticBean {
8 | /**
9 | * name : 张三
10 | */
11 |
12 | private SlotsBean slots;
13 |
14 | public SlotsBean getSlots() {
15 | return slots;
16 | }
17 |
18 | public void setSlots(SlotsBean slots) {
19 | this.slots = slots;
20 | }
21 |
22 |
23 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/SlotsBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | /**
4 | * Created by Howe on 2016/10/23.
5 | */
6 |
7 | public class SlotsBean {
8 | private String name;
9 | private String code;
10 | private String content;
11 | private String messageType;
12 |
13 |
14 | private String keywords;
15 | /**
16 | * date : 2016-10-23
17 | * type : DT_BASIC
18 | * time : 16:00:00
19 | * timeOrig : 四点
20 | */
21 |
22 | private DatetimeBean datetime;
23 |
24 | public String getName() {
25 | return name;
26 | }
27 |
28 | public void setName(String name) {
29 | this.name = name;
30 | }
31 |
32 | public String getCode() {
33 | return code;
34 | }
35 |
36 | public void setCode(String code) {
37 | this.code = code;
38 | }
39 |
40 | public String getContent() {
41 | return content;
42 | }
43 |
44 | public void setContent(String content) {
45 | this.content = content;
46 | }
47 |
48 | public String getMessageType() {
49 | return messageType;
50 | }
51 |
52 | public void setMessageType(String messageType) {
53 | this.messageType = messageType;
54 | }
55 |
56 | public String getKeywords() {
57 | return keywords;
58 | }
59 |
60 | public void setKeywords(String keywords) {
61 | this.keywords = keywords;
62 | }
63 |
64 | public DatetimeBean getDatetime() {
65 | return datetime;
66 | }
67 |
68 | public void setDatetime(DatetimeBean datetime) {
69 | this.datetime = datetime;
70 | }
71 |
72 | }
73 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/bean/WebPageBean.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.bean;
2 |
3 | /**
4 | * Created by Howe on 2016/10/23.
5 | */
6 |
7 | public class WebPageBean {
8 | private String header;
9 | private String url;
10 |
11 | public String getHeader() {
12 | return header;
13 | }
14 |
15 | public void setHeader(String header) {
16 | this.header = header;
17 | }
18 |
19 | public String getUrl() {
20 | return url;
21 | }
22 |
23 | public void setUrl(String url) {
24 | this.url = url;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jju/howe/howeassistant/util/JsonParser.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant.util;
2 |
3 | import com.google.gson.Gson;
4 | import com.google.gson.reflect.TypeToken;
5 | import com.jju.howe.howeassistant.bean.MainBean;
6 |
7 | import java.lang.reflect.Type;
8 |
9 | /**
10 | * Created by Howe on 2016/10/23.
11 | */
12 |
13 | public class JsonParser {
14 |
15 |
16 | private static MainBean mBean;
17 |
18 | /**
19 | * 返回当前说话的内容
20 | *
21 | * @param json
22 | * @return
23 | */
24 | public static MainBean parseIatResult(String json) {
25 | mBean = new MainBean();
26 | try {
27 | Type type = new TypeToken() {
28 | }.getType();
29 |
30 | mBean = new Gson().fromJson(json, type);
31 | } catch (Exception e) {
32 | e.printStackTrace();
33 | }
34 | return mBean;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/jniLibs/arm64-v8a/libmsc.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/jniLibs/arm64-v8a/libmsc.so
--------------------------------------------------------------------------------
/app/src/main/jniLibs/armeabi-v7a/libmsc.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/jniLibs/armeabi-v7a/libmsc.so
--------------------------------------------------------------------------------
/app/src/main/jniLibs/armeabi/libmsc.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/jniLibs/armeabi/libmsc.so
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/drawable/bg.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/btn_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/help.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/drawable/help.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/yy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/drawable/yy.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/yyls.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/drawable/yyls.png
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_help.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
15 |
16 |
24 |
25 |
31 |
32 |
37 |
38 |
46 |
47 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
12 |
13 |
22 |
23 |
24 |
25 |
34 |
35 |
46 |
47 |
57 |
58 |
63 |
64 |
70 |
71 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/main.xml:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 好帮手
4 |
5 | 58057ac8
6 | 本示例为讯飞语音Android平台开发者提供语音听写、语法识别、语义理解和语音合成等代码样例,旨在让用户能够依据该示例快速开发出基于语音接口的应用程序。
7 | 科大讯飞作为中国最大的智能语音技术提供商,在智能语音技术领域有着长期的研究积累,并在中文语音合成、语音识别、口语评测等多项技术上拥有国际领先的成果。科大讯飞是我国唯一以语音技术为产业化方向的“国家863计划成果产业化基地”…
8 | iFLYTEK is a national key software enterprise dedicated to the research of intelligent speech and language technologies, development of software and chip products, provision of speech information services, and integration of E-government systems. The intelligent speech technology of iFLYTEK, the core technology of the company, represents the top level in the world.
9 | \t上传内容为:\n\t#ABNF 1.0 gb2312;\n\tlanguage zh-CN;\n\tmode voice;\n\troot $main;\n\t$main = $place1 到$place2 ;\n\t$place1 = 北京 | 武汉 | 南京 | 天津 | 东京;\n\t$place2 = 上海 | 合肥;
10 | \t您可以说:\n\t今天的天气怎么样?\n\t北京到上海的火车?\n\t有什么好吃的?\n\t上海外滩有哪些酒店?\n\n\t更多语义请登录:\n\thttp://osp.voicecloud.cn/ \n\t配置您的专属语义吧!
11 |
12 | 请开始说话…
13 | 开始音频流识别
14 | 上传联系人
15 | 上传用户词表
16 | 上传成功
17 | 词表下载失败或内容为空
18 | 下载成功
19 | iat_show
20 | 显示听写界面
21 | 结果动态修正
22 |
23 |
24 |
25 | - 本地合成
26 | - 在线合成
27 |
28 |
29 | - local
30 | - cloud
31 |
32 |
33 | - 小燕—女青、中英、普通话
34 | - 小宇—男青、中英、普通话
35 | - 凯瑟琳—女青、英
36 | - 亨利—男青、英
37 | - 玛丽—女青、英
38 | - 小研—女青、中英、普通话
39 | - 小琪—女青、中英、普通话
40 | - 小峰—男青、中英、普通话
41 | - 小梅—女青、中英、粤语
42 | - 小莉—女青、中英、台湾普通话
43 | - 小蓉—女青、中、四川话
44 | - 小芸—女青、中、东北话
45 | - 小坤—男青、中、河南话
46 | - 小强—男青、中、湖南话
47 | - 小莹—女青、中、陕西话
48 | - 小新—男童、中、普通话
49 | - 楠楠—女童、中、普通话
50 | - 老孙—男老、中、普通话
51 |
52 |
53 | - xiaoyan
54 | - xiaoyu
55 | - catherine
56 | - henry
57 | - vimary
58 | - vixy
59 | - xiaoqi
60 | - vixf
61 | - xiaomei
62 | - xiaolin
63 | - xiaorong
64 | - xiaoqian
65 | - xiaokun
66 | - xiaoqiang
67 | - vixying
68 | - xiaoxin
69 | - nannan
70 | - vils
71 |
72 |
73 | - 正常
74 | - 高兴
75 | - 悲伤
76 | - 生气
77 |
78 |
79 | - neutral
80 | - happy
81 | - sad
82 | - angry
83 |
84 |
85 | - 通话
86 | - 系统
87 | - 铃声
88 | - 音乐
89 | - 闹铃
90 | - 通知
91 |
92 |
93 | - 0
94 | - 1
95 | - 2
96 | - 3
97 | - 4
98 | - 5
99 |
100 | 缓冲进度为%d%%,播放进度为%d%%
101 |
102 |
103 | - 普通话
104 | - 粤语
105 | - 河南话
106 | - 英语
107 |
108 |
109 | - mandarin
110 | - cantonese
111 | - henanese
112 | - en_us
113 |
114 |
115 | "[word]\napple\nbanana\norange"
116 | "The quick brown fox jumps over the lazy dog."
117 | "知,痴,是"
118 | "磁铁,率领,脆弱,动手,古筝"
119 | "一座座雪峰插入云霄,峰顶银光闪闪,大大小小的湖泊,像颗颗宝石镶嵌在彩带般的沟谷中。"
120 |
121 | - 英语
122 | - 汉语
123 |
124 |
125 | - en_us
126 | - zh_cn
127 |
128 |
129 | - 单字
130 | - 词语
131 | - 句子
132 |
133 |
134 | - read_syllable
135 | - read_word
136 | - read_sentence
137 |
138 |
139 | - plain
140 | - complete
141 |
142 |
143 |
144 | - 有标点
145 | - 无标点
146 |
147 |
148 | - 1
149 | - 0
150 |
151 |
152 | - 开启
153 | - 关闭
154 |
155 | Settings
156 | 目前能做的事情有,打电话,查看电话拨打记录,发送短信,查看短信,打开应用,搜索应用,搜索相关服务,社区问答相关服务,聊天相关服务,智能问答服务,百科知识相关服务,设置闹钟以及查看未来七天的某天天气,其他功能有待添加。
157 |
158 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/test/java/com/jju/howe/howeassistant/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.jju.howe.howeassistant;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:2.2.2'
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | jcenter()
18 | }
19 | }
20 |
21 | task clean(type: Delete) {
22 | delete rootProject.buildDir
23 | }
24 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JZHowe/HoweAssistant/19e466eed873e088b4c641795d64873549ae5a24/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Dec 28 10:00:20 PST 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------