Приложение принудительно закрывается при попытке сделать снимок экрана с помощью React Native в WebRTC - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать приложение для совместного использования экрана и использовать Web RT C Но когда я пытаюсь сделать снимок экрана в React Native, я получаю эту ошибку в ADB, и мое приложение сразу закрывается

FATAL EXCEPTION: main Вызвано : java .lang.NullPointerException: попытка вызвать виртуальный метод 'android .media.projection.MediaProjection android .media.projection.MediaProjectionManager.getMediaProjection (int, android .content.Intent)' с нулевым значением ссылка на объект 08-03 10: 48: 08.910 E [21716/21716] AndroidRuntime в org.webrt c .ScreenCapturer Android .startCapture (ScreenCapturer Android. java: 109)

и это Java класс, который я использовал как собственный код

package com.oney.WebRTCModule;


class GetDisplayMediaImpl {
  
    private static final int PERMISSION_REQUEST_CODE = (int) (Math.random() * Short.MAX_VALUE);
 
    private static final String TAG = WebRTCModule.TAG;

    private final ReactApplicationContext reactContext;
    private final WebRTCModule webRTCModule;
    private final ActivityEventListener activityEventListener;

    private Promise promise;
    private Intent mediaProjectionPermissionResultData;

    GetDisplayMediaImpl(WebRTCModule webRTCModule, ReactApplicationContext reactContext) {
        this.webRTCModule = webRTCModule;
        this.reactContext = reactContext;

        this.activityEventListener = new BaseActivityEventListener() {
            @Override
            public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
                super.onActivityResult(activity, requestCode, resultCode, data);
                if (requestCode == PERMISSION_REQUEST_CODE) {
                    if (resultCode != Activity.RESULT_OK) {
                        promise.reject("DOMException", "NotAllowedError");
                        promise = null;
                        return;
                    }

                    mediaProjectionPermissionResultData = data;
                    createStream();
                }
            }
        };

        reactContext.addActivityEventListener(this.activityEventListener);
    }

    public void getDisplayMedia(Promise promise) {
        if (this.promise != null) {
            promise.reject(new RuntimeException("Another operation is pending."));
            return;
        }

        Activity currentActivity = this.reactContext.getCurrentActivity();
        
 

        MediaProjectionManager mediaProjectionManager =
            (MediaProjectionManager) currentActivity.getApplication().getSystemService(
                Context.MEDIA_PROJECTION_SERVICE);
        currentActivity.startActivityForResult(
            mediaProjectionManager.createScreenCaptureIntent(), PERMISSION_REQUEST_CODE);
    }

    private void createStream() {
          MediaStream mediaStream = webRTCModule.mFactory.createLocalMediaStream(streamId);
        VideoTrack track = createTrack();
        mediaStream.addTrack(track);

        WritableMap data = Arguments.createMap();
        data.putString("streamId", streamId);

        WritableMap trackInfo = Arguments.createMap();
        String trackId = track.id();

       
        data.putMap("track", trackInfo);

        webRTCModule.localStreams.put(streamId, mediaStream);
        promise.resolve(data);

        // Cleanup
        mediaProjectionPermissionResultData = null;
        promise = null;
    }

    private VideoTrack createTrack() {
        VideoCapturer capturer
            = new ScreenCapturerAndroid(mediaProjectionPermissionResultData, new MediaProjection.Callback() {
                ....
        });

        PeerConnectionFactory pcFactory = webRTCModule.mFactory;

        VideoSource source = pcFactory.createVideoSource(capturer.isScreencast());
        String id = UUID.randomUUID().toString();

        VideoTrack track = pcFactory.createVideoTrack(id, source);
        track.setEnabled(true);
 
        capturer.startCapture(width, height, fps);

        return track;
    }

    
}

при запуске и при capturer.startCapture (width, height, fps); уволен я получил Т

...