在JSON listview中实现Text to speech

时间:2013-12-15 09:34:55

标签: android text-to-speech

我的列表视图需要帮助。我尝试在列表视图中实现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损坏所以我不得不重新安装它。

0 个答案:

没有答案