2012-11-05 45 views
0

我正在嘗試爲android的文本應用寫一個語音。現在,應用程序不會崩潰在模擬器上,但是當我把它上傳到三星Galaxy S 1900我得到日食以下錯誤消息:在手機上Android語音文本在模擬器中工作,但不是在手機上

11-05 17:43:48.814: I/dalvikvm(3092): Could not find method com.example.speechtotext.MainActivity.getActionBar, referenced from method com.example.speechtotext.MainActivity.onCreate 
11-05 17:43:48.818: W/dalvikvm(3092): VFY: unable to resolve virtual method 3036: Lcom/example/speechtotext/MainActivity;.getActionBar()Landroid/app/ActionBar; 
11-05 17:43:48.818: D/dalvikvm(3092): VFY: replacing opcode 0x6e at 0x0009 
11-05 17:43:48.818: D/dalvikvm(3092): VFY: dead code 0x000c-0061 in Lcom/example/speechtotext/MainActivity;.onCreate (Landroid/os/Bundle;)V 
11-05 17:43:48.896: D/AndroidRuntime(3092): Shutting down VM 
11-05 17:43:48.900: W/dalvikvm(3092): threadid=1: thread exiting with uncaught exception (group=0x4001d7d0) 
11-05 17:43:48.900: E/AndroidRuntime(3092): FATAL EXCEPTION: main 
11-05 17:43:48.900: E/AndroidRuntime(3092): java.lang.NoSuchMethodError: com.example.speechtotext.MainActivity.getActionBar 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at com.example.speechtotext.MainActivity.onCreate(MainActivity.java:40) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at android.os.Looper.loop(Looper.java:123) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 
11-05 17:43:48.900: E/AndroidRuntime(3092):  at dalvik.system.NativeStart.main(Native Method) 
11-05 17:44:11.343: I/dalvikvm(3092): threadid=3: reacting to signal 3 
11-05 17:44:12.724: E/dalvikvm(3092): Failed to write stack traces to /data/anr/traces.txt (805 of 2366): Unknown error: 0 
11-05 17:44:22.165: I/Process(3092): Sending signal. PID: 3092 SIG: 9 

固件版本2.2。

在模擬器中運行時,程序只是說模擬器不支持語音,不過沒有崩潰。

這是我的代碼:

package com.example.speechtotext; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.support.v4.app.NavUtils; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
import android.widget.EditText; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 
import android.content.Intent; 
import java.util.Locale; 

import android.content.pm.PackageManager; 
import android.content.pm.ResolveInfo; 
import android.speech.RecognizerIntent; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends Activity implements OnClickListener, 
     OnInitListener { 

    private int MY_DATA_CHECK_CODE = 0; 
    private TextToSpeech myTTS; 
    private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; 

    private ListView mList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
     Button speakButton = (Button) findViewById(R.id.speak); 
     speakButton.setOnClickListener(this); 
     Intent checkTTSIntent = new Intent(); 
     checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE); 

     // Get display items for later interaction 
     Button speakButton2 = (Button) findViewById(R.id.btn_speak); 

     mList = (ListView) findViewById(R.id.list); 

     // Check to see if a recognition activity is present 
     PackageManager pm = getPackageManager(); 
     List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); 
     if (activities.size() != 0) { 
      speakButton2.setOnClickListener(this); 
     } else { 
      speakButton2.setEnabled(false); 
      speakButton2.setText("Recognizer not present"); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    // Indien men op de speakbutton klikt 
    public void onClick(View arg0) { 
     EditText enteredText = (EditText) findViewById(R.id.enter); 
     String words = enteredText.getText().toString(); 
     speakWords(words); 

     if (arg0.getId() == R.id.btn_speak) { 
      startVoiceRecognitionActivity(); 
     } 
    } 

    // Zorgt voor de spraak 
    private void speakWords(String speech) { 
     // myTTS.speak(speech, TextToSpeech.QUEUE_ADD, null); zorgt dat de app 
     // het toevoegt aan de queue zodat het wacht tot de vorige speech 
     // opdracht uitgesproken is 
     myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null); 
    } 

    // Controleren of de data beschikbaar is 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == MY_DATA_CHECK_CODE) { 
      if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
       myTTS = new TextToSpeech(this, this); 
      } else { 
       Intent installTTSIntent = new Intent(); 
       installTTSIntent 
         .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installTTSIntent); 
      } 
     } 

     if (requestCode == VOICE_RECOGNITION_REQUEST_CODE 
       && resultCode == RESULT_OK) { 
      // Fill the list view with the strings the recognizer thought it 
      // could have heard 
      ArrayList<String> matches = data 
        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
      mList.setAdapter(new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, matches)); 
     } 

     super.onActivityResult(requestCode, resultCode, data); 
    } 

    private void startVoiceRecognitionActivity() { 
     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
       RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 
       "Speech recognition demo"); 
     startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
    } 

    // Taal juist zetten en indien er een fout is geeft men een foutboodschap 
    public void onInit(int initStatus) { 
     if (initStatus == TextToSpeech.SUCCESS) { 
      myTTS.setLanguage(Locale.US); 
     } else if (initStatus == TextToSpeech.ERROR) { 
      Toast.makeText(this, "Sorry! Text To Speech failed...", 
        Toast.LENGTH_LONG).show(); 
     } 
    } 

} 

我已經簽了最小API是不高,但Eclipse已經設置到2.2,所以我認爲多數民衆贊成罰款。

有人想法什麼可能是錯誤的或如何調試?

親切的問候,

+2

getActionBar要求API級別11(蜂窩) – njzk2

+0

向我們展示您的xml配置。 –

+0

Mukul Goel,你爲什麼有這樣的精力?我不明白:p你不會感到沮喪嗎? – user1480139

回答

2

的問題是,你嘗試在運行Android 2.2(API級別8)設備使用ActionBar,但ActionBar在API層面增加11

所以,你有兩種基本選項在這裏:

  1. 請勿在您的應用中使用ActionBar
  2. 使用ActionBarSherlock庫,它會將動作欄反向移回到Android 2.x(儘管您仍然需要對代碼進行一些細微的更改,請閱讀ActionBarSherlock的文檔以獲取更多詳細信息)。
+0

謝謝,或者我可以更新到我手機上的最新版本吧? – user1480139

+0

如果您可以將手機的操作系統更新至API級別11或更高級別,則該應用可以在您的手機上使用。但是,如果您將其安裝在運行Android 2.x的設備上,您仍然有問題 - 它會崩潰。爲了保持穩定,您應該在AndroidManifest.xml文件中設置android:minSdkVersion =「11」,以防止應用程序安裝在舊設備上。不過,我建議首選的解決方案是使用'ActionBarSherlock'。 – Tomik

相關問題