Android MediaRecorder无法在我的应用中运行我添加了以下代码,但在调用mediarecorder.start()方法时应用崩溃了。 我的录音机类代码是 -
public class RecoedVideoActivity extends Activity implements SurfaceHolder.Callback{
@Override
protected void onDestroy() {
super.onDestroy();
}
private SurfaceHolder surfaceHolder;
private SurfaceView surfaceView;
public MediaRecorder mrec = new MediaRecorder();
private Camera mCamera;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_view);
surfaceView = (SurfaceView) findViewById(R.id.camera_preview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
try {
startRecording();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
menu.add(0, 0, 0, "Start");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
if(item.getTitle().equals("Start")){
try {
startRecording();
mrec.start();
item.setTitle("Stop");
} catch (Exception e) {
String message = e.getMessage();
Log.i(null, "Problem " + message);
mrec.release();
}
}
else if(item.getTitle().equals("Stop")){
try{
if(mrec!=null){
mrec.release();
mrec.release();
mrec = null;
mCamera.lock();
}
item.setTitle("Start");
}
catch(Exception e){
e.printStackTrace();
}
}
return super.onOptionsItemSelected(item);
}
protected void startRecording() throws IOException {
if(mCamera==null)
mCamera = Camera.open();
String filename;
String path;
path= Environment.getExternalStorageDirectory().getAbsolutePath().toString();
Date date=new Date();
filename="/rec"+date.toString().replace(" ", "_").replace(":", "_")+".mp4";
//create empty file it must use
File file=new File(path,filename);
if(file.isFile()){
Toast.makeText(this, "file ", Toast.LENGTH_SHORT).show();
}
mrec = new MediaRecorder();
mCamera.lock();
mrec.setCamera(mCamera);
mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mrec.setAudioSource(MediaRecorder.AudioSource.MIC);
mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mrec.setPreviewDisplay(surfaceHolder.getSurface());
mrec.setOutputFile(path+filename);
mrec.setMaxDuration(10000); //10 sec
mrec.setOnInfoListener(new OnInfoListener() {
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
onStop();
Toast.makeText(getApplicationContext(), "video of 10 sec is completed", Toast.LENGTH_SHORT).show();
}
}
}
);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
Camera.Size cs = sizes.get(0); // You need to choose the most appropriate previewSize for your app. So select one from the list
parameters.setPreviewSize(cs.width, cs.height);
mCamera.setParameters(parameters);
try {
mCamera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
mrec.start();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try{
if(mCamera==null)
mCamera = Camera.open();
try {
mrec.prepare();
;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
catch(Exception ioe){
ioe.printStackTrace(System.out);
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
}
public void onStop(){
mrec.stop();
mrec.release();
mrec = null;
// item.setTitle("Start");
}}
你可以帮我解决录音机中的问题。
记录消息
FATAL EXCEPTION: main
java.lang.IllegalStateException
android.media.MediaRecorder.native_start(Native Method)
android.media.MediaRecorder.start(MediaRecorder.java:727)
at com.android.example.CameraActivity$1.onClick(RecoedVideoActivity.java:168)
android.view.View.performClick(View.java:3571)
android.view.View$PerformClick.run(View.java:14247)
android.os.Handler.handleCallback(Handler.java:605)
android.os.Handler.dispatchMessage(Handler.java:92)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:4517)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
dalvik.system.NativeStart.main(Native Method)
E/Status Code <><><<><><>(6305): cod = 200
答案 0 :(得分:0)
明确许可
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
private MediaRecorder recorder ;
public static final int SAMPLING_RATE = 44100;
在startRecording方法中使用
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setAudioSamplingRate(SAMPLING_RATE);
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Recorder");
try{
if(dir.mkdir()) {
System.out.println("Directory created");
} else {
System.out.println("Directory alreadt exist");
}
}catch(Exception e){
e.printStackTrace();
}
//String str = Environment.getExternalStorageDirectory().getAbsolutePath();
recorder.setOutputFile(dir + "/recorded_" + System.currentTimeMillis() + ".mp3");
try {
recorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
} catch (Exception e) {
e.getMessage();
}