2013-03-19 13 views
9

Sto costruendo un registratore audio che deve riprodurre il suono registrato. Sto incontrando molti problemi nel riprodurre l'audio. So che il file esiste perché l'ho isolato in una cartella sulla mia scheda SD, ma per qualche motivo non può riprodurlo.Preparazione Android MediaPlayer non riuscita: stato = 0x1

Ecco il mio codice:

public class RecorderEditActivity extends SherlockActivity implements 
    DatabaseHelper.MetadataListener { 

private long position; 

private Button playButton = null; 
private TextView date = null; 
private EditText title = null; 
private EditText notes = null; 
private Button saveButton = null; 

private MediaPlayer mediaPlayer = null; 
private boolean isPlaying = false; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.edit_item); 

    position = getIntent().getExtras().getLong(DatabaseHelper.KEY_ROWID); 

    playButton = (Button) findViewById(R.id.play); 
    date = (TextView) findViewById(R.id.recording_date); 
    title = (EditText) findViewById(R.id.edit_title); 
    notes = (EditText) findViewById(R.id.edit_notes); 
    saveButton = (Button) findViewById(R.id.save_edit_button); 

    mediaPlayer = new MediaPlayer(); 

    DatabaseHelper.getInstance(getApplicationContext()).getMetadataAsync(
      position, this); 

    playButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (!isPlaying) { 
       playButton.setText(R.string.stop_text); 
       try { 
        mediaPlayer = new MediaPlayer(); 
        mediaPlayer 
          .setDataSource("sdcard/test/" 
            + date.toString() + ".3gp"); 
        mediaPlayer.prepare(); 
        mediaPlayer.start(); 
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
         @Override 
         public void onCompletion(MediaPlayer mp) { 
          mp.stop(); 
         } 
        }); 
       } catch (Exception e) { 
        Log.e(e.getClass().getName(), e.getMessage(), e); 
       } 
      } else { 
       playButton.setText(R.string.play_text); 
       mediaPlayer.release(); 
      } 
      isPlaying = !isPlaying; 
     } 
    }); 

Qui ci sono gli errori da LogCat:

03-20 00:33:40.963: E/MediaPlayer(21268): error (1, -2147483648) 
03-20 00:33:40.963: E/java.io.IOException(21268): Prepare failed.: status=0x1 
03-20 00:33:40.963: E/java.io.IOException(21268): java.io.IOException: Prepare failed.: status=0x1 
03-20 00:33:40.963: E/java.io.IOException(21268): at android.media.MediaPlayer.prepare(Native Method) 
03-20 00:33:40.963: E/java.io.IOException(21268): at com.packagename.soundrecorder.RecorderEditActivity$1.onClick(RecorderEditActivity.java:56) 
03-20 00:33:40.963: E/java.io.IOException(21268): at android.view.View.performClick(View.java:4204) 
03-20 00:33:40.963: E/java.io.IOException(21268): at android.view.View$PerformClick.run(View.java:17355) 
03-20 00:33:40.963: E/java.io.IOException(21268): at android.os.Handler.handleCallback(Handler.java:725) 
03-20 00:33:40.963: E/java.io.IOException(21268): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-20 00:33:40.963: E/java.io.IOException(21268): at android.os.Looper.loop(Looper.java:137) 
03-20 00:33:40.963: E/java.io.IOException(21268): at android.app.ActivityThread.main(ActivityThread.java:5041) 
03-20 00:33:40.963: E/java.io.IOException(21268): at java.lang.reflect.Method.invokeNative(Native Method) 
03-20 00:33:40.963: E/java.io.IOException(21268): at java.lang.reflect.Method.invoke(Method.java:511) 
03-20 00:33:40.963: E/java.io.IOException(21268): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-20 00:33:40.963: E/java.io.IOException(21268): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-20 00:33:40.963: E/java.io.IOException(21268): at dalvik.system.NativeStart.main(Native Method) 

Speriamo che qualcuno può aiutarmi a interpretare e risolvere questo problema. Ho fatto un sacco di ricerche e niente di ciò che faccio aiuta. Grazie :)

+2

Nel codice 'oggetto mediaPlayer' viene creato due volte vale a dire una volta al di fuori dei loop e poi in' funzione di onClick'. Hai provato a rimuovere l'oggetto 'mediaPlayer' prima della chiamata' getInstance'? – Ganesh

+0

per favore pubblica il file che stai cercando di riprodurre –

+2

hai nel tuo file manifest? –

risposta

7

Ho capito: Errori stupidi come al solito. Ho dimenticato di aggiungere il permesso di lettura memoria esterna, e devo ringraziare Vasily per questa correzione a causa del tuo commento sopra. L'altra cosa è che non ho chiamato getText() sulla mia data TextView, quindi non ha impostato correttamente il nome del file.

+0

Potresti accettare questo come risposta valida per favore. Grazie. – shkschneider

3

Penso che si sta affrontando il problema a causa di un DataSource errato impostato su MediaPlayer. Potete per favore tentare la setDataSource con la seguente modifica

mediaPlayer.setDataSource("file://sdcard/test/" 
      + date.toString() + ".3gp"); 

Penso che con questo cambiamento, il codice dovrebbe funzionare bene

EDIT: prega di controllare questo post MediaPlayer Preparing Failed per maggiori dettagli sul motivo dietro anteponendo file:// al tuo nome di file.

1

spero seguente codice vi aiuterà:

String soundPath = Environment.getExternalStorageDirectory().getPath() + "test/" + date.toString() + ".mp3"; 
mediaPlayer.setDataSource(soundPath);