Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaRecorder未录制第二次_Android_Android Mediarecorder_Android Mediaprojection - Fatal编程技术网

Android MediaRecorder未录制第二次

Android MediaRecorder未录制第二次,android,android-mediarecorder,android-mediaprojection,Android,Android Mediarecorder,Android Mediaprojection,我正在使用MediaRecorder录制用户屏幕。当应用程序第一次打开,用户点击fab按钮记录屏幕时,一切正常。但是如果应用程序正在运行,用户再次单击“录制”按钮,在我所需的文件路径中不会生成新文件,因此我的listview不会更新 如果我关闭应用程序并再次运行应用程序,则mediarecorder仅在第一次运行时有效。我尝试了许多不同的方法,寻找解决堆栈溢出的方法,但都是徒劳的。我只是无法在第二次单击录制按钮时录制屏幕。我也没有得到任何错误。这是我的密码: public class MainA

我正在使用MediaRecorder录制用户屏幕。当应用程序第一次打开,用户点击fab按钮记录屏幕时,一切正常。但是如果应用程序正在运行,用户再次单击“录制”按钮,在我所需的文件路径中不会生成新文件,因此我的listview不会更新

如果我关闭应用程序并再次运行应用程序,则mediarecorder仅在第一次运行时有效。我尝试了许多不同的方法,寻找解决堆栈溢出的方法,但都是徒劳的。我只是无法在第二次单击录制按钮时录制屏幕。我也没有得到任何错误。这是我的密码:

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";
private static final int DISPLAY_WIDTH = 720;
private static final int DISPLAY_HEIGHT = 1280;
Button btn;
private int screenDensity;
private MediaProjectionManager mediaProjectionManager;
private MediaProjection mediaProjection;
private VirtualDisplay virtualDisplay;
private MediaProjection.Callback mediaProjectionCallback;
private MediaRecorder mediaRecorder;
private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
private boolean isRecording = false;
static SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss");
static String todayDate = dateFormat.format(new Date());

static {
    ORIENTATIONS.append(Surface.ROTATION_0, 90);
    ORIENTATIONS.append(Surface.ROTATION_90, 0);
    ORIENTATIONS.append(Surface.ROTATION_180, 270);
    ORIENTATIONS.append(Surface.ROTATION_270, 180);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String[] PERMISSIONS = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO};

    if (!hasPermissions(this, PERMISSIONS)) {
        ActivityCompat.requestPermissions(this, PERMISSIONS, 1);
    }

    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    screenDensity = displayMetrics.densityDpi;

    mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);

    btn = findViewById(R.id.fab);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            toggleScreenShare();
        }
    });
}

public static boolean hasPermissions(Context context, String... permissions) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

public void recordBtnReload() {
    if (isRecording) {
        btn.setText("Stop");
    } else {
        btn.setText("Record");
    }
}

private void toggleScreenShare() {
    if (!isRecording) {
        initRecorder();
        shareScreen();
    } else {
        mediaRecorder.stop();
        mediaRecorder.reset();
        mediaRecorder.release();
        mediaRecorder = null;
        stopScreenSharing();
    }
}

private void stopScreenSharing() {
    if (virtualDisplay == null) {
        return;
    }
    virtualDisplay.release();
    destroyMediaProjection();
    isRecording = false;
    recordBtnReload();
}

private void destroyMediaProjection() {
    if (mediaProjection != null) {
        mediaProjection.unregisterCallback(mediaProjectionCallback);
        mediaProjection.stop();
        mediaProjection = null;
    }
    Log.i(TAG, "MediaProjection is stopped for now");
}

private void shareScreen() {
    if (mediaProjection == null) {
        startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 1000);
        return;
    }
    virtualDisplay = createVirtualDisplay();
    mediaRecorder.start();
    isRecording = true;
    recordBtnReload();
    Log.i(TAG, "ShareScreen started for now");
}

private void initRecorder() {
    try {
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

        mediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setVideoEncodingBitRate(512 * 1000);
        mediaRecorder.setVideoFrameRate(16);
        mediaRecorder.setVideoEncodingBitRate(3000000);
        String directory = Environment.getExternalStorageDirectory() + File.separator + "NewCapture";
        File folder = new File(directory);
        boolean success = true;
        if (!folder.exists()) {
            success = folder.mkdir();
        }
        String filepath;
        if (success) {
            String videoName = ("Video_" + todayDate + ".mp4");
            filepath = directory + File.separator + videoName;
            Log.i(TAG, "File created");
        } else {
            Toast.makeText(this, "Failed to create Recordings directory", Toast.LENGTH_SHORT).show();
            return;
        }
        mediaRecorder.setOutputFile(filepath);
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        int orientation = ORIENTATIONS.get(rotation + 90);
        mediaRecorder.setOrientationHint(orientation);
        mediaRecorder.prepare();
        Log.i(TAG, "initRecorder");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private VirtualDisplay createVirtualDisplay() {
    Log.i(TAG, "Created Virtual Display");
    return mediaProjection.createVirtualDisplay(TAG, DISPLAY_WIDTH, DISPLAY_HEIGHT, screenDensity,
            DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder.getSurface(), null, null);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode != 1000) {
        Log.e(TAG, "Unknown request code:" + requestCode);
        return;
    }
    if (resultCode != RESULT_OK) {
        Toast.makeText(this, "Permission for screen recording is denied", Toast.LENGTH_LONG).show();
        isRecording = false;
        recordBtnReload();
        return;
    }
    mediaProjectionCallback = new MediaProjection.Callback() {
        @Override
        public void onStop() {
            if (isRecording) {
                isRecording = false;
                recordBtnReload();
                mediaRecorder.stop();
                mediaRecorder.reset();
                mediaRecorder.release();
                mediaRecorder = null;
            }
            mediaProjection = null;
            stopScreenSharing();
        }
    };

    mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
    mediaProjection.registerCallback(mediaProjectionCallback, null);
    virtualDisplay = createVirtualDisplay();
    mediaRecorder.start();
    isRecording = true;
    recordBtnReload();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    destroyMediaProjection();
}
}


我不知道我做错了什么。我还在学习应用程序开发

我的代码中的问题是initRecorder()函数。不使用以下代码创建文件名:

String videoName = ("Video_" + todayDate + ".mp4");
其中,todayDate是一个日期格式化程序。我将代码替换为以下内容:

String videoName = ("Video_" + System.currentTimeMillis() + ".mp4");

这将占用当前系统时间并将其分配到文件名中。现在创建了新文件,我不必每次都重新启动应用程序来记录新文件。

您能提供一个简化示例的完整代码吗?例如,您可以去掉适配器,只记录getData()的结果。目前,当我将您提供的代码复制到一个活动中时,它离可运行状态相差甚远。如果不先做很多工作,我就帮不了你,这样你就不太可能得到答案。查看@Michiyo我在问题中编辑了我的代码。现在,它只有mediarecorder功能,可以将录制的视频保存到存储器中。如果将代码复制到活动中并在清单中添加相关权限,则应用程序应运行。请检查您的文件目录中记录的文件。您将注意到,即使记录了多次,也只创建了一个文件。我必须关闭应用程序并重新启动,才能创建新的录制文件。