首页 文章

屏幕录制:停止失败和失败传递结果ResultInfo

提问于
浏览
0

我无法成功进行屏幕录制,它开始录制好但是当它停止应用程序崩溃时

错误:

E / MediaRecorder:停止失败:-1007 D / AndroidRuntime:关闭VM E / AndroidRuntime:FATAL EXCEPTION:main进程:com.confusedbox.screenrecorder,PID:6314 java.lang.RuntimeException:传递结果失败ResultInfo {who = null ,request = 1000,result = -1,data = Intent {(has extras)}} to activity {com.confusedbox.screenrecorder / com.confusedbox.screenrecorder.ScreenRecord}:java.lang.RuntimeException:stop failed . 在android.app.ActivityThread.deliverResults(ActivityThread.java:3706)的android.app.ActivityThread.handleSendResult(ActivityThread.java:3749)android.app.ActivityThread.access $ 1400(ActivityThread.java:153)android.app .ActivityThread $ H.handleMessage(ActivityThread.java:1400)在android.app.Loper.loop(Looper.java:148)的android.app.A.运行时,在Android.app.A.运行 . main(ActivityThread.java:5441)位于com.android.internal的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:738)的java.lang.reflect.Method.invoke(Native Method) . os.ZygoteInit.main(ZygoteInit.java:628)引起:java.lang.RuntimeException:停止失败 . 位于android.app.A活动上的android.app.上的com.confusedbox.screenrecorder.ScreenRecord.onActivityResult(ScreenRecord.java:48)的android.app.MediaRecorder.stop(本地方法) . 活动.ActivityThread(Activity.java:6508) .deliverResults(ActivityThread.java:3702)位于android.app.ActivityThread.access $ 1400(ActivityThread.java:153)android.app.ActivityThread $ H.handleMessage的android.app.ActivityThread.handleSendResult(ActivityThread.java:3749) (ActivityThread.java:1400)android.app.Handler.dispatchMessage(Handler.java:102)android.app.Looper.loop(Looper.java:148)android.app.ActivityThread.main(ActivityThread.java: 5441)位于com.android.internal.os.ZygoteInit.main的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:738)的java.lang.reflect.Method.invoke(Native Method) ZygoteInit.java:628)

public class ScreenRecord extends AppCompatActivity {

    MediaRecorder mr;
    MediaProjection mp;
    int dw = 720;
    int dh = 1280;
    MediaProjectionManager mpm;
    DisplayMetrics metrics;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mr = new MediaRecorder();
        initRecorder();
        mpm = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        startActivityForResult(mpm.createScreenCaptureIntent(), 1000);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        mp = mpm.getMediaProjection(resultCode, data);
        mp.createVirtualDisplay(getClass().getName(), dw, dh, metrics.densityDpi,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mr.getSurface(), 
                null, null);
        mr.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        mr.stop();
    }

    private void initRecorder() {
        try {
            mr.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mr.setOutputFile(Environment
                    .getExternalStoragePublicDirectory(Environment
                            .DIRECTORY_DOWNLOADS) + "/video.mp4");
            mr.setVideoSize(dw, dh);
            mr.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mr.setVideoEncodingBitRate(12 * 1000 * 1000);
            mr.setVideoFrameRate(60);
            mr.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Android 6(棉花糖)

1 回答

  • 0

    在确定录制已实际开始后,将 stop() 移动到其他位置 . 我的猜测是 start() 在您将主应用程序线程的控制权返回给Android之后的某个时间才生效 .

相关问题