Android: shooting without a user interface

I’m interested in writing an Android application where, after a certain event, the application automatically takes a photo using the Android camera.

What I need:

  • Photo Preview

  • There is no button for the user to click to take a picture

  • Just start the operation to take a photo and save it in the album.

Here is the code I tried from the online tutorial:

public void snap(){ mCamera = Camera.open(); SurfaceView sv = new SurfaceView(getApplicationContext()); try { mCamera.setPreviewDisplay(sv.getHolder()); parameters = mCamera.getParameters(); //set camera parameters mCamera.setParameters(parameters); mCamera.startPreview(); mCamera.takePicture(null, null, mCall); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //Get a surface sHolder = sv.getHolder(); } Camera.PictureCallback mCall = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { //decode the data obtained by the camera into a Bitmap FileOutputStream outStream = null; try{ outStream = new FileOutputStream("/sdcard/Image.jpg"); outStream.write(data); outStream.close(); } catch (FileNotFoundException e){ Log.d("CAMERA", e.getMessage()); } catch (IOException e){ Log.d("CAMERA", e.getMessage()); } } }; public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } 

along with the logarithm of what he did

  11-24 01:54:37.738: E/AndroidRuntime(6971): FATAL EXCEPTION: main 11-24 01:54:37.738: E/AndroidRuntime(6971): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.udptest/com.example.udptest.Main}: java.lang.RuntimeException: takePicture failed 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.os.Handler.dispatchMessage(Handler.java:99) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.os.Looper.loop(Looper.java:137) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.main(ActivityThread.java:5227) 11-24 01:54:37.738: E/AndroidRuntime(6971): at java.lang.reflect.Method.invokeNative(Native Method) 11-24 01:54:37.738: E/AndroidRuntime(6971): at java.lang.reflect.Method.invoke(Method.java:511) 11-24 01:54:37.738: E/AndroidRuntime(6971): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 11-24 01:54:37.738: E/AndroidRuntime(6971): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 11-24 01:54:37.738: E/AndroidRuntime(6971): at dalvik.system.NativeStart.main(Native Method) 11-24 01:54:37.738: E/AndroidRuntime(6971): Caused by: java.lang.RuntimeException: takePicture failed 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.hardware.Camera.native_takePicture(Native Method) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.hardware.Camera.takePicture(Camera.java:1101) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.hardware.Camera.takePicture(Camera.java:1046) 11-24 01:54:37.738: E/AndroidRuntime(6971): at com.example.udptest.Main.snap(Main.java:129) 11-24 01:54:37.738: E/AndroidRuntime(6971): at com.example.udptest.Main.onCreate(Main.java:84) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.Activity.performCreate(Activity.java:5104) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262) 11-24 01:54:37.738: E/AndroidRuntime(6971): ... 11 more 

Any ideas what might be here, or the best way to complete this task?

+7
java android android-camera
source share
4 answers

This is a service to capture a photo in the background, hope this helps:

 public class CapPhoto extends Service { private SurfaceHolder sHolder; private Camera mCamera; private Parameters parameters; @Override public void onCreate() { super.onCreate(); Log.d("CAM", "start"); if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);} Thread myThread = null; } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); if (Camera.getNumberOfCameras() >= 2) { mCamera = Camera.open(CameraInfo.CAMERA_FACING_FRONT); } if (Camera.getNumberOfCameras() < 2) { mCamera = Camera.open(); } SurfaceView sv = new SurfaceView(getApplicationContext()); try { mCamera.setPreviewDisplay(sv.getHolder()); parameters = mCamera.getParameters(); mCamera.setParameters(parameters); mCamera.startPreview(); mCamera.takePicture(null, null, mCall); } catch (IOException e) { e.printStackTrace(); } sHolder = sv.getHolder(); sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } Camera.PictureCallback mCall = new Camera.PictureCallback() { public void onPictureTaken(final byte[] data, Camera camera) { FileOutputStream outStream = null; try{ File sd = new File(Environment.getExternalStorageDirectory(), "A"); if(!sd.exists()) { sd.mkdirs(); Log.i("FO", "folder" + Environment.getExternalStorageDirectory()); } Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); String tar = (sdf.format(cal.getTime())); outStream = new FileOutputStream(sd+tar+".jpg"); outStream.write(data); outStream.close(); Log.i("CAM", data.length + " byte written to:"+sd+tar+".jpg"); camkapa(sHolder); } catch (FileNotFoundException e){ Log.d("CAM", e.getMessage()); } catch (IOException e){ Log.d("CAM", e.getMessage()); }} }; @Override public IBinder onBind(Intent intent) { return null; } public void camkapa(SurfaceHolder sHolder) { if (null == mCamera) return; mCamera.stopPreview(); mCamera.release(); mCamera = null; Log.i("CAM", " closed"); } } 

AndroidManifest.xml

 <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-feature android:name="android.hardware.camera" /> <service android:name=".CapPhoto" android:enabled="true"> <intent-filter> </intent-filter> </service> 

Call MainActivity to call:

  Intent service; .... Calendar cal = Calendar.getInstance(); service = new Intent(getBaseContext(), CapPhoto.class); cal.add(Calendar.SECOND, 15); //TAKE PHOTO EVERY 15 SECONDS PendingIntent pintent = PendingIntent.getService(this, 0, service, 0); AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 60*60*1000, pintent); startService(service); 
+3
source share

A few tips:

  • First of all, do not specify the path to the file with the hard code. Your / sdcard may not exist at all, so your outStream will be empty and it will fail when you call any method from outStream. Instead, use Environment.getExternalStoragePublicDirectory or Environment.getExternalStorageDirectory (for devices with Android version 2.2). See. Here

  • there is no photo preview - you can make your preview 1 pixel x 1 pixel in size, so it will be barely noticeable

  • you need to declare permissions in AndroidManifest:

    "android.permission.CAMERA" and "android.permission.WRITE_EXTERNAL_STORAGE" (if you want to save photos)

I suggest you go through an example in the form of documents and experiment.

+1
source share

This guide describes how to create a camera application. Hope this helps you. http://developer.android.com/guide/topics/media/camera.html#custom-camera

0
source share

Maybe you could get a service?

0
source share

All Articles