5

アンドロイド2.2で実行されていたSamsung Galaxyタブがあります。私はオーディオとビデオを別々に記録する簡単なプログラムを開発しました。私の銀河のタブでうまくいきました。しかし、私はそれをアンドロイド2.3.3にアップグレードした後、すべてが変更されました。私のコードはその瞬間から作業を停止しました。レイアウト目的のために使用される私のXMLファイルを次に示しファームウェアのアップグレード後にMediaRecorder - コードが動作を停止しました

 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 

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

次のログ出力されます。ここでの行動(:)私のために)この予想外を見せている私のコードです。 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> 

私は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"/> 

に私はroman10みんなのブログから得た例を記録したビデオを、次の権限を使用:Android Video Recording API–Illustrated with an Exampleも働いていました私のアンドロイド2.2でうまくいく。しかし、それは私のアップグレードの結果としても機能しなくなりました。

android 2.3.3で動画を録画する際に欠けているものはありますか?どうすればこの問題を解決できますか?

+0

私は同じ問題があります。 – lukewm

答えて

3

アンドロイドSDKを使用すると、パスをハードコーディングするとき物事がうまくいかないだろうように、彼らのAPIを変更し続ける:

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

APIが今までdirectories.Aにファイルパスを取得するためのより良い方法を変更した場合にアプリが壊れてしまいますそれはAPI関数を使用する:

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

mAudioFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
mAudioFileName += "/audio.amr"; 
関連する問題