1

私は Android アプリの仕事をしている学生です。そして、私は解決できない問題を抱えています.Plsは私にいくつかのアドバイスを与えます. 私はビデオ録画の活動をしたいのですが、このコードを使用してそれを行いました。 メディア レコーダーによるビデオ録画 ここに私のコードを示します。他の電話では正常に動作しますが、moto-razr では正常に動作しません。ここでは、HTC 欲望と MOTO razr で撮影した 2 つのビデオを示します。欲望: http://youtu.be/suPF9Hk6iYk razr: http://youtu.be/wLvH7SXdcIs 誰でも私の問題を解決するのを手伝ってもらえますか?

package video.pac;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
public class video extends Activity{

private MediaRecorder recorder;
private Preview mPreview;

boolean flag=false; 
boolean startedRecording=false;
boolean stoppedRecording=false;
boolean key = false;

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
      WindowManager.LayoutParams.FLAG_FULLSCREEN);
  WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

  recorder = new MediaRecorder();
  recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  recorder.setVideoSize(640,480);
  recorder.setVideoFrameRate(20);
  recorder.setVideoEncodingBitRate(3000000);
  recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
  //recorder.setMaxDuration(5000);
  mPreview = new Preview(video.this,recorder);
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  setContentView(mPreview);

 } 

private CountDownTimer mCountDownTimer = new CountDownTimer(9000, 1000) {

    public void onTick(long millisUntilFinished) {}

    public void onFinish() {

        recorder = null;
        System.out.println("stop");
        video.this.finish();
    }
};

class stopThread implements Runnable {   
    public void run() {  

          try {
              mCountDownTimer.start();  
               Thread.sleep(100);    
          } catch (InterruptedException e) {   
               Thread.currentThread().interrupt();   
          }   

    }   
}


class Preview extends SurfaceView implements SurfaceHolder.Callback{
  //Create objects for MediaRecorder and SurfaceHolder.
  SurfaceHolder mHolder;
  MediaRecorder tempRecorder;

  public Preview(Context context,MediaRecorder recorder) {
    super(context);
    tempRecorder=recorder;
    mHolder=getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    // TODO Auto-generated constructor stub
  }

  public Surface getSurface(){
    return mHolder.getSurface();
  }

  public void surfaceCreated(SurfaceHolder holder){

    tempRecorder.setOutputFile("/sdcard/test" + ".3gpp");
    tempRecorder.setPreviewDisplay(mHolder.getSurface());
    try{
      tempRecorder.prepare();
      recorder.start();
     new Thread(new stopThread()).start();

      System.out.println("start");
    } catch (Exception e) {
      tempRecorder.release();
      tempRecorder = null;
    }
  }

  public void surfaceDestroyed(SurfaceHolder holder) {
    if(tempRecorder!=null){
      tempRecorder.stop();
      tempRecorder.release();
      tempRecorder = null;
      System.out.println("release");
    }
  }

  public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {}
}   
}
4

1 に答える 1

0

問題はセキュリティの問題だと思います:

レコーダーのプレビューを設定する必要があります。そうしないと、一部のデバイスは、キャプチャ/プレビューを画面に表示せずにビデオをキャプチャするためのセキュリティ違反と見なします。これをレコーダーの設定に追加してみてください:

 .
 .
 recorder.setPreviewDisplay(mHolder.getSurface());
 .
 .
于 2013-02-26T19:15:11.023 に答える