2011-12-15 8 views
0

問題が発生しました。複数の写真を撮ると、私の活動は反応しません。時には最初のものを取ってもANRの問題があります。どうしてか分かりません。私はDEVガイドに従ってコードを書いています。ここに私のコードは次のとおりです。複数の写真を撮影中にアクティビティが応答しない

public class CameraActivity extends Activity implements SurfaceHolder.Callback,OnClickListener,AutoFocusCallback{ 

    private Button takeShot,goBack; 
    private SurfaceView surfaceView; 
    private SurfaceHolder holder; 
    private Camera camera; 

    private ArrayList<String> pictures; 

    private PictureDAO pdao; 
    public static final int PICTURE_OK=1554; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.camera); 
     pdao=new PictureDAO(this); 
     initComponent(); 
    } 

    private void initComponent(){ 
     surfaceView=(SurfaceView)findViewById(R.id.cameraView); 
     holder=surfaceView.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     takeShot=(Button)findViewById(R.id.lets_take_it); 
     goBack=(Button)findViewById(R.id.back_to_tab3_button); 
     takeShot.setOnClickListener(this); 
     goBack.setOnClickListener(this); 
    } 
    /** 
    * set camera parameters 
    */ 
    private void setCameraParameters(){ 
     Parameters para=camera.getParameters(); 
     para.setPictureFormat(ImageFormat.JPEG); 
     Size preSize=para.getSupportedPreviewSizes().get(para.getSupportedPreviewSizes().size()-1); 

     para.setPreviewSize(preSize.width, preSize.height); 
     Size picSize=para.getSupportedPictureSizes().get(0); 
     para.setPictureSize(picSize.width, picSize.height); 

     camera.setParameters(para); 
     camera.setDisplayOrientation(90); 
    } 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     camera=Camera.open(); 
     setCameraParameters(); 
     try { 
      camera.setPreviewDisplay(holder); 
     } catch (Exception e) { 
      LogUtil.log(e.getMessage()); 
      LogUtil.log(e.getLocalizedMessage()); 
      e.printStackTrace(); 
     } 
     camera.startPreview(); 
     camera.autoFocus(this); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     releaseCamera(); 
    } 

    private void releaseCamera(){ 
     if(camera!=null){ 
      camera.stopPreview(); 
      camera.release(); 
      camera=null; 
     } 
    } 


    private void ICatchU(){ 

     camera.takePicture(null, null, new PictureCallback() { 

      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 

       camera.stopPreview(); 

       Bitmap map =BitmapFactory.decodeByteArray(data, 0, data.length); 
       String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
       File picPath=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"whycools"+File.separator+"picture"+File.separator+DateUtil.getFormattedDate(DateUtil.JUST_DATE)+File.separator+timeStamp+".jpg"); 
       try { 
        picPath.getParentFile().mkdirs(); 
        picPath.createNewFile(); 
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(picPath)); 
        map.compress(CompressFormat.JPEG, 80, bos);   
        pdao.insertPic(new PictureInfo(picPath.getAbsolutePath(), timeStamp)); 
        if(pictures==null){ 
         pictures=new ArrayList<String>(); 
        } 
        System.out.println(picPath.getAbsolutePath()); 

        pictures.add(picPath.getAbsolutePath()); 
        bos.flush(); 
        bos.close(); 

       } catch (Exception e) { 
        System.out.println(e.getLocalizedMessage()); 
        LogUtil.log(e.getMessage()); 
        LogUtil.log(e.getLocalizedMessage()); 
        e.printStackTrace(); 
       } 

       camera.startPreview(); 

      } 
     }); 

    } 


    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if(keyCode==KeyEvent.KEYCODE_BACK){ 
      releaseCamera(); 
      Intent n=new Intent(this,Tab3Activity.class); 
      n.putStringArrayListExtra("picData", pictures); 
      n.putExtra("shot_time", DateUtil.getFormattedDate(DateUtil.DATE_AND_MINUTE)); 
      this.setResult(PICTURE_OK, n); 
      this.finish(); 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

    @Override 
    public void onClick(View v) { 
     int id=v.getId(); 
     switch (id) { 
     case R.id.lets_take_it:ICatchU();break; 
     case R.id.back_to_tab3_button:{ 
      releaseCamera(); 
      Intent n=new Intent(this,Tab3Activity.class); 
      n.putStringArrayListExtra("picData", pictures); 
      n.putExtra("shot_time", DateUtil.getFormattedDate(DateUtil.DATE_AND_MINUTE)); 
      this.setResult(PICTURE_OK, n); 
      this.finish(); 
     };break; 
     } 
    } 


    private void showToastMessage(String msg){ 
     Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onAutoFocus(boolean success, Camera camera) { 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if(pdao!=null){ 
      pdao.close(); 
      pdao=null; 
     } 
    } 


} 

----- pid 200 at 2011-12-16 08:38:45 ----- 
Cmd line: com.google.process.gapps 

DALVIK THREADS: 
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0) 
"main" prio=5 tid=1 NATIVE 
    | group="main" sCount=1 dsCount=0 obj=0x4001f1a8 self=0xce48 
    | sysTid=200 nice=0 sched=0/0 cgrp=default handle=-1345006528 
    | schedstat=(545418989 6032995440 141) 
    at android.os.BinderProxy.transact(Native Method) 
    at android.os.IPowerManager$Stub$Proxy.acquireWakeLock(IPowerManager.java:276) 
    at android.os.PowerManager$WakeLock.acquire(PowerManager.java:253) 
    at com.google.android.gsf.checkin.CheckinService.launchService(CheckinService.java:167) 
    at com.google.android.gsf.checkin.CheckinService.access$000(CheckinService.java:64) 
    at com.google.android.gsf.checkin.CheckinService$Receiver.onReceive(CheckinService.java:101) 
    at android.app.ActivityThread.handleReceiver(ActivityThread.java:1794) 
    at android.app.ActivityThread.access$2400(ActivityThread.java:117) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:981) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method) 

"[email protected]@4050cad0" daemon prio=5 tid=9 WAIT 
    | group="main" sCount=1 dsCount=0 obj=0x4055a8f0 self=0x8c270 
    | sysTid=220 nice=0 sched=0/0 cgrp=default handle=1013376 
    | schedstat=(1148267 89253041 3) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x4054f928> (a java.lang.ref.ReferenceQueue) 
    at java.lang.Object.wait(Object.java:395) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:107) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:80) 
    at org.apache.http.impl.conn.tsccm.RefQueueWorker.run(RefQueueWorker.java:102) 
    at java.lang.Thread.run(Thread.java:1019) 

"Binder Thread #2" prio=5 tid=8 NATIVE 
    | group="main" sCount=1 dsCount=0 obj=0x40511c08 self=0x1ba2a0 
    | sysTid=213 nice=0 sched=0/0 cgrp=default handle=1717752 
    | schedstat=(9471974 67681837 3) 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #1" prio=5 tid=7 NATIVE 
    | group="main" sCount=1 dsCount=0 obj=0x40511b40 self=0x185d30 
    | sysTid=212 nice=0 sched=0/0 cgrp=default handle=1717688 
    | schedstat=(20164408 44832613 4) 
    at dalvik.system.NativeStart.run(Native Method) 

"Compiler" daemon prio=5 tid=6 VMWAIT 
    | group="system" sCount=1 dsCount=0 obj=0x4050edf8 self=0x185bf8 
    | sysTid=211 nice=0 sched=0/0 cgrp=default handle=971936 
    | schedstat=(37893754 117636767 45) 
    at dalvik.system.NativeStart.run(Native Method) 

"JDWP" daemon prio=5 tid=5 VMWAIT 
    | group="system" sCount=1 dsCount=0 obj=0x4050ed10 self=0x1a33f8 
    | sysTid=210 nice=0 sched=0/0 cgrp=default handle=1597960 
    | schedstat=(15809388 276306241 17) 
    at dalvik.system.NativeStart.run(Native Method) 

"Signal Catcher" daemon prio=5 tid=4 RUNNABLE 
    | group="system" sCount=0 dsCount=0 obj=0x4050ec50 self=0x186018 
    | sysTid=203 nice=0 sched=0/0 cgrp=default handle=588480 
    | schedstat=(20070264 129928190 4) 
    at dalvik.system.NativeStart.run(Native Method) 

"GC" daemon prio=5 tid=3 VMWAIT 
    | group="system" sCount=1 dsCount=0 obj=0x4050eba8 self=0x186f58 
    | sysTid=202 nice=0 sched=0/0 cgrp=default handle=588416 
    | schedstat=(112148122 1039499175 25) 
    at dalvik.system.NativeStart.run(Native Method) 

"HeapWorker" daemon prio=5 tid=2 VMWAIT 
    | group="system" sCount=1 dsCount=0 obj=0x4050eaf0 self=0x142738 
    | sysTid=201 nice=0 sched=0/0 cgrp=default handle=588352 
    | schedstat=(105047309 2012821363 24) 
    at dalvik.system.NativeStart.run(Native Method) 

----- end 200 ----- 
+0

ANRが発生すると、そのデータは 'data'フォルダの' traces.txt'というファイルに書き込まれます。このファイルの内容を質問に追加してください。また、なぜANRが起きるのかを理解するには、[この投稿](http://stackoverflow.com/questions/704311/android-how-do-i-investigate-an-anr)を参照してください。 – THelper

+0

申し訳ありませんが、私はちょうどコードの下に私のアプリのトレースを掲載しました。 – Joey

答えて

0

UIをロック避けるために、あなたのonClick()を通します。

+0

これはあなたを助けましたか?もしそうなら、それを答えにすることができますか? – d3n13d1

関連する問題