├── .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 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 1.8 51 | 52 | 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 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HoweAssistant 2 | 好帮手是一个基于Android系统开发的智能语音助手,它能够实现陪你聊天、打电话、发短信、打开应用、查询天气以及智能问答等操作。本应用的语音引擎来自于科大讯飞开放平台,具备较高的普通话识别能力。 3 | **应用界面** 4 | 5 | ---------- 6 | 1. 打开应用时 7 | ![](http://i.imgur.com/KehpSFh.png) 8 | 2. 等待用户说话 9 | ![](http://i.imgur.com/PLPK7Xa.png) 10 | 3. 语音回答 11 | ![](http://i.imgur.com/EREqUhm.png) 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 | 4 | 8 | 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 | --------------------------------------------------------------------------------