4

我正在开发一个android应用程序,只需使用按钮开始和停止录制。 我使用了线程。我创建了三个类..一个开始录音..一个停止录音和主类..使用线程的Android媒体录制

问题是,我可以看到我的手机中的文件,但它是空的,移动给我一个味精“无法播放视频” ...我希望它与线程工作..我不想其他方法..

这是我的代码 主类:

public class MediaRecorderSampleActivity extends Activity { 


    Button start; 
    Button stop ; 
    private MediaRecorder recorder ; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     start = (Button)findViewById(R.id.startbtn); 
     stop = (Button)findViewById(R.id.stopbtn); 
     start.setOnClickListener(new btnClick()); 
     stop.setOnClickListener(new StopbtnClick()); 
     } 



    class btnClick implements View.OnClickListener { 
       public void onClick(View arg0) { 
      Log.i("Media", "Start Clicked..."); 
      Thread startThread = new Thread (new startRe (recorder)); 
      Log.i("Media", "start Thread Created"); 
      startThread.start() ; 
      Log.i("Media", "start Recording"); 

       }   
    } 


    class StopbtnClick implements View.OnClickListener { 
     public void onClick(View arg0) { 
       Log.i("Media", "Stop Clicked..."); 
     // TODO Auto-generated method stub 
      Thread stopThread = new Thread (new stopRecording (recorder)); 
       Log.i("Media", "stop Thread Created"); 
    stopThread.start(); 
    Log.i("Media", "stop Recording"); 
     } 

    } 

     } 

中的startRecording类

public class startRe implements Runnable { 
private MediaRecorder recorder; 


startRe(MediaRecorder r) { 
    Log.i("Media", "start cons"); 
    this.recorder = r ; 

} 
public void run() { 
    // TODO Auto-generated method stub 
    Log.i("Media", "IN RUN start Recording"); 
    startRecording(); 
} 


public void startRecording() { 
    Log.i("Media", "IN Method start Recording"); 
    recorder = new MediaRecorder(); 
    Log.i("Media", "create variable"); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    Log.i("Media", "1"); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    Log.i("Media", "2"); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    Log.i("Media", "3"); 
    recorder.setOutputFile(getFilePath()); 
    try{ 
     Log.i("Media", "prepar"); 
     recorder.prepare(); 
     Log.i("Media", "before"); 
     recorder.start(); 
     Log.i("Media", "after"); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

} 


private String getFilePath() { 
    String filePath = Environment.getExternalStorageDirectory().getPath(); 
    File file = new File(filePath, "MediaRecorderSample"); 

    if(!file.exists()) 
     file.mkdirs(); 

    return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".mp4"); 
} 


} 

的stopClass

public class stopRecording implements Runnable { 
private MediaRecorder recorder ; 

public stopRecording(MediaRecorder recorder2) { 
    Log.i("Media", "Stop in Cos"); 
    // TODO Auto-generated constructor stub 
    try { 
    this.recorder = recorder2 ; } 
    catch (Exception e) 
    {  
     Log.i("Media", "Stop out Cos" + e.getMessage()) ; 
     } 

} 
public void run() { 
    Log.i("Media", "Stop in RUN"); 
    stopRecording(); 
    Log.i("Media", "Stop out of RUN"); 

} 

回答

4

有一个在你如何使用MediaRecorder的对象问题。您需要在活动类来创建对象,然后将对象传递两个Runnable ..

所以,你需要做以下更改:

创建活动类的对象下面的代码:

private MediaRecorder recorder ; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     start = (Button)findViewById(R.id.startbtn); 
     stop = (Button)findViewById(R.id.stopbtn); 
     start.setOnClickListener(new btnClick()); 
     stop.setOnClickListener(new StopbtnClick()); 
     // Create the object in Activity so that both Runnable works on the same object... 
     recorder = new MediaRecorder(); 
     } 

将相同的对象传递给Runnable类,就像您已经在做的那样。

不要建立在startRecording()方法的对象,因为它会创建一个本地对象,并将其分配给不会从stopRecordingRunnable访问的局部变量..

public void startRecording() { 
    Log.i("Media", "IN Method start Recording"); 
    // comment this recorder = new MediaRecorder(); 
    Log.i("Media", "create variable"); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    Log.i("Media", "1"); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    Log.i("Media", "2"); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    Log.i("Media", "3"); 
    recorder.setOutputFile(getFilePath()); 
    try{ 
     Log.i("Media", "prepar"); 
     recorder.prepare(); 
     Log.i("Media", "before"); 
     recorder.start(); 
     Log.i("Media", "after"); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

} 

尝试,让我们知道结果...

+0

Thaanks,它的工作.. – TravellingSalesWoman

+0

很高兴我可以帮助... –