【问题标题】:FileObserver onEvent method not called saving videosFileObserver onEvent 方法未调用保存视频
【发布时间】:2018-06-05 20:32:04
【问题描述】:

我正在使用 MediaRecorder 在我的相机应用中创建视频;在“准备方法”中,我使用recorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 设置输出文件,而getOutputMediaFile 方法如下

private void observeVideo(String mediaFilePath){
    observer = new FileObserver(mediaFilePath, FileObserver.CLOSE_WRITE) {
        @Override
        public void onEvent(int event, String path) {
            stopWatching();
            Toast.makeText(context, path + " saved correctly", Toast.LENGTH_LONG);
        }
    };
    observer.startWatching();
}

private File getOutputMediaFile(int type){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.
    if (!Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
        return  null;
    }

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), "MyCameraApp");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "VID_"+ timeStamp + ".mp4");
        observeVideo(mediaFile.toString());
    } else {
        return null;
    }

    return mediaFile;
}

问题是 onEvent 没有被调用。我检查了我传递给 FileObserver 的(录像的)路径是否为空,但不存在这个问题,并且日志显示了正确的视频路径名。为什么?

【问题讨论】:

  • 您是否拥有所需的权限?如果您在 Android M 上运行,则需要在运行时请求权限。
  • 哪些权限?我的清单具有以下权限:

标签: android video save mediarecorder fileobserver


【解决方案1】:

由于这是要在 google 中显示的最新问题,因此我在此处添加我的输入:

可能的问题1:

给观察者的路径错误,缺少/或者文件不存在

可能的问题2:

缺少对 android.permisison.READ_STORAGE 等路径的授予访问权限,或者未按要求使用 FileProvider

可能的问题3:

android 6 fileObserver bug,它不起作用,唯一的解决方法是做一个循环器,每 X 秒检查一次

【讨论】: