我的列表视图需要帮助。我尝试在列表视图中实现TTS但是当我运行程序时它不会说话并会自动关闭应用程序。我仍然是编码的初学者,所以我不知道该怎么做。
这是我的基于learn2crack的程序:
档案MainActivity.java
:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import learn2crack.listview.library.JSONParser;
public class MainActivity extends Activity implements TextToSpeech.OnInitListener {
ListView list;
TextView html;
Button Btngetdata;
ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();
// URL to get JSON Array
private static String url = "http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=New%20York,NY&sensor=false";
// JSON Node Names
private static final String TAG_OS = "routes";
private static final String TAG_HTM = "html_instructions";
private TextToSpeech myTTS;
private int MY_DATA_CHECK_CODE = 0;
JSONArray android = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oslist = new ArrayList<HashMap<String, String>>();
Btngetdata = (Button)findViewById(R.id.getdata);
Btngetdata.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new JSONParse().execute();
}
});
}
private class JSONParse extends AsyncTask<String, String, JSONObject> {
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
html = (TextView) findViewById(R.id.html_instruction);
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Getting Data ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected JSONObject doInBackground(String... args) {
JSONParser jParser = new JSONParser();
// getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url);
return json;
}
@Override
protected void onPostExecute(JSONObject json) {
pDialog.dismiss();
try {
// getting JSON Array from URL
android = json.getJSONArray(TAG_OS);
for (int x = 0; x < android.length(); x++) {
JSONArray legs = android.getJSONObject(x).getJSONArray("legs");
JSONObject distance = legs.getJSONObject(0).getJSONObject("distance");
JSONObject duration = legs.getJSONObject(0).getJSONObject("duration");
JSONArray steps = legs.getJSONObject(0).getJSONArray("steps");
for (int j = 0; j < steps.length(); j++) {
String html_instructions = steps.getJSONObject(j).getString("html_instructions");
String s = html_instructions.replaceAll("<(\"[^\"]*\"|'[^']*'|[^'\">])*>", " ");
// adding value HashMap key => value
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_HTM, s);
oslist.add(map);
list = (ListView)findViewById(R.id.list);
ListAdapter adapter = new SimpleAdapter(MainActivity.this, oslist, R.layout.list_v, new String[] {TAG_HTM}, new int [] {R.id.html_instruction});
list.setAdapter(adapter);
Intent checkTTSIntent = new Intent();
checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "You Clicked at "+oslist.get(+position).get("name"), Toast.LENGTH_SHORT).show();
String words = html.getText().toString();
speakWords(words);
}
private void speakWords(String speech) {
// speak straight away
myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null);
}
});
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// the user has the necessary data - create the TTS
myTTS = new TextToSpeech(this,(OnInitListener) this);
} else {
// no data - install it now
Intent installTTSIntent = new Intent();
installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installTTSIntent);
}
}
}
public void onInit(int initStatus) {
// check for successful instantiation
if (initStatus == TextToSpeech.SUCCESS) {
if (myTTS.isLanguageAvailable(Locale.US) == TextToSpeech.LANG_AVAILABLE)
myTTS.setLanguage(Locale.US);
} else if (initStatus == TextToSpeech.ERROR) {
Toast.makeText(this, "Sorry! Text To Speech failed...", Toast.LENGTH_LONG).show();
}
}
}
档案JSONParser.java
:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public JSONObject getJSONFromUrl(String url) {
// making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
档案activity_main.xml
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/getdata" />
<Button
android:id="@+id/getdata"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="23dp"
android:text="Get Data" />
</RelativeLayout>
档案list_v.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/html_instruction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
这是我的logcat:
logcat:
12-15 03:39:2.606: E/MessageQueue-JNI(825): java.lang.NullPointerException
12-15 03:39:23.606: E/MessageQueue-JNI(825): at learn2crack.listview.MainActivity$JSONParse$1.onItemClick(MainActivity.java:165)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
12-15 03:39:23.606: E/MessageQueue-JNI(825):at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
12-15 03:39:23.606: E/MessageQueue-JNI(825):at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
12-15 03:39:23.606: E/MessageQueue-JNI(825):at android.widget.AbsListView.onTouchEvent(AbsListView.java:3475)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.View.dispatchTouchEvent(View.java:7384)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2205)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1940)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.app.Activity.dispatchTouchEvent(Activity.java:2424)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.View.dispatchPointerEvent(View.java:7564)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.os.MessageQueue.nativePollOnce(Native Method)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.os.MessageQueue.next(MessageQueue.java:132)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.os.Looper.loop(Looper.java:124)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at android.app.ActivityThread.main(ActivityThread.java:5103)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at java.lang.reflect.Method.invokeNative(Native Method)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at java.lang.reflect.Method.invoke(Method.java:525)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-15 03:39:23.606: E/MessageQueue-JNI(825): at dalvik.system.NativeStart.main(Native Method)
12-15 03:39:23.606: D/AndroidRuntime(825): Shutting down VM
12-15 03:39:23.616: W/dalvikvm(825): threadid=1: thread exiting with uncaught exception (group=0x41465700)
12-15 03:39:23.626: E/AndroidRuntime(825): FATAL EXCEPTION: main
12-15 03:39:23.626: E/AndroidRuntime(825): java.lang.NullPointerException
12-15 03:39:23.626: E/AndroidRuntime(825): at learn2crack.listview.MainActivity$JSONParse$1.onItemClick(MainActivity.java:165)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3475)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.View.dispatchTouchEvent(View.java:7384)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2205)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1940)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
12-15 03:39:23.626: E/AndroidRuntime(825): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966)
12-15 03:39:23.626: E/AndroidRuntime(825): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.app.Activity.dispatchTouchEvent(Activity.java:2424)
12-15 03:39:23.626: E/AndroidRuntime(825): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.View.dispatchPointerEvent(View.java:7564)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.os.MessageQueue.nativePollOnce(Native Method)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.os.MessageQueue.next(MessageQueue.java:132)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.os.Looper.loop(Looper.java:124)
12-15 03:39:23.626: E/AndroidRuntime(825): at android.app.ActivityThread.main(ActivityThread.java:5103)
12-15 03:39:23.626: E/AndroidRuntime(825): at java.lang.reflect.Method.invokeNative(Native Method)
12-15 03:39:23.626: E/AndroidRuntime(825): at java.lang.reflect.Method.invoke(Method.java:525)
12-15 03:39:23.626: E/AndroidRuntime(825): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-15 03:39:23.626: E/AndroidRuntime(825): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-15 03:39:23.626: E/AndroidRuntime(825): at dalvik.system.NativeStart.main(Native Method)
对不起延迟可能adb损坏所以我不得不重新安装它。