2013-05-05 28 views
6

Tôi đã cố gắng chạy máy ảnh trong nền của dịch vụ. Tôi đã làm theo phương pháp được hiển thị trong How to use Camera to take picture in a background Service on Android?, Taking picture from camera without preview. Đây là những gì tôi đã làmMáy ảnh Android - Đang chạy ẩn từ dịch vụ

ExperimentalControl.java

package com.example.test2; 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 

public class ExperimentControl extends Service 
{ 
    VideoRecorder vRecorder; 

    public ExperimentControl() 
    { 
     Log.i("EXPERIMENT","ExperimentControl started!!!"); 
    } 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 

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

     vRecorder = new VideoRecorder(); 
     vRecorder.startRecording(getApplicationContext()); 

     return START_STICKY; 
    } 

    public void onDestroy() 
    { 
     vRecorder=null; 
    } 

} 

VideoRecorder.java

package com.example.test2; 

import java.io.IOException; 
import android.content.Context; 
import android.hardware.Camera; 
import android.media.MediaRecorder; 
import android.util.Log; 
import android.view.Surface; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class VideoRecorder implements SurfaceHolder.Callback 
{ 
    String videofolder = android.os.Environment.getExternalStorageDirectory()+"/Record/"; 
    private final String VIDEO_PATH_NAME = videofolder+"test.mp4"; 
    private MediaRecorder mMediaRecorder; 
    private Camera mCamera; 
    private SurfaceView mSurfaceView; 
    private SurfaceHolder mHolder; 
    private boolean mInitSuccesful; 

    void startRecording(Context context) 
    { 
     Log.v("Surya2","here"); 
     mSurfaceView = new SurfaceView(context); 
     mHolder = mSurfaceView.getHolder(); 
     mHolder.addCallback(this); 
     mMediaRecorder.start(); 
     try 
     { 
      Thread.sleep(10 * 1000); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     //finish(); 
     Log.v("Surya4","here"); 
    } 

    private void initRecorder(Surface surface) throws IOException 
    { 

     if(mCamera == null) 
     { 
      mCamera = Camera.open(); 
      mCamera.unlock(); 
     } 

     if(mMediaRecorder == null) 
      mMediaRecorder = new MediaRecorder(); 

     mMediaRecorder.setPreviewDisplay(surface); 
     mMediaRecorder.setCamera(mCamera); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
     mMediaRecorder.setVideoEncodingBitRate(512 * 1000); 
     mMediaRecorder.setVideoFrameRate(30); 
     mMediaRecorder.setVideoSize(640, 480); 
     mMediaRecorder.setOutputFile(VIDEO_PATH_NAME); 

     try 
     { 
      mMediaRecorder.prepare(); 
     } 
     catch (IllegalStateException e) 
     { 
      e.printStackTrace(); 
     } 

     mInitSuccesful = true; 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     try 
     { 
      Log.v("Surya3","here"); 

      if(!mInitSuccesful) 
       initRecorder(mHolder.getSurface()); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     shutdown(); 
    } 

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

    private void shutdown() 
    { 
     // Release MediaRecorder and especially the Camera as it's a shared 
     // object that can be used by other applications 
     mMediaRecorder.stop(); 
     mMediaRecorder.reset(); 
     mMediaRecorder.release(); 
     mCamera.release(); 

     // once the objects have been released they can't be reused 
     mMediaRecorder = null; 
     mCamera = null; 
    } 
} 

manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.test2" 
    android:versionCode="1" 
    android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<uses-feature android:name="android.hardware.camera" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <service android:name=".ExperimentControl" /> 
</application> 

</manifest> 

là cách này có đúng không? Và vấn đề chính tôi đang phải đối mặt là điều này doesnot hiển thị bất kỳ lỗi cũng không đăng nhập ouput là coming.So tôi không thể nhận được để xác định những gì gây ra vấn đề nhưng video không được ghi lại. Ai có thể sửa tôi không?

Cảm ơn trước

Trả lời

0

Cố gắng sử dụng Dịch vụ ngữ cảnh để gọi startrecording

vRecorder.startRecording(this); 

Bạn nên tránh sử dụng ApplicationContext để tạo ra quan điểm. Tôi đã nhận được vấn đề tương tự khi tôi đã cố gắng để tạo ra AlertDialog dựa trên ApplicationContext. Không có lỗi nào được hiển thị nhưng hộp thoại hiện đã được hiển thị.

Hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan