2013-11-24 18 views
7

Android'de bir fotoğraf otomatik olarak kameradan çekilen bir uygulamadan sonra, android için bir uygulama yazmak istiyorum.Android: Kullanıcı Arabirimi Olmadan Fotoğraf Çek

şeyler ihtiyacım var: Fotoğrafın

  • Önizleme Yok

  • yok Düğmesi Kullanıcı fotoğraf çekmek ve saklamak Sadece işlemi çalıştırmak fotoğrafını

  • almak basın için albüme Burada

i öğretici Çevrimiçindeki çalıştı bazı kodudur: Burada çıkabilirimama ne
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 

Herhangi fikirler

yaptıklarının LogCat birlikte

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

veya Bu görevi gerçekleştirmek için daha iyi bir yol?

+0

Eğer baz öğretici lütfen paylaşabilir misiniz? –

cevap

0

Belki bunu yapmak için bir hizmet alabilirsiniz?

1

Birkaç ipucu: Her şeyden

  • Birincisi, dosya yollarını hardcode yoktur./Sdcardınız hiç mevcut olmayabilir, bu yüzden outStream'iniz boş olacaktır ve outStream'den herhangi bir yöntemi çağırdığınızda çökecektir. Bunun yerine, Environment.getExternalStoragePublicDirectory veya Environment.getExternalStorageDirectory kullanın (Android sürüm < 2.2 olan aygıtlar için). here

  • hiçbir fotoğraf önizleme bakın - sen boyutunda Önizleme 1pixel x 1pixel yapabilirsiniz, bu yüzden sen AndroidManifest izinleri beyan gerekir

  • zorlukla görünür olacaktır:

    "android. permission.CAMERA" ve "android.permission.WRITE_EXTERNAL_STORAGE"(Eğer resim kaydetmek istiyorsanız)

example'dan dokümanlar ve denemeler oluşturmanızı öneririm.

3

Bu, arka planda fotoğraf çekmeleri hizmet olduğunu yardımcı olur .:

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 umuyoruz.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> 

Çağrı Bu MainActivity çağırma hizmeti:

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

Bu kodu kontrol ettim, gereken minimum SDK 24, SDK 21 için herhangi bir olasılık var. – Gowthaman

İlgili konular