Android 简单的语音捕捉按钮,NullPointerException
Android simple voice capture button, NullPointerException
我正在尝试让自己成为一个简单的录制按钮,用于从用户那里捕获音频。
我找到了指南 here,我正在尝试更改某些内容,但出现错误,我不知道是什么问题。
Logcat 错误:
12-03 18:43:21.773 11093-11093/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ddz.diarioscolastico/com.ddz.diarioscolastico.ActivityRegistrazione}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
at android.app.ActivityThread.access0(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.ddz.diarioscolastico.ActivityRegistrazione.onCreate(ActivityRegistrazione.java:114)
at android.app.Activity.performCreate(Activity.java:5206)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at
还有我修改过的代码
public class ActivityRegistrazione extends Activity {
private static final String LOG_TAG = "AudioRecordTest";
private static String mFileName = null;
//private RecordButton mRecordButton = null;
private MediaRecorder mRecorder = null;
//private PlayButton mPlayButton = null;
private MediaPlayer mPlayer = null;
private void onRecord(boolean start) {
if (start) {
startRecording();
} else {
stopRecording();
}
}
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
}
private void stopRecording() {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
/*class RecordButton extends Button {
boolean mStartRecording = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onRecord(mStartRecording);
if (mStartRecording) {
setText("Stop recording");
} else {
setText("Start recording");
}
mStartRecording = !mStartRecording;
}
};
public RecordButton(Context ctx) {
super(ctx);
setText("Start recording");
setOnClickListener(clicker);
}
}*/
public ActivityRegistrazione() {
//mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
File mFolder = new File(Environment.getExternalStorageDirectory() + "/diarioscolastico");
mFileName = Environment.getExternalStorageDirectory() + "/diarioscolastico";
boolean success = true;
if (!mFolder.exists()) {
success = mFolder.mkdir();
}
if (success) {
// Create an audio file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String audioFileName = "AUDIO_" + timeStamp + "_.3gp";
// Do something on success
mFileName += "/"+ audioFileName ;
} else {
// Do something else on failure
}
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
final Button recButton = (Button) findViewById(R.id.recButton);
recButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
boolean mStartRecording = true;
onRecord(mStartRecording);
if (mStartRecording) {
recButton.setText("Stop recording");
} else {
recButton.setText("Start recording");
}
mStartRecording = !mStartRecording;
}
});
}
@Override
public void onPause() {
super.onPause();
if (mRecorder != null) {
mRecorder.release();
mRecorder = null;
}
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_activity_registrazione, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
问题是该示例使用了一个从 java 创建的按钮,但我需要一个来自 xml 的静态按钮,所以我尝试生成它并使用 ID 搜索它,但是当我启动 activity 应用程序崩溃,错误在 logcat.
一些想法??
我认为您在 onCreate 处理程序上漏掉了一行。
在调用 super.onCreate(...) 之后和搜索视图之前,您应该设置内容,如下所示:
super.onCreate(icicle);
setContentView(R.layout.mylayout);
final Button recButton = (Button) findViewById(R.id.recButton);
其中 mylayout 是与此视图关联并包含 recButton 的布局名称。
我正在尝试让自己成为一个简单的录制按钮,用于从用户那里捕获音频。 我找到了指南 here,我正在尝试更改某些内容,但出现错误,我不知道是什么问题。
Logcat 错误:
12-03 18:43:21.773 11093-11093/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ddz.diarioscolastico/com.ddz.diarioscolastico.ActivityRegistrazione}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
at android.app.ActivityThread.access0(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.ddz.diarioscolastico.ActivityRegistrazione.onCreate(ActivityRegistrazione.java:114)
at android.app.Activity.performCreate(Activity.java:5206)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at
还有我修改过的代码
public class ActivityRegistrazione extends Activity {
private static final String LOG_TAG = "AudioRecordTest";
private static String mFileName = null;
//private RecordButton mRecordButton = null;
private MediaRecorder mRecorder = null;
//private PlayButton mPlayButton = null;
private MediaPlayer mPlayer = null;
private void onRecord(boolean start) {
if (start) {
startRecording();
} else {
stopRecording();
}
}
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
}
private void stopRecording() {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
/*class RecordButton extends Button {
boolean mStartRecording = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onRecord(mStartRecording);
if (mStartRecording) {
setText("Stop recording");
} else {
setText("Start recording");
}
mStartRecording = !mStartRecording;
}
};
public RecordButton(Context ctx) {
super(ctx);
setText("Start recording");
setOnClickListener(clicker);
}
}*/
public ActivityRegistrazione() {
//mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
File mFolder = new File(Environment.getExternalStorageDirectory() + "/diarioscolastico");
mFileName = Environment.getExternalStorageDirectory() + "/diarioscolastico";
boolean success = true;
if (!mFolder.exists()) {
success = mFolder.mkdir();
}
if (success) {
// Create an audio file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String audioFileName = "AUDIO_" + timeStamp + "_.3gp";
// Do something on success
mFileName += "/"+ audioFileName ;
} else {
// Do something else on failure
}
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
final Button recButton = (Button) findViewById(R.id.recButton);
recButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
boolean mStartRecording = true;
onRecord(mStartRecording);
if (mStartRecording) {
recButton.setText("Stop recording");
} else {
recButton.setText("Start recording");
}
mStartRecording = !mStartRecording;
}
});
}
@Override
public void onPause() {
super.onPause();
if (mRecorder != null) {
mRecorder.release();
mRecorder = null;
}
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_activity_registrazione, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
问题是该示例使用了一个从 java 创建的按钮,但我需要一个来自 xml 的静态按钮,所以我尝试生成它并使用 ID 搜索它,但是当我启动 activity 应用程序崩溃,错误在 logcat.
一些想法??
我认为您在 onCreate 处理程序上漏掉了一行。
在调用 super.onCreate(...) 之后和搜索视图之前,您应该设置内容,如下所示:
super.onCreate(icicle);
setContentView(R.layout.mylayout);
final Button recButton = (Button) findViewById(R.id.recButton);
其中 mylayout 是与此视图关联并包含 recButton 的布局名称。