2013-06-28 67 views
0

我要開始記錄服務,但是當涉及到操作 它與以下異常failes的Android MediaRecorder(3089):啓動失敗:-38例外

06-28 09:14:47.646: E/MediaRecorder(3089): start failed: -38 
06-28 09:14:47.646: W/System.err(3089): java.lang.IllegalStateException 
06-28 09:14:47.646: W/System.err(3089):  at android.media.MediaRecorder.start(Native Method) 
06-28 09:14:47.646: W/System.err(3089):  at tvbpv.test.EOrderSystem1.RecordService.startRecording(RecordService.java:87) 
06-28 09:14:47.646: W/System.err(3089):  at tvbpv.test.EOrderSystem1.RecordService.onStart(RecordService.java:49) 
06-28 09:14:47.646: W/System.err(3089):  at android.app.Service.onStartCommand(Service.java:438) 
06-28 09:14:47.646: W/System.err(3089):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2371) 
06-28 09:14:47.646: W/System.err(3089):  at android.app.ActivityThread.access$1900(ActivityThread.java:127) 
06-28 09:14:47.646: W/System.err(3089):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1222) 
06-28 09:14:47.646: W/System.err(3089):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-28 09:14:47.646: W/System.err(3089):  at android.os.Looper.loop(Looper.java:137) 
06-28 09:14:47.646: W/System.err(3089):  at android.app.ActivityThread.main(ActivityThread.java:4519) 
06-28 09:14:47.646: W/System.err(3089):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-28 09:14:47.646: W/System.err(3089):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-28 09:14:47.646: W/System.err(3089):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
06-28 09:14:47.646: W/System.err(3089):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561) 
06-28 09:14:47.646: W/System.err(3089):  at dalvik.system.NativeStart.main(Native Method) 

是什麼啓動失敗:-38 06-28 09:14:47.646:W/System.err(3089):java.lang.IllegalStateException是什麼意思?

RecordService.java 


private MediaRecorder recorder; 
private File instanceRecord; 
private boolean recording= false; 
@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 



@Override 
public void onStart(Intent intent, int startId) { 
    startRecording();  
    super.onStart(intent, startId); 
} 



@Override 
public void onDestroy() { 
    stopRecording(); 
    super.onDestroy(); 
} 

private void prepareRecording() 
{ 
    try 
    { 
     recorder.prepare(); 
    } 
    catch(IllegalStateException e) 
    { 
     e.printStackTrace(); 

    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

public void startRecording(){ 

    try { 

    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 

    Date today = Calendar.getInstance().getTime();  
    Format formatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss"); 
    String reportDate = formatter.format(today); 


    File instanceRecordDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "TVB_PV_recordings"); 

    if(!instanceRecordDirectory.exists()){ 
     instanceRecordDirectory.mkdirs(); 
    } 

    instanceRecord = new File(instanceRecordDirectory.getAbsolutePath() + File.separator + reportDate + "_sales_recording.mp4"); 
    if(!instanceRecord.exists()){ 
     instanceRecord.createNewFile(); 
    } 

    recorder.setOutputFile(instanceRecord.getAbsolutePath());   
    prepareRecording(); 
    recorder.start(); 
    recording = true; 

    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void stopRecording() { 
    if (recorder != null) {  
      try { 
      recorder.stop(); 
      } catch(RuntimeException e) { 
       instanceRecord.delete(); //you must delete the outputfile when the recorder stop failed. 
      } finally { 
      recorder.release(); 
      recorder = null; 
      } 
    }     
} 

啓動服務

startService(new Intent(OrderSystemSubmit.this, RecordService.class)); 

其他活動:

stopService(new Intent(OrderSystemSubmit.this, RecordService.class)); 

權限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

我還需要補充的嗎?

回答

0

嘗試OUTPUTFORMAT mybe改變MPEG_2 OR 1

+0

你有什麼解釋,爲什麼會這樣的作品,爲什麼MPEG_4不? (又如何,因爲OutputFormat.MPEG_2或1不存在) – njzk2

+0

代碼中MPEG_4的改變在哪裏? – SRam

相關問題