利用百度语音接口我为女儿写个英语阅读器原来这么简单

今日本来想接昨天的话题,继续说黑客控制手机的事,听到女儿说,英语听力变差了,好吧,今天写个英语朗读器。英语只是出师有名,其实汉语也行,我估计其它语言也行,只不过我不会,没有测试。

利用百度语音接口我为女儿写个英语阅读器原来这么简单

利用百度语音接口我为女儿写个英语阅读器原来这么简单

利用百度语音接口我为女儿写个英语阅读器原来这么简单

利用百度语音接口我为女儿写个英语阅读器原来这么简单

以上是效果图。

说说原理吧。要播放mp3要有什么?第一,要有播放器吧,第二,要有mp3文件吧。

播放器可以调用媒体播放器。

mp3文件恰好百度有个接口:http://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&spd=4&per=5&pit=5&text=" + t3

其中t3就是我们要朗读的字符串。

好吧,开始。

这是启动页。

package com.hx.dzcf;

import android.app.*;

import android.content.*;

import android.os.*;

import android.view.*;

import android.widget.*;

import android.widget.AdapterView.*;

import com.hx.tool.*;

import org.json.*;

import android.net.*;

public class MainActivity extends Activity

{ public ad ad1=null; public JSONArray data=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getData(); ListView l=(ListView) findViewById(R.id.mainListView1); ad1=new ad(this,data); l.setAdapter(ad1); registerForContextMenu(l); ad1.notifyDataSetChanged(); l.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { try { JSONObject js=(JSONObject)data.get(position); String s=js.getString("t3"); Intent it=new Intent(MainActivity.this,A1.class); it.putExtra("t33",s); startActivity(it); } catch (JSONException e) {} //App.ts(t3); } }); } public void o1(View v){ int id=v.getId(); switch(id){ case R.id.mainTextView1: startActivity(new Intent(MainActivity.this,A3.class)); break; } } public void getData(){ JSONObject j1=new JSONObject(); JSONObject j2=new JSONObject(); try { j2.put("data", j1); j2.put("sql", "t44=\\"KM\\""); j2.put("isTS","no"); j2.put("tableName","KM"); j2.put("method","read"); j2.put("dbName",Dir.getdbdir()+"/my.db"); j2=Db.dbq(j2); data=j2.getJSONArray("arr"); } catch (JSONException e) {} } public class ad extends BaseAdapter { private LayoutInflater mInflater; private JSONArray items; public ad(Context context, JSONArray itemsIn) { mInflater = LayoutInflater.from(context); items = itemsIn; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.a11, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.a11TextView1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } try { JSONObject j=(JSONObject)items.get(position); holder.text.setText(j.getString("t3")); } catch (JSONException e) {} return convertView; } private class ViewHolder { TextView text; ImageView icon; } public long getItemId(int position) { return position; } public Object getItem(int position) { int p=0; try { p=items.get(position); } catch (JSONException e) {} return p; } public int getCount() { return items.length(); } }

}

启动页布局。

<linearlayout> <linearlayout> <textview> /<linearlayout> <listview> /<linearlayout>

列表页面如下。

package com.hx.dzcf;

import android.app.*;

import android.content.*;

import android.os.*;

import android.view.*;

import android.view.ContextMenu.*;

import android.widget.*;

import android.widget.AdapterView.*;

import com.hx.tool.*;

import java.io.*;

import org.json.*;

/*

列表

*/

public class A1 extends Activity

{ public JSONArray data=null; public ad ad1=null; private static final int MENU_DELETE = Menu.FIRST; private static final int MENU_RENAME = Menu.FIRST + 1; private static final int MENU_PLAY = Menu.FIRST + 2; public String t33=""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a1); Intent it=getIntent(); t33=it.getStringExtra("t33"); getData(); ListView l=(ListView) findViewById(R.id.a1ListView1); ad1=new ad(this,data); l.setAdapter(ad1); registerForContextMenu(l); ad1.notifyDataSetChanged(); l.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { Mp3p.baiDuPlay(data,position-1); //App.ts(t3); } }); //App.ts(data.toString()); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); AdapterView.AdapterContextMenuInfo info = null; try { info = (AdapterView.AdapterContextMenuInfo) menuInfo; } catch (ClassCastException e) { return; } menu.setHeaderTitle("操作"); menu.add(0, MENU_DELETE, 1, "删除"); //menu.add(0, MENU_RENAME, 2, "命名"); //menu.add(0, MENU_PLAY, 3, "播放"); } /* * */ @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item .getMenuInfo(); int p=info.position; switch (item.getItemId()) { case MENU_DELETE: del(p); show(); return true; default: return super.onContextItemSelected(item); } } private void show(){ getData(); ad1.notifyDataSetChanged(); } public void del(int p){ JSONObject j1=new JSONObject(); JSONObject j2=new JSONObject(); try { JSONObject jo=(JSONObject)data.get(p); String s=jo.getString("t3"); j2.put("data", j1); j2.put("sql", "t3=\\""+s+"\\""); j2.put("isTS","yes"); j2.put("tableName","SJ"); j2.put("method","del"); j2.put("dbName",Dir.getdbdir()+"/my.db"); j2=Db.dbq(j2); } catch (JSONException e) { App.getErrStr(e); } } public void o1(View v){ int id=v.getId(); switch(id){ case R.id.a1TextView1: Intent it2=new Intent(A1.this,A4.class); it2.putExtra("t33",t33); startActivity(it2); finish(); break; case R.id.a1TextView2: Mp3p.stop(); break; } } public void getData(){ JSONObject j1=new JSONObject(); JSONObject j2=new JSONObject(); try { j2.put("data", j1); j2.put("sql", "t2=\\""+t33+"\\""); j2.put("isTS","no"); j2.put("tableName","SJ"); j2.put("method","read"); j2.put("dbName",Dir.getdbdir()+"/my.db"); j2=Db.dbq(j2); data=j2.getJSONArray("arr"); } catch (JSONException e) {} } public class ad extends BaseAdapter { private LayoutInflater mInflater; private JSONArray items; public ad(Context context, JSONArray itemsIn) { mInflater = LayoutInflater.from(context); items = itemsIn; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.a11, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.a11TextView1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } try { JSONObject j=(JSONObject)items.get(position); holder.text.setText(j.getString("t3")); } catch (JSONException e) {} return convertView; } private class ViewHolder { TextView text; ImageView icon; } public long getItemId(int position) { return position; } public Object getItem(int position) { int p=0; try { p=items.get(position); } catch (JSONException e) {} return p; } public int getCount() { return items.length(); } }

}

列表布局

<linearlayout> <linearlayout> <textview> <textview> /<linearlayout> <listview> /<linearlayout>

添加科目程序

package com.hx.dzcf;

import android.app.*;

import android.content.*;

import android.os.*;

import android.view.*;

import android.widget.*;

import com.hx.tool.*;

import org.json.*;

public class A3 extends Activity

{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a4); } public void o1(View v){ int id=v.getId(); switch(id){ case R.id.A4Button1: JSONObject j1=new JSONObject(); JSONObject j2=new JSONObject(); //EditText e1=(EditText)findViewById(R.id.A4EditText1); //EditText e2=(EditText)findViewById(R.id.A4EditText2); EditText e3=(EditText)findViewById(R.id.A4EditText3); try { //j1.put("t1", e1.getText().toString()); //j1.put("t2", e2.getText().toString()); j1.put("t3", e3.getText().toString()); j2.put("data",j1); j2.put("sql",""); j2.put("isTS","yes"); j2.put("tableName","KM"); j2.put("method","tj"); j2.put("dbName",Dir.getdbdir()+"/my.db"); j1=Db.dbq(j2);

e3.setText(""); } catch (JSONException e) { App.getErrStr(e); } break; case R.id.a4Button2: startActivity(new Intent(A3.this,MainActivity.class)); finish(); break; } }

}

添加科目和内容共用布局

<linearlayout> <edittext> <button> <button> /<linearlayout>

适配器Item的布局

<linearlayout> <textview> /<linearlayout>

播放器主程序

package com.hx.tool;

import android.media.*;

import com.hx.dzcf.*;

import java.io.*;

import org.json.*;

public class Mp3p

{ public static int p1=-1; public static MediaPlayer mp=null; public static int isPlay=0; public static void play(String src,final int p,final JSONArray data){ mp = new MediaPlayer(); try { mp.setDataSource(src); mp.prepare(); mp.start(); mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { int p1=p; isPlay=0; baiDuPlay(data,p1); } }); } catch (IllegalArgumentException e) { App.getErrStr(e); } catch (SecurityException e) { App.getErrStr(e); } catch (IllegalStateException e) { App.getErrStr(e); } catch (IOException e) { App.getErrStr(e); } } public static void baiDuPlay(final JSONArray data,final int p){ new Thread(new Runnable(){ @Override public void run(){ try { if(isPlay==0){ isPlay=1; if(p1<0){ p1=p; } p1++; if(p1>=data.length()){ p1=0; } JSONObject js=(JSONObject)data.get(p1); String t3=js.getString("t3"); if(t3.length()<10){ t3="读书郎,一,二,三,开始。"+t3; } String class="lazy" data-original="http://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&spd=4&per=5&pit=5&text=" + t3; File1.writeFile(src); play(src,p,data); } } catch (JSONException e) {} } }).start(); } public static void stop(){ mp.stop(); isPlay=0; }

}

权限我全部写上了

<manifest> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-permission> <uses-feature> <uses-feature> <uses-permission> <application> <activity> <intent-filter> <action> <category> /<intent-filter> /<activity> <activity> <activity> <activity> <activity> <activity> <activity> /<application> /<manifest>

太长了。好了,基本这是这样,还有一个是报错处理的,就不放上去了。如果需要源码,请留言。


分享到:


相關文章: