5

Mam kartę Samsung Galaxy, która działała na Android 2.2. Opracowałem prosty program do oddzielnego nagrywania audio i wideo. To działało dobrze na mojej karcie galaktyk. Ale wszystko zmieniło się po aktualizacji do wersji 2.3.3. Mój kod przestał działać od tego momentu. Tu jest mój kod, który pokazuje ten nieoczekiwany (dla mnie :)) zachowania:MediaRecorder - kod przestał działać po aktualizacji oprogramowania układowego

// 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; 
    } 
} 

Poniżej znajduje się wyjście dziennika:

 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 

Poniżej moje pliki XML wykorzystywanych do celów układu. 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> 

użyłem następujące uprawnienia 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"/> 

nagranie wideo przykład dostałem od roman10 facetów blogu: Android Video Recording API–Illustrated with an Example również pracę dobrze z moim Android 2.2. Ale to również przestało działać w wyniku mojej aktualizacji.

Czy jest coś czego brakuje mi podczas nagrywania wideo z systemem Android 2.3.3. Jak mogę rozwiązać ten problem?

+0

Mam ten sam problem. – lukewm

Odpowiedz

3

Android SDK wciąż się zmienia swoje API więc rzeczy może pójść źle, gdy hardcode ścieżkę:

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

Twoja aplikacja zostanie przerwane, jeśli kiedykolwiek API powoduje zmianę directories.A lepszy sposób, aby uzyskać ścieżkę do pliku użyć funkcji API:

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

mAudioFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
mAudioFileName += "/audio.amr"; 
Powiązane problemy