2013-08-07 9 views
5
import java.io.BufferedReader; 

public class Main extends Activity implements SurfaceHolder.Callback, 
     MediaPlayer.OnCompletionListener, View.OnClickListener, OnInitListener { 

    String SrcPath = ""; 
    MediaPlayer mp; 
    SurfaceView mSurfaceView; 
    private SurfaceHolder holderrrr; 
    Boolean play = false; 
    String t_alarm1 = "alarm.xml", t_alarm2 = "alarm2.xml", text; 

    // TextToSpeach 
    private TextToSpeech mText2Speech; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
       .permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     addListenerOnButton(); 
     mText2Speech = new TextToSpeech(Main.this, Main.this); 

    } 

    // menü 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 

     case R.id.action_settings: { 
      Intent myIntent = new Intent(this, menu.class); 
      Main.this.startActivity(myIntent); 
      return true; 
     } 

     } 

     return true; 
    } 

    // kilépésfigyelő 

    private static final long DOUBLE_PRESS_INTERVAL = 2000000000;// 2 másodperc 
    private long lastPressTime; 

    @Override 
    public void onBackPressed() { 
     Toast.makeText(Main.this, getString(R.string.kilepes_dupla), 
       Toast.LENGTH_SHORT).show(); 
     long pressTime = System.nanoTime(); 
     if (pressTime - lastPressTime <= DOUBLE_PRESS_INTERVAL) { 
      // this is a double click event 
      System.exit(0); 

     } 
     lastPressTime = pressTime; 

    } 

    public void onInit(int status) { 

     if (status == TextToSpeech.SUCCESS) { 
      mText2Speech.setLanguage(Locale.getDefault()); // alaértelmezett 
                  // nyelv a TtS-hez 
     } 

    } 

    private void addListenerOnButton() { 
     final Button button5 = (Button) findViewById(R.id.button5); 


        button5.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // Perform action on click 
       if (play) { 
        try{ 
         mp.stop(); 
         mp.release(); 
         mp = null; 
        }catch(Exception e){ 

        } 

        button5.setText("Start"); 
        play = false; 

       } else { 
        try { 
         mp = new MediaPlayer(); 
         mSurfaceView = (SurfaceView) findViewById(R.id.surface); 
         holderrrr = mSurfaceView.getHolder(); 
         play = true; 
         button5.setText("Stop"); 
         surfaceCreated(holderrrr); 
        } catch (IllegalArgumentException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (SecurityException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IllegalStateException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

      } 
     }); 

    }// addlistener vége 


    public void surfaceCreated(SurfaceHolder holder) { 

     mp.setDisplay(holder); 

     holder = mSurfaceView.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     try { 
      mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mp) { 

        mp.stop(); 
        mp.release(); 
        Toast.makeText(Main.this, 
          "A videó lejátszás befejeződött!", 
          Toast.LENGTH_SHORT).show(); 
        // button5.setText("Start"); 
        //play = false; 


       } 
      }); 
      mp.setDataSource(SrcPath); 
      mp.prepare(); 

     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     // Get the dimensions of the video 
     // int videoWidth = mp.getVideoWidth(); 
     // int videoHeight = mp.getVideoHeight(); 

     // Get the width of the screen 
     // int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); 

     // Get the SurfaceView layout parameters 
     android.view.ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams(); 

     // Set the width of the SurfaceView to the width of the screen 
     // lp.width = screenWidth; 
     lp.width = 420; 

     // Set the height of the SurfaceView to match the aspect ratio of the 
     // video 
     // be sure to cast these as floats otherwise the calculation will likely 
     // be 0 
     // lp.height = (int) (((float) videoHeight/(float) videoWidth) * 
     // (float) screenWidth); 
     lp.height = 390; 

     // Commit the layout parameters 
     mSurfaceView.setLayoutParams(lp); 

     // Start video 
     mp.start(); 
    } 


      } 



     } 

działa poprawnie na Android 4.1.2 na Galaxy S3, ale daje mi komunikat o błędzie, który jest w tytule. i nie pokazuje pierwszego 3-sekundowego wideo ... proszę o poradę lub rozwiązanie tego problemu, ponieważ nie mam pojęcia, jak pozbyć się tego rodzaju błędu.Pomijane ramki. Aplikacja może wykonywać zbyt wiele pracy nad głównym wątkiem "błąd na Androidzie 4.3 nexus 7

+0

Czy wiesz, dlaczego tak się dzieje? Mam podobny problem tylko na kilku urządzeniach –

Odpowiedz

0

W prostych słowach ten błąd oznacza, że prosi system Android, aby wykonał zbyt wiele pracy nad głównym wątkiem tej konkretnej aplikacji. Istnieje kilka dobrych ogólnych odpowiedzi dotyczące tego błędu, po jednym dobrym przykładem jest:

https://stackoverflow.com/a/21126690/334402

dla konkretnego przykładu, może być po prostu prosząc go robić zbyt dużo pracy wideo powiązane, co jest bardzo procesor głodny, na główny wątek. Warto byłoby patrząc na „przygotowanie” metody na przykład jeśli używasz transmisjami źródła, należy rozważyć użycie prepareAsynch - patrz niżej z Androidem dokumentacji:

public void prepareAsync()

dodanej w Poziom API 1 Asynchronicznie przygotowuje odtwarzacz do odtwarzania. Po ustawieniu źródła danych i powierzchni wyświetlania należy wykonać , wywołanie metody prepare() lub prepareAsync(). W przypadku strumieni powinieneś zadzwonić pod numer prepareAsync(), który natychmiast zwraca, zamiast blokować, dopóki nie zostanie buforowana wystarczająca ilość danych.

Jednym z powodów może być widząc problemy na Nexusa 7, a nie na Galaxy 3 jest to, że Nexus ma znacznie większy ekran i źródło wideo mogą oferować różne kodowania wideo dla różnych urządzeń wielkości - te większe prawdopodobnie wymaga więcej przetwarzania do dekodowania i renderowania.

Powiązane problemy