2013-05-05 8 views
6

मैं एक सेवा की पृष्ठभूमि में कैमरा चलाने की कोशिश कर रहा हूं। मैंने How to use Camera to take picture in a background Service on Android?, Taking picture from camera without preview में दिखाए गए तरीके का पालन किया है। यह मैंएंड्रॉइड कैमरा - सेवा से पृष्ठभूमि में चल रहा है

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> 

इस तरह से सही है है? और जिस मुख्य समस्या का सामना कर रहा हूं वह यह है कि यह कोई त्रुटि नहीं दिखाता है और न ही लॉग आउटपुट आ रहा है। इसलिए मैं यह पहचानने में असमर्थ हूं कि समस्या का कारण क्या है लेकिन वीडियो रिकॉर्ड नहीं किया गया है। क्या कोई मुझे सही कर सकता है?

अग्रिम

उत्तर

0

कोशिश धन्यवाद सेवा संदर्भ का उपयोग करने के

vRecorder.startRecording(this); 

startrecording आप दृश्य बनाने के लिए ApplicationContext का उपयोग कर से बचना चाहिए कॉल करने के लिए। मुझे इसी तरह की समस्या मिली जब मैंने एप्लिकेशन कॉन्टेक्स्ट पर आधारित अलर्टडियलॉग बनाने की कोशिश की। कोई त्रुटि नहीं दिखायी गई थी लेकिन संवाद अब दिखाया गया था।

उम्मीद है कि यह मदद करता है!

संबंधित मुद्दे