2012-04-12 6 views
57

Я разрабатываю приложение, которое сможет записывать видео с фона приложения с помощью Service.Как записывать видео с фона приложения: Android

Описание проблемы:

В моей записи приложения будет планироваться. Если пользователь хочет записать видео с 1 вечера до 3 часов вечера, он заплатит задание и может выйти из приложения. Приложение автоматически начнет запись с 1:00 до 3 вечера.

То, что я сделал еще:

Я гугл моего запроса, но не получить решение. Многие статьи говорят, что это невозможно. Но в Google Play есть некоторые приложения (например, MyCar Recorder), которые могут записывать видео с фона приложения.

У меня есть article примерно такой же, но его не работает.

Что такое способ реализации этой функции?

+2

им тоже интересно знать это. По-видимому, это возможно: https://play.google.com/store/apps/details?id=com.zeronoiseapps.secretvideorecorderpro&hl=ru – Ian

+0

Пробовал ли вы образец проекта на сайте статьи? https://github.com/pickerweng/CameraRecorder –

+0

Din't пытался раньше. но кажется, что пользователь должен каждый раз приступать к приложению, а затем начинает запись с фона. Я прав? Я попробую этот код в ближайшее время. Спасибо. –

ответ

5

Да, вы можете записать фоновое видео, как это:

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

Во-вторых, вы можете использовать AlarmManager для установки будильника определенного времени, а затем в это время, используя намерение, снова запустите свой сервис. Для остановки приложения вы также можете использовать AlarmManager.

+0

можете ли вы привести какой-нибудь пример? –

+0

Вы уже создали приложение, которое может записывать видео? – Rahul

+0

Да .... вот почему я спрашиваю. –

44

1- я создал деятельность, чтобы начать службу, как это:

package com.android.camerarecorder; 

import android.app.Activity; 
import android.content.Intent; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 

public class CameraRecorder extends Activity implements SurfaceHolder.Callback { 
    private static final String TAG = "Recorder"; 
    public static SurfaceView mSurfaceView; 
    public static SurfaceHolder mSurfaceHolder; 
    public static Camera mCamera ; 
    public static boolean mPreviewRunning; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView1); 
     mSurfaceHolder = mSurfaceView.getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     Button btnStart = (Button) findViewById(R.id.StartService); 
     btnStart.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       Intent intent = new Intent(CameraRecorder.this, RecorderService.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startService(intent); 
       finish(); 
      } 
     }); 

     Button btnStop = (Button) findViewById(R.id.StopService); 
     btnStop.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       stopService(new Intent(CameraRecorder.this, RecorderService.class)); 
      } 
     }); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

    } 

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

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 
} 

2 - Теперь я создал сервиса для записи видео в фоновом режиме так:

package com.android.camerarecorder; 
    import java.io.IOException; 
    import java.util.List; 
    import android.app.Service; 
    import android.content.Intent; 
    import android.graphics.PixelFormat; 
    import android.hardware.Camera; 
    import android.hardware.Camera.Size; 
    import android.media.MediaRecorder; 
    import android.os.IBinder; 
    import android.util.Log; 
    import android.view.SurfaceHolder; 
    import android.view.SurfaceView; 
    import android.widget.Toast; 

    public class RecorderService extends Service { 
     private static final String TAG = "RecorderService"; 
     private SurfaceView mSurfaceView; 
     private SurfaceHolder mSurfaceHolder; 
     private static Camera mServiceCamera; 
     private boolean mRecordingStatus; 
     private MediaRecorder mMediaRecorder; 

     @Override 
     public void onCreate() { 
      mRecordingStatus = false; 
      //mServiceCamera = CameraRecorder.mCamera; 
      mServiceCamera = Camera.open(1); 
      mSurfaceView = CameraRecorder.mSurfaceView; 
      mSurfaceHolder = CameraRecorder.mSurfaceHolder; 

      super.onCreate(); 
      if (mRecordingStatus == false) 
       startRecording(); 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public void onDestroy() { 
      stopRecording(); 
      mRecordingStatus = false; 

      super.onDestroy(); 
     } 

     public boolean startRecording(){ 
      try { 
       Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show(); 

       //mServiceCamera = Camera.open(); 
       Camera.Parameters params = mServiceCamera.getParameters(); 
       mServiceCamera.setParameters(params); 
       Camera.Parameters p = mServiceCamera.getParameters(); 

       final List<Size> listSize = p.getSupportedPreviewSizes(); 
       Size mPreviewSize = listSize.get(2); 
       Log.v(TAG, "use: width = " + mPreviewSize.width 
          + " height = " + mPreviewSize.height); 
       p.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
       p.setPreviewFormat(PixelFormat.YCbCr_420_SP); 
       mServiceCamera.setParameters(p); 

       try { 
        mServiceCamera.setPreviewDisplay(mSurfaceHolder); 
        mServiceCamera.startPreview(); 
       } 
       catch (IOException e) { 
        Log.e(TAG, e.getMessage()); 
        e.printStackTrace(); 
       } 

       mServiceCamera.unlock(); 

       mMediaRecorder = new MediaRecorder(); 
       mMediaRecorder.setCamera(mServiceCamera); 
       mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
       mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
       mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
       mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
       mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
       mMediaRecorder.setOutputFile("/sdcard/video.mp4"); 
       mMediaRecorder.setVideoFrameRate(30); 
       mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height); 
       mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 

       mMediaRecorder.prepare(); 
       mMediaRecorder.start(); 

       mRecordingStatus = true; 

       return true; 
      } catch (IllegalStateException e) { 
       Log.d(TAG, e.getMessage()); 
       e.printStackTrace(); 
       return false; 
      } catch (IOException e) { 
       Log.d(TAG, e.getMessage()); 
       e.printStackTrace(); 
       return false; 
      } 
     } 

     public void stopRecording() { 
      Toast.makeText(getBaseContext(), "Recording Stopped", Toast.LENGTH_SHORT).show(); 
      try { 
       mServiceCamera.reconnect(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      mMediaRecorder.stop(); 
      mMediaRecorder.reset(); 

      mServiceCamera.stopPreview(); 
      mMediaRecorder.release(); 

      mServiceCamera.release(); 
      mServiceCamera = null; 
     } 
    } 

Он создаст файл video.mp4 на вашей SD-карте. вы можете изменить код для добавления дополнительных функций, но основные функции достигаются с помощью этого кода, то есть записывайте видео в фоновом режиме.

Примечание: я начал службу с помощью кнопки мыши в деятельности, но вы можете запустить его через любой другой способ также как BroadcastReceiver и т.д.

Надеется, что это помогает !! Приветствия.

+1

Итак, он продолжит писать видео, когда я скрою приложение, не так ли? – Anastasia

+1

Но где волшебство? Вы просто используете рекордер камеры в сервисе. Я думал, что должно быть что-то более загадочное. ;) Да, я скоро дам +50. – Anastasia

+2

Я хотел бы сыграть свой медиапланер на сервисе и поместить его на задний план. Возможно ли, что ans может предложить мне несколько примеров. – AndroidOptimist

Смежные вопросы