標籤:cocos2d android平台 android開發 應用 跨平台
其實很簡單,不過有些細節需要注意。
關於訊飛語音在android上的應用,大家需要自己去下載SDK,然後按照訊飛語音提供的api在自己的android的Demo上運行成功,那東西也相當的簡單。
然後,大家也需要把自己的cocos2dx項目在android 上部署起來,這些網上資料很多,也不一一解釋,後續我也會做出對應的總結。這裡不多說。
OK,廢話不多說,直接上代碼
思路就是,通過cocos2dx的JNIhelper類實現C++對Java的調用,然後實現語音功能
廢話不多說:
直接上代碼:這裡我在項目中直接把對語音的調用用了一個voice類
Voice.h
#ifndef _VOICE_H__#define _VOICE_H__#include "cocos2d.h"USING_NS_CC;/*** 添加聲音*/void onVoice(const char * data);#endif
Voice.cpp
#include "Voice.h"#include "cocos2d.h"#include "IconvString.h"#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include "jni.h"#include "platform/android/jni/JniHelper.h"#endif USING_NS_CC;void onVoice(const char *data){#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)JniMethodInfo jmi;//java的類名const char * jniClass = "org/cocos2dx/cpp/AppActivity";//擷取java部分的方法,詳細參數請參考JniMethodInfo類的源碼,參數分別為,類對象,java類,java類的方法,方法的參數和傳回值,V表示void類型傳回值(即無傳回值,括弧裡面的表示參數,參數是一個字串【詳見JNI簽名規範】)bool isHave = JniHelper::getStaticMethodInfo(jmi,jniClass,"onVoiceStart","(Ljava/lang/String;)V");if (isHave){//轉換字串以及格式jstring jdata = jmi.env->NewStringUTF(GBKToUTF8(data));//調用java的方法,前面2個參數是固定的,後面的參數是在java的方法中的參數jmi.env->CallStaticVoidMethod(jmi.classID, jmi.methodID, jdata);}#endif }
Java 端的代碼如下(附帶百度廣告的實現代碼)
package org.cocos2dx.cpp;import org.cocos2dx.lib.Cocos2dxActivity;import android.app.ActionBar.LayoutParams;import android.os.Bundle;import android.util.Log;import android.widget.RelativeLayout;import com.baidu.mobads.AdView;import com.iflytek.cloud.SpeechConstant;import com.iflytek.cloud.SpeechError;import com.iflytek.cloud.SpeechSynthesizer;import com.iflytek.cloud.SpeechUtility;import com.iflytek.cloud.SynthesizerListener;public class AppActivity extends Cocos2dxActivity {// 語音+安裝助手類@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SpeechUtility.createUtility(AppActivity.this, "appid=53bb48d3");showAds();}/** * C++ 調用方法,實現語音播報 * @param value 要播報的內容 * @param person 聲音的角色,建議用小女孩 vinn * @param voiceSpeed 聲音的語速,建議45 * @param voicePitch 音調 ,建議 55 * @param voiceVolume 音量 建議 100 *///String value,String person,String voiceSpeed,String voicePitch,String voiceVolumepublic static void onVoiceStart(final String value)throws Exception{SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(AppActivity.getContext(), null);mTts.setParameter(SpeechConstant.VOICE_NAME,"vinn");//設定語速mTts.setParameter(SpeechConstant.SPEED,"45");//設定音調mTts.setParameter(SpeechConstant.PITCH,"55");//設定音量mTts.setParameter(SpeechConstant.VOLUME,"100");//設定播放器音頻流類型mTts.setParameter(SpeechConstant.STREAM_TYPE, "2");mTts.startSpeaking(value, mTtsListener);}private static SynthesizerListener mTtsListener = new SynthesizerListener() {@Overridepublic void onSpeakBegin() {}@Overridepublic void onSpeakPaused() {}@Overridepublic void onSpeakResumed() {}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos,String info) {}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {}@Overridepublic void onCompleted(SpeechError error) {}};//顯示廣告private void showAds(){ //相對定位布局 RelativeLayout layout = new RelativeLayout(this); //給廣告地區的寬高屬性定義 addContentView(layout,new LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT)); //把廣告層添加到當前介面上 AdView adView = new AdView(this); //大小 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT); //位置 layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); //添加進項目中進行顯示 layout.addView(adView,layoutParams ); }}
調用語言的代碼:
onVoice(“你是我的小蘋果”);
在外部使用別忘了引入標頭檔哦
#include "Voice/Voice.h"
這樣就可以實現了,百度廣告部分,大家有興趣去研究下,也是需要sdk的哦