Подтвердить что ты не робот

Запись видео в приложении Android при выключении экрана

То, что я пытаюсь сделать, это сделать приложение, которое может записывать видео или аудио, пока экран выключен. Либо мы начинаем запись, а затем выключаем экран, или рекордер должен запускаться с голосом или любой другой внешней командой. В любом случае приложение должно продолжать запись.

Пожалуйста, предоставьте код.

4b9b3361

Ответ 1

В большинстве случаев, когда что-то нужно делать в автономном режиме, это делается в service.

введите описание изображения здесь (Www.slideshare.net)

Предполагая, что вы не знаете, что такое служба, из документов:

Служба - это прикладной компонент, представляющий либо желание приложения выполнить более длительную работу, пока взаимодействие с пользователем или предоставление функций для других приложений для использования. Каждый класс обслуживания должен иметь соответствующий  объявление в пакете AndroidManifest.xml. Сервисы можно запустить с помощью Context.startService() и Context.bindService().

Итак, в основном, это просто то, что работает в фоновом режиме, в том числе, когда экран выключен. Теперь все, что вам нужно сделать, помещает ваш код записи в службу. У вас может возникнуть проблема, связанная с тем, что ваша служба будет убита системой, как указано в документах android:

Примечание. Это означает, что в большинстве случаев ваша служба работает, она может быть убитым системой, если она находится под сильным давлением памяти. Если это произойдет, система позже попытается перезапустить службу. Важным следствием этого является то, что если вы реализуете onStartCommand(), чтобы планировать работу, выполняемую асинхронно или в другой поток, то вы можете использовать START_FLAG_REDELIVERY, чтобы иметь система повторно доставляет намерение для вас, чтобы оно не терялось если ваша служба убита во время ее обработки.

В этом случае вам нужно будет добавить определенный код, чтобы сохранить службу в переднем плане, и убедитесь, что он не убит:

startForeground();//keeps service from getting destroyed.

Единственная проблема, которую это может обеспечить, - это постоянное уведомление за время, в течение которого служба находится в живых.

Вы также можете использовать startSticky():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

       // We want this service to continue running until it is explicitly
       // stopped, so return sticky.
       return START_STICKY;
}

Теперь, скажем, вы закончили запись. Вы можете использовать:

stopSelf();

чтобы остановить службу, или:

Context.stopService();

Это уведомление не является большой проблемой, потому что экран, скорее всего, выключен во время работы службы. Вы также можете настроить свое уведомление, и пользователю лучше знать, что происходит в фоновом режиме.

Вот пример кода для записи:

public class VideoCapture extends Activity implements OnClickListener, SurfaceHolder.Callback {
    MediaRecorder recorder;
    SurfaceHolder holder;
    boolean recording = false;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        recorder = new MediaRecorder();
        initRecorder();
        setContentView(R.layout.main);

        SurfaceView cameraView = (SurfaceView) findViewById(R.id.CameraView);
        holder = cameraView.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        cameraView.setClickable(true);
        cameraView.setOnClickListener(this);
    }

    private void initRecorder() {
        recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

        CamcorderProfile cpHigh = CamcorderProfile
                .get(CamcorderProfile.QUALITY_HIGH);
        recorder.setProfile(cpHigh);
        recorder.setOutputFile("/sdcard/videocapture_example.mp4");
        recorder.setMaxDuration(50000); // 50 seconds
        recorder.setMaxFileSize(5000000); // Approximately 5 megabytes
    }

    private void prepareRecorder() {
        recorder.setPreviewDisplay(holder.getSurface());

        try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
            finish();
        } catch (IOException e) {
            e.printStackTrace();
            finish();
        }
    }

    public void onClick(View v) {
        if (recording) {
            recorder.stop();
            recording = false;

            // Let initRecorder so we can record again
            initRecorder();
            prepareRecorder();
        } else {
            recording = true;
            recorder.start();
        }
    }

    public void surfaceCreated(SurfaceHolder holder) {
        prepareRecorder();
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        if (recording) {
            recorder.stop();
            recording = false;
        }
        recorder.release();
        finish();
    }
}

(Как записать видеозапись на Android?)

Опять же, поместите этот код в длинную работу переднего плана, как я объяснил ранее.

Если вам нужна дополнительная помощь, не стесняйтесь спрашивать.

~ Ruchir