Так что у меня это очень спартанский вид приложения, основанный на коде из этого wesbiteAndroid App не будет записывать звук на первой кнопке мыши
Цель этого, когда пользователь нажимает запись , он подскажет ему или ей имя файла, а затем запишите звук. Пользователь может записать столько звуков, сколько захочет, пока они не вернутся в главное меню.
Однако, когда я впервые запускаю программу, ничего не произойдет, когда я нажму кнопку записи. Когда я ударил его второй раз, он начнет запись во время подсказки имени.
В чем проблема? В коде я подозреваю, что проблема заключается в том, что я инициализирую строковую переменную, которая содержит имя файла как 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
Попробуйте инициализировать значение 'value' в' null' в начале функции 'startRecord'. – marven
Это не сработало. Теперь он делает запись не совсем. То, что я закончил, вместо этого инициализировало его пустой строкой в начале, и это будет только null, если вы нажмете отменить. Но теперь он вообще не записывается. – user1768884
Попробуйте поместить все внутри функции setPositiveButton вместо проверки после появления предупреждения. – marven