2014-04-20 2 views
0

Так что у меня это очень спартанский вид приложения, основанный на коде из этого wesbiteAndroid App не будет записывать звук на первой кнопке мыши

enter image description here

Цель этого, когда пользователь нажимает запись , он подскажет ему или ей имя файла, а затем запишите звук. Пользователь может записать столько звуков, сколько захочет, пока они не вернутся в главное меню.

Однако, когда я впервые запускаю программу, ничего не произойдет, когда я нажму кнопку записи. Когда я ударил его второй раз, он начнет запись во время подсказки имени.

В чем проблема? В коде я подозреваю, что проблема заключается в том, что я инициализирую строковую переменную, которая содержит имя файла как null, но я сделал это в том случае, если пользователь нажмет на отмену, поэтому программа не будет записывать звук в звуковой файл с именем null , Пользователь дал ему имя в первый раз, когда он попытался запустить программу, не должен пропускать нуль?

Кроме того, не должна ли программа ждать, пока имя не будет установлено до запуска рекордера, по моему коду?

Код:

import java.io.IOException; 


import android.media.MediaRecorder; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.app.ActionBar; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class RecordASound extends Activity { 


    Button start; 
    Button stop; 
    Button mainMenu; 
    private MediaRecorder myRecorder; 
    private String outputFile = null; 
    private String value = null; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_record_asound); 



     start = (Button)findViewById(R.id.Record); 
     start.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       startRecord(v); 
      } 
      }); 

      stop = (Button)findViewById(R.id.StopRecord); 
      stop.setEnabled(false); 
      stop.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       stopRecord(v); 
      } 
      }); 

      mainMenu = (Button)findViewById(R.id.MainMenu); 
      mainMenu.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
        mainMenu(v);  
      } 
      }); 


     // Make sure we're running on Honeycomb or higher to use ActionBar APIs 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      // For the main activity, make sure the app icon in the action bar 
      // does not behave as a button 
      ActionBar actionBar = getActionBar(); 
      actionBar.setHomeButtonEnabled(false); 
     }//end if 

    }//end onCreate 

    public void startRecord(View view){ 

     AlertDialog.Builder alert = new AlertDialog.Builder(this); 

     alert.setTitle("Name of Sound File"); 
     alert.setMessage("Please give your sound file a name."); 

     // Set an EditText view to get user input 
     final EditText input = new EditText(this); 
     alert.setView(input); 

     alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
     value = input.getText().toString(); 

      } 
     }); 

     alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       value = null; 

      } 
     }); 

     alert.show(); 

      //if the user hit cancel on the prompt, back out of the recorder 
     if (value == null){ 
      return; 
     }//end if 
     else{ 
      outputFile = Environment.getExternalStorageDirectory(). 
        getAbsolutePath() + "/" + value + ".3gpp"; 

      myRecorder = new MediaRecorder(); 
      myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
      myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); 
      myRecorder.setOutputFile(outputFile); 


      try { 
        myRecorder.prepare(); 
        myRecorder.start(); 
     } catch (IllegalStateException e) { 
        // start:it is called before prepare() 
        // prepare: it is called after start() or before setOutputFormat() 
          e.printStackTrace(); 
        } catch (IOException e) { 
      // prepare() fails 
        e.printStackTrace(); 
       } 

       start.setEnabled(false); 
       stop.setEnabled(true); 

       Toast.makeText(getApplicationContext(), "Start recording...", 
           Toast.LENGTH_SHORT).show(); 

     }//end else 



    }//end startRecord 

    public void stopRecord(View view){ 
     try { // TODO Auto-generated method stub 
      myRecorder.stop(); 
      myRecorder.release(); 

      myRecorder = null; 

      stop.setEnabled(false); 
      start.setEnabled(true); 

      Toast.makeText(getApplicationContext(), "Stop recording...", 
        Toast.LENGTH_SHORT).show(); 
     } catch (IllegalStateException e) { 

      e.printStackTrace(); 
     } catch (RuntimeException e){ 
      //no valid audio/video data was collected 
      e.printStackTrace(); 

     }//end catch 

    }//end stopRecord 

    public void mainMenu(View view){ 

     startActivity(new Intent(RecordASound.this, MainActivity.class)); 

    }//end mainMenu 


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

}//end class 
+0

Попробуйте инициализировать значение 'value' в' null' в начале функции 'startRecord'. – marven

+0

Это не сработало. Теперь он делает запись не совсем. То, что я закончил, вместо этого инициализировало его пустой строкой в ​​начале, и это будет только null, если вы нажмете отменить. Но теперь он вообще не записывается. – user1768884

+0

Попробуйте поместить все внутри функции setPositiveButton вместо проверки после появления предупреждения. – marven

ответ

1

Поместите код внутри setPositiveButton вместо того, чтобы иметь чек после AlertDialog показан как Диалоги в Android асинхронно.

0

Возможно, у вашей кнопки записи есть андроид: focusableInTouchMode = "true"?

Смежные вопросы