5

Tôi có tab galaxy galaxy đang chạy trên Android 2.2. Tôi đã phát triển một chương trình đơn giản để ghi lại âm thanh và video một cách riêng biệt. Nó hoạt động tốt trên tab thiên hà của tôi. Nhưng, mọi thứ đã thay đổi sau khi tôi nâng cấp nó lên android 2.3.3. Mã của tôi ngừng hoạt động từ thời điểm đó. Đây là mã của tôi được thể hiện bất ngờ này (đối với tôi :)) hành vi:MediaRecorder - mã ngừng hoạt động sau khi nâng cấp firmware

// import statements 

public class CameraPreview extends Activity implements SurfaceHolder.Callback { 
    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 
    boolean previewing = false; 
    LayoutInflater controlInflater = null; 
    Button recordButton; 

    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.camera); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     surfaceView = (SurfaceView) findViewById(R.id.camerapreview); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     controlInflater = LayoutInflater.from(getBaseContext()); 
     View viewControl = controlInflater.inflate(R.layout.control, null); 
     LayoutParams layoutParamsControl = new LayoutParams(
       LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     this.addContentView(viewControl, layoutParamsControl); 

     recordButton = (Button)viewControl.findViewById(R.id.start_recording); 
     recordButton.setOnClickListener(new View.OnClickListener() {    
      public void onClick(View v) { 
       startRecording(); 
      } 
     }); 

    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     if (previewing) { 
      camera.stopPreview(); 
      previewing = false; 
     } 

     if (camera != null) { 
      try { 
       camera.setPreviewDisplay(surfaceHolder); 
       camera.startPreview(); 
       previewing = true; 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     camera = Camera.open(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
     previewing = false; 
    } 

    private void startRecording() { 
     try { 
      stopPreview(); 

      Thread video = new Thread(new Runnable() { 
       public void run() { 
        videoRecorder = new MediaRecorder(); 
        videoRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); 
        videoRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
        videoRecorder.setOutputFormat(2); 
        videoRecorder.setVideoEncodingBitRate(56 * 8 * 1024); 
        videoRecorder.setVideoSize(176, 144); 
        videoRecorder.setVideoFrameRate(12); 
        videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
        videoRecorder.setOutputFile("/sdcard/video.m4e"); 
        try { 
         videoRecorder.prepare(); 
        } catch (IllegalStateException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        videoRecorder.start(); 
       } 
      }); 
      video.start(); 

      Thread audio = new Thread(new Runnable() {    
       public void run() { 
        audioRecorder = new MediaRecorder(); 
        audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
        audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); 
        audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
        audioRecorder.setOutputFile("/sdcard/audio.amr"); 
        try { 
         audioRecorder.prepare(); 
        } catch (IllegalStateException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        audioRecorder.start(); 
       } 
      }); 
      audio.start(); 
     } catch (Exception e) { 
      Log.e("streamer", "Unable to start recording", e); 
     } 
    } 

    private void stopPreview() { 
     if (camera == null) { 
      throw new RuntimeException();   
     } 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 
} 

Sau đây là các dữ liệu ghi nhận:

 PID  TAG    MESSAGE 

D 75  CameraHardwareSec MemoryHeapBase(fd(27), size(5760128), width(800), height(600)) 
E 75  AuthorDriver  Command 13 completed with error -17 
E 7169 MediaRecorder  prepare failed: -17 
W 7169 System.err   java.io.IOException: prepare failed. 
W 7169 System.err   at android.media.MediaRecorder._prepare(Native Method) 
W 7169 System.err   at android.media.MediaRecorder.prepare(MediaRecorder.java:592) 
W 7169 System.err   at com.video.streamer.view.CameraPreview$2.run(CameraPreview.java:121) 
W 7169 System.err   at java.lang.Thread.run(Thread.java:1019) 
E 7169 MediaRecorder  start called in an invalid state: 0 
W 7169 dalvikvm   threadid=10: thread exiting with uncaught exception (group=0x40015578) 
E 7169 AndroidRuntime  FATAL EXCEPTION: Thread-11 
E 7169 AndroidRuntime  java.lang.IllegalStateException 
E 7169 AndroidRuntime  at android.media.MediaRecorder.start(Native Method) 
E 7169 AndroidRuntime  at com.video.streamer.view.CameraPreview$2.run(CameraPreview.java:127) 
E 7169 AndroidRuntime  at java.lang.Thread.run(Thread.java:1019) 
W 118  ActivityManager Force finishing activity com.video.streamer.view/.CameraPreview 

Sau đây là file XML của tôi sử dụng cho mục đích bố trí. camera.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<SurfaceView 
    android:id="@+id/camerapreview" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    /> 
</LinearLayout> 

control.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="bottom" 
    > 
<Button 
    android:id="@+id/start_recording" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text=" * Start Recording" 
    android:layout_gravity="right" 
    android:layout_margin="10px" 
    /> 
</LinearLayout> 

Tôi đã sử dụng các điều khoản sau đây trên AndroidManifest.xml

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

Một ghi dụ video tôi nhận được từ blog của kẻ roman10: Android Video Recording API–Illustrated with an Example cũng đang làm việc tốt với android 2.2 của tôi. Nhưng, điều đó cũng ngừng hoạt động do nâng cấp của tôi.

Có bất kỳ điều gì tôi bị thiếu khi quay video với android 2.3.3. Làm thế nào tôi có thể giải quyết vấn đề này?

+0

Tôi có cùng một vấn đề. – lukewm

Trả lời

3

SDK Android tiếp tục thay đổi API của họ để mọi thứ sẽ đi sai khi bạn hardcode đường dẫn:

videoRecorder.setOutputFile("/sdcard/video.m4e");//or 
audioRecorder.setOutputFile("/sdcard/audio.amr"); 

Ứng dụng của bạn sẽ bị phá vỡ nếu API bao giờ thay đổi directories.A cách tốt hơn để có được những đường dẫn tập tin nó để sử dụng chức năng API:

mVideoFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
mVideoFileName += "/video.m4e"; 

mAudioFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
mAudioFileName += "/audio.amr"; 
Các vấn đề liên quan