代码之家  ›  专栏  ›  技术社区  ›  hwrdprkns

将视频录制到Android上的外部SD卡

  •  2
  • hwrdprkns  · 技术社区  · 14 年前

    我正在尝试将视频录制到外部SD卡。但是,每当我尝试准确地记录数据时——我总是得到java.io.fileNotFound异常。我想知道是否有人知道任何教程或可以帮助纠正我的代码。

    这是试图录制视频的类

    public class VideoActivity extends Activity {
    
    private SurfaceView preview;
    private SurfaceHolder previewHolder;
    private String locationName;
    private String filepath;
    private File video;
    
    public void onCreate(Bundle videocawk) {
        super.onCreate(videocawk);
        setContentView(R.layout.video_layout);
        setSurface();
        locationName = getIntent().getStringExtra("locationName");
        filepath = getFilePath(locationName);
        try {
            MediaRecorder r = getMediaRecorder(filepath, previewHolder
                    .getSurface());
            setSurfaceCallback(preview,r);
            setButtonListeners(r);
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    private String getFilePath(String locName) {
        String dir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String add = "/test/data/video/";
        String name = locName + "--1";
        String total = dir + add + name;
        video = new File(total);
        return total;
    }
    
    private void setSurface() {
        preview = (SurfaceView) findViewById(R.id.preview);
        previewHolder = preview.getHolder();
        previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    
    private void setButtonListeners(final MediaRecorder r) {
        Button start = (Button) findViewById(R.id.start_video);
        Button end = (Button) findViewById(R.id.stop_video);
    
        start.setOnClickListener(new View.OnClickListener() {
    
            public void onClick(View v) {
                startRecording(r);
    
            }
        });
    
        end.setOnClickListener(new View.OnClickListener() {
    
            public void onClick(View v) {
                stopRecording(r);
                setPassPrefs();
                startActivity(setPassPrefs());
                finish();
    
            }
        });
    
    }
    
    private void setSurfaceCallback(SurfaceView s, final MediaRecorder r)
    {
    
    
    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
        public void surfaceCreated(SurfaceHolder holder) {
    
            try {
                r.setPreviewDisplay(previewHolder.getSurface());
            } catch (Throwable t) {
                Log.e("PictureDemo-surfaceCallback",
                        "Exception in setPreviewDisplay()", t);
                Toast.makeText(VideoActivity.this, t.getMessage(),
                        Toast.LENGTH_LONG).show();
            }
        }
    
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
    
        }
    
        public void surfaceDestroyed(SurfaceHolder holder) {
            r.stop();
            r.release();
    
        }
    };
    
    previewHolder.addCallback(surfaceCallback); 
    }
    
    private Intent setPassPrefs() {
        AttachedImageAdapter adapter = new AttachedImageAdapter(locationName,
                VideoActivity.this);
        adapter.setVideoPath(filepath);
        Intent i = new Intent(VideoActivity.this, EnterTag.class);
        i.putExtras(getIntent());
        return i;
    
    }
    
    private void startRecording(MediaRecorder r) {
        r.start();
    }
    
    private void stopRecording(MediaRecorder r) {
        r.stop();
    }
    
    private MediaRecorder getMediaRecorder(String filepath, Surface s)
            throws IllegalStateException, IOException {
        MediaRecorder m_recorder = new MediaRecorder();
        m_recorder.setPreviewDisplay(s);
        m_recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        m_recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        m_recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        m_recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        m_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        m_recorder.setMaxDuration(20000); // length of video in MS
        m_recorder.setVideoSize(320, 240);
        m_recorder.setVideoFrameRate(15);
        m_recorder.setOutputFile(video.getPath());
        m_recorder.prepare();
    
        return m_recorder;
    }
    

    }

    如有任何帮助,我们将不胜感激,并再次提前表示感谢。另外,这里是一个 pastebin 具有视频活动引用的布局。

    Here 是我的错误日志的粘贴箱——如果有帮助的话。

    1 回复  |  直到 14 年前
        1
  •  2
  •   vanevery    14 年前

    我能想到两件事:

    1:您的SD卡可能没有安装。

    if (android.os.Environment.getExternalStorageState() != android.os.Environment.MEDIA_MOUNTED) then you have a problem.
    

    2:文件路径中的所有目录都可能不存在。

    filepath = getFilePath(locationName);
    File file = new File(filepath);
    File parentDir = file.getParentFile();
    if (!parentDir.exists())
    {
    parentDir.mkdirs();
    }