【0087】【项目实战】-【智慧北京】-【08】【极光消息推送】【语音识别】【聊天机器人】【友盟统计】【扫描二维码】【新闻频道滑动效果】
1.消息推送效果



【下载之后直接安装运行该apk】可以直接在真机上运行;

【群发消息】




【给指定的人发送消息】在指定设备标签之后可以给该人发送消息;

2.书写一个demo程序
【生成sdk包并下载解压】


【赋值sdk文件到项目中】

【配置清单文件】


[极光官网的清单配置的参考]
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="您应用的包名" 4 android:versionCode="311" 5 android:versionName="3.1.1" 6 > 7 <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="23" /> 8 9 <!-- Required --> 10 <permission 11 android:name="您应用的包名.permission.JPUSH_MESSAGE" 12 android:protectionLevel="signature" /> 13 14 <!-- Required --> 15 <uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE" /> 16 <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /> 17 <uses-permission android:name="android.permission.INTERNET" /> 18 <uses-permission android:name="android.permission.WAKE_LOCK" /> 19 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 20 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 21 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 22 <uses-permission android:name="android.permission.VIBRATE" /> 23 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 24 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 25 <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 26 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 27 28 <!-- Optional. Required for location feature --> 29 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 --> 30 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 31 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 32 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 33 <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> 34 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 35 <uses-permission android:name="android.permission.GET_TASKS" /> 36 37 <application 38 android:icon="@drawable/ic_launcher" 39 android:label="@string/app_name" 40 android:name="Your Application Name"> 41 42 <!-- Required SDK 核心功能--> 43 <!-- 可配置android:process参数将PushService放在其他进程中 --> 44 <service 45 android:name="cn.jpush.android.service.PushService" 46 android:enabled="true" 47 android:exported="false" > 48 <intent-filter> 49 <action android:name="cn.jpush.android.intent.REGISTER" /> 50 <action android:name="cn.jpush.android.intent.REPORT" /> 51 <action android:name="cn.jpush.android.intent.PushService" /> 52 <action android:name="cn.jpush.android.intent.PUSH_TIME" /> 53 </intent-filter> 54 </service> 55 56 57 <!-- since 3.0.9 Required SDK 核心功能--> 58 <provider 59 android:authorities="您应用的包名.DataProvider" 60 android:name="cn.jpush.android.service.DataProvider" 61 android:exported="true" 62 /> 63 64 <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 --> 65 <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 --> 66 <service 67 android:name="cn.jpush.android.service.DaemonService" 68 android:enabled="true" 69 android:exported="true"> 70 <intent-filter > 71 <action android:name="cn.jpush.android.intent.DaemonService" /> 72 <category android:name="您应用的包名"/> 73 </intent-filter> 74 </service> 75 76 <!-- since 3.1.0 Required SDK 核心功能--> 77 <provider 78 android:authorities="您应用的包名.DownloadProvider" 79 android:name="cn.jpush.android.service.DownloadProvider" 80 android:exported="true" 81 /> 82 83 <!-- Required SDK核心功能--> 84 <receiver 85 android:name="cn.jpush.android.service.PushReceiver" 86 android:enabled="true" > 87 <intent-filter android:priority="1000"> 88 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> 89 <category android:name="您应用的包名"/> 90 </intent-filter> 91 <intent-filter> 92 <action android:name="android.intent.action.USER_PRESENT" /> 93 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 94 </intent-filter> 95 <!-- Optional --> 96 <intent-filter> 97 <action android:name="android.intent.action.PACKAGE_ADDED" /> 98 <action android:name="android.intent.action.PACKAGE_REMOVED" /> 99 <data android:scheme="package" /> 100 </intent-filter> 101 </receiver> 102 103 <!-- Required SDK核心功能--> 104 <activity 105 android:name="cn.jpush.android.ui.PushActivity" 106 android:configChanges="orientation|keyboardHidden" 107 android:theme="@android:style/Theme.NoTitleBar" 108 android:exported="false" > 109 <intent-filter> 110 <action android:name="cn.jpush.android.ui.PushActivity" /> 111 <category android:name="android.intent.category.DEFAULT" /> 112 <category android:name="您应用的包名" /> 113 </intent-filter> 114 </activity> 115 <!-- SDK核心功能--> 116 <activity 117 android:name="cn.jpush.android.ui.PopWinActivity" 118 android:configChanges="orientation|keyboardHidden" 119 android:exported="false" 120 android:theme="@style/MyDialogStyle"> 121 <intent-filter> 122 <category android:name="android.intent.category.DEFAULT" /> 123 <category android:name="您应用的包名" /> 124 </intent-filter> 125 </activity> 126 127 <!-- Required SDK核心功能--> 128 <service 129 android:name="cn.jpush.android.service.DownloadService" 130 android:enabled="true" 131 android:exported="false" > 132 </service> 133 134 <!-- Required SDK核心功能--> 135 <receiver android:name="cn.jpush.android.service.AlarmReceiver" /> 136 137 <!-- Required since 3.0.7 --> 138 <!-- 新的tag/alias接口结果返回需要开发者配置一个自定的广播 --> 139 <!-- 该广播需要继承JPush提供的JPushMessageReceiver类, 并如下新增一个 Intent-Filter --> 140 <receiver 141 android:name="自定义 Receiver" 142 android:enabled="true" > 143 <intent-filter> 144 <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" /> 145 <category android:name="您应用的包名" /> 146 </intent-filter> 147 </receiver> 148 149 <!-- User defined. 用户自定义的广播接收器--> 150 <receiver 151 android:name="您自己定义的Receiver" 152 android:enabled="true"> 153 <intent-filter> 154 <!--Required 用户注册SDK的intent--> 155 <action android:name="cn.jpush.android.intent.REGISTRATION" /> 156 <!--Required 用户接收SDK消息的intent--> 157 <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> 158 <!--Required 用户接收SDK通知栏信息的intent--> 159 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> 160 <!--Required 用户打开自定义通知栏的intent--> 161 <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> 162 <!-- 接收网络变化 连接/断开 since 1.6.3 --> 163 <action android:name="cn.jpush.android.intent.CONNECTION" /> 164 <category android:name="您应用的包名" /> 165 </intent-filter> 166 </receiver> 167 168 <!-- Required. For publish channel feature --> 169 <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。--> 170 <!-- 例如: --> 171 <!-- 发到 Google Play 的APK可以设置为 google-play; --> 172 <!-- 发到其他市场的 APK 可以设置为 xxx-market。 --> 173 <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/> 174 <!-- Required. AppKey copied from Portal --> 175 <meta-data android:name="JPUSH_APPKEY" android:value="您应用的Appkey"/> 176 </application> 177 </manifest>
【新建Receiver】



【新建Application并配置清单】





【效果】此时将demo在手机端运行起来之后,就可以极光推送的推送页面进行消息的推送,并在手机终端可以收到消息;
【receiver的功能】



【效果】可以接收到了消息


【获取通知的内容】



【保存附加字段】





[效果]获取到了url的值;接着可以使用WebView加载url的地址;

3.推送拓展
【自定义消息的推送】很多app的更新是不需要显示通知的,因此可以使用自定义消息进行推送;

【聊天系统的框架】借助第三方的推送,首先需要访问的是本公司的服务器;

【服务器端的与极光服务器的推送的连接】

【消息推送原理】简单的原理

4.语音识别
4.1 sdk的下载
【说明】使用第三方的平台-科大讯飞的开放平台








4.2 demo








1 package com.itheima.voicedemo; 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 7 import com.iflytek.cloud.RecognizerListener; 8 import com.iflytek.cloud.RecognizerResult; 9 import com.iflytek.cloud.SpeechConstant; 10 import com.iflytek.cloud.SpeechError; 11 import com.iflytek.cloud.SpeechRecognizer; 12 import com.iflytek.cloud.SpeechSynthesizer; 13 import com.iflytek.cloud.SpeechUtility; 14 import com.iflytek.cloud.ui.RecognizerDialog; 15 import com.iflytek.cloud.ui.RecognizerDialogListener; 16 17 public class MainActivity extends Activity { 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 24 // 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn // 25 // 请勿在“=”与appid之间添加任务空字符或者转义符 26 SpeechUtility.createUtility(this, SpeechConstant.APPID + "=562c44bb"); 27 } 28 29 public void startListen(View view) { 30 // 1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener 31 SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null); 32 // 2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类 33 mIat.setParameter(SpeechConstant.DOMAIN, "iat"); 34 mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); 35 mIat.setParameter(SpeechConstant.ACCENT, "mandarin "); 36 // 3.开始听写 37 mIat.startListening(mRecoListener); 38 } 39 40 // 听写监听器 41 private RecognizerListener mRecoListener = new RecognizerListener() { 42 43 // 听写结果回调接口(返回Json格式结果,用户可参见附录13.1); 44 // 一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加; 45 // 关于解析Json的代码可参见Demo中JsonParser类; 46 // isLast等于true时会话结束。 47 @Override 48 public void onResult(RecognizerResult results, boolean isLast) { 49 System.out.println(results.getResultString()); 50 System.out.println("isLast:" + isLast); 51 } 52 53 // 开始录音 54 @Override 55 public void onBeginOfSpeech() { 56 57 } 58 59 // 结束录音 60 @Override 61 public void onEndOfSpeech() { 62 63 } 64 65 // 会话发生错误回调接口 66 @Override 67 public void onError(SpeechError arg0) { 68 69 } 70 71 // 扩展用接口 72 @Override 73 public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) { 74 75 } 76 77 // volume音量值0~30,data音频数据 78 @Override 79 public void onVolumeChanged(int arg0, byte[] arg1) { 80 81 } 82 83 }; 84 85 }
【效果】使用真机运行结果


4.3语音输入的UI




4.4 语音合成
【说明】写文字可以将文字直接说出来



5.聊天机器人
5.1 聊天机器人的效果




5.2 布局
【说明】聊天的布局使用的是ListView,该显示的显示,该隐藏的隐藏
【按钮的布局】




【聊天信息的布局】/聊天机器人74/res/layout/list_item.xml
【说明】将三种样式全部布局在同一个xml中;根据实时的情况进行显示或者隐藏;
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:padding="10dp" > 6 7 <TextView 8 android:id="@+id/tv_ask" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:layout_alignParentRight="true" 12 android:background="@drawable/asker_bubble" 13 android:gravity="center" 14 android:paddingLeft="10dp" 15 android:paddingRight="15dp" 16 android:text="提问" 17 android:textColor="#000" 18 android:textSize="18sp" /> 19 20 <LinearLayout 21 android:id="@+id/ll_answer" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:layout_below="@id/tv_ask" 25 android:layout_marginTop="10dp" 26 android:background="@drawable/answer_bubble" 27 android:gravity="center_vertical" 28 android:orientation="vertical" 29 android:paddingLeft="15dp" 30 android:paddingRight="10dp" > 31 32 <TextView 33 android:id="@+id/tv_answer" 34 android:layout_width="wrap_content" 35 android:layout_height="wrap_content" 36 android:layout_gravity="center_vertical" 37 android:text="回答" 38 android:textColor="#000" 39 android:textSize="18sp" /> 40 41 <ImageView 42 android:id="@+id/iv_pic" 43 android:layout_width="wrap_content" 44 android:layout_height="wrap_content" /> 45 </LinearLayout> 46 47 </RelativeLayout>
5.3 框架的搭建




5.4 移植语音识别
【拷贝库】

【拷贝UI图片】

【拷贝权限】

【初始化】

【界面UI的加载】

[临时效果]

5.5 将语音生成的json进行拼接

【拷贝json包】


【写javaBean】

【解析语音】



【两句话合成一句话】其实是一句话,但是语音解析分开了;




【提问和回答的对象的封装】

【对话的数据的填充】




【设置适配器】




【测试】

【去掉分割线】

【添加回答】

[说明]随机回答话语和随机图片;



【效果】

【listView定位到最后一个】不必要滑动

【朗诵语音】


【效果】带有语音朗诵,并且可以直接定位到最后一张;

6.友盟统计
【说明】用户的活跃量统计;第三方平台;

【sdk的下载】













【测试】在真机运行

7.扫描二维码
【说明】扫描二维码使用的是开源的demo;
7.1 二维码扫描的效果



7.2 demo的使用
【说明】源码很多;






8.新闻频道滑动效果Demo
【效果】


【源码实现的说明】使用WindouwManager搞一张图片能够滑动,通过监听移动的位置,使用TransAnimation动画,不断判断位置;
下面的布局是GridView,
浙公网安备 33010602011771号