2013-11-24 24 views
7

Tôi quan tâm đến việc viết một ứng dụng cho Android, nơi sau một sự kiện nhất định trong ứng dụng, ảnh sẽ tự động được chụp bằng camera trên Android.Android: Chụp ảnh không có giao diện người dùng

Mọi thứ tôi cần:

  • Không Xem trước ảnh

  • Không Nút cho tài để báo chí chụp ảnh

  • Chỉ cần chạy các hoạt động để chụp ảnh và lưu nó vào album.

đây là một số mã tôi đã cố gắng từ một hướng dẫn trực tuyến:

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

cùng với logcat của những gì nó đã làm

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 

ý tưởng Bất kỳ những gì có thể xảy ra ở đây, hoặc một cách tốt hơn để hoàn thành nhiệm vụ này?

+0

bạn có thể chia sẻ những hướng dẫn cơ sở xin vui lòng? –

Trả lời

0

Có thể bạn có thể sử dụng dịch vụ để làm điều đó?

1

Vài lời khuyên:

  • Trước hết, không hardcode đường dẫn tập tin./Sdcard của bạn có thể không tồn tại ở tất cả, do đó, outStream của bạn sẽ được null, và nó sẽ sụp đổ khi bạn gọi bất kỳ phương pháp từ outStream. Thay vào đó, hãy sử dụng Environment.getExternalStoragePublicDirectory hoặc Environment.getExternalStorageDirectory (đối với thiết bị có phiên bản Android < 2.2). Xem here

  • no photo preview - bạn có thể làm cho xem trước 1pixel x 1pixel của bạn về kích thước, vì vậy nó sẽ hiếm khi nhìn thấy

  • bạn cần phải khai báo các điều khoản trong AndroidManifest:

    "Android. permission.CAMERA "và" android.permission.WRITE_EXTERNAL_STORAGE "(nếu bạn muốn lưu ảnh)

Tôi khuyên bạn nên xem qua các mẫu tài liệu và thử nghiệm example.

3

Đây là dịch vụ để chụp ảnh ở chế độ nền, hy vọng nó sẽ giúp .:

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> 

Gọi này phục vụ trong bạn MainActivity gọi:

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

Tôi đã kiểm tra mã này, SDK tối thiểu cần thiết là 24, có khả năng nào để sử dụng cho SDK 21 hay không. – Gowthaman

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