安卓拍照无用户界面 [英] Android: Take Photo Without User Interface

查看:180
本文介绍了安卓拍照无用户界面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对写作的Andr​​oid的应用程序,其中一个特定的事件,在应用程序后,照片会自动使用相机上的机器人拍摄。

I am interested in writing an app for android where after a certain event in the app a photo is automatically taken using the camera on the android.

我需要的东西:

  • 没有$ P $照片PVIEW

  • No Preview of photo

没有按钮供用户preSS拍照

No Button for User to press to take the photo

只要运行操作拍摄照片并将其存储到相册中。

Just run the operation to take a photo and store it to the album.

下面是一个在线教程约codeI尝试:

here is some code i tried from a tutorial online:

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;
      }

随着它的所作所为的logcat的

along with the logcat of what it 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 going on here, or a better way to accomplish this task?

推荐答案

这是服务拍摄照片的背景下,希望它可以帮助:

This is service to capture photo in background, hope it 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>

调用此在 MainActivity 可拨打服务:

    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);

这篇关于安卓拍照无用户界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆